Skip to content

Instantly share code, notes, and snippets.

@Kurotaku-sama
Last active July 4, 2024 15:44
Show Gist options
  • Save Kurotaku-sama/5c67a635ae4f8ee09bd88748ad99ebdc to your computer and use it in GitHub Desktop.
Save Kurotaku-sama/5c67a635ae4f8ee09bd88748ad99ebdc to your computer and use it in GitHub Desktop.
// ==UserScript==
// @name givee.club improvements
// @name:de givee.club Verbesserungen
// @namespace https://kurotaku.de
// @version 1.2.6
// @description A script for some improvements for givee.club
// @description:de Ein Skript für einige Verbesserungen für givee.club
// @author Kurotaku
// @license MIT
// @match https://givee.club/*
// @icon https://givee.club/favicon.ico
// @updateURL https://gist.github.com/Kurotaku-sama/5c67a635ae4f8ee09bd88748ad99ebdc/raw/givee.club%2520improvement.user.js
// @downloadURL https://gist.github.com/Kurotaku-sama/5c67a635ae4f8ee09bd88748ad99ebdc/raw/givee.club%2520improvement.user.js
// @require https://gist.github.com/Kurotaku-sama/9ebeb659500f6eee2f780344948e1e8f/raw/kuros_library.user.js
// @require https://openuserjs.org/src/libs/sizzle/GM_config.js
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_registerMenuCommand
// ==/UserScript==
let loc = window.location.href;
(async function() {
await init_gm_config(); // Initialize the configuration
if(GM_config.get("script_enabled")) { // Check if the script is disabled in config
loc = window.location.href;
if(GM_config.get("hide_ads"))
hide_ads();
if(!loc.includes("/event/")) {
if(GM_config.get("hide_items_from_list_by_default"))
toggle_hidden_itemlist();
if(GM_config.get("hide_item_buttons"))
hide_item_buttons();
}
if(loc.includes("/event/")) {
insert_giveaway_draw_time();
insert_task_buttons();
}
}
})();
function init_gm_config() {
GM_registerMenuCommand('Configuration', () => {
GM_config.open();
});
let frame = document.createElement('div');
document.body.appendChild(frame);
GM_config.init(
{
'id': 'configuration',
'title': 'givee.club improvements',
'fields':
{
'companion':
{
'label': 'Install Giveaway Companion (Recommended)',
'type': 'button',
'size': 100,
'click': function() {
window.open("https://raw.githubusercontent.com/longnull/GiveawayCompanion/master/GiveawayCompanion.user.js", '_blank');
}
},
'script_enabled':
{
'label': 'Enable/Disable all improvements',
'type': 'checkbox',
'default': true
},
'hide_ads':
{
'label': 'Hide sponsored content',
'type': 'checkbox',
'default': true
},
'items_to_hide':
{
'label': 'Hide items by name<br>(each item name must be written in a new line)',
'type': 'textarea',
'default': ''
},
'hide_items_from_list_by_default':
{
'label': 'Hide items by default',
'type': 'checkbox',
'default': true
},
'hide_item_buttons':
{
'label': 'Button in top right corner for qick hide',
'type': 'checkbox',
'default': true
},
},
'frame': frame,
'css': '#configuration {height:auto !important; width:auto !important; padding:20px !important;max-height: 600px !important;max-width:500px !important; border: 3px solid #fff !important; background-color: #020923; color:#fff} #configuration .config_header {font-size:17pt; font-weight:bold} #configuration .config_var {margin-top:10px; display: flex;} #configuration_buttons_holder {text-align: center;} #configuration #configuration_resetLink {color:#fff;} .config_var input[type="checkbox"] {order:-1; margin: 0 10px 0 0} #configuration #configuration_items_to_hide_var {display : block;} #configuration_field_items_to_hide {height: 150px; width: 100%; resize: none;background-color: #020923; color:#fff}'
});
}
function hide_ads() {
let elements = document.querySelectorAll(".definetelynotanad");
for(let i = 0; i < elements.length; i++) {
if(elements[i].parentElement.attributes.class.value === "col-md-4 col-sm-6")
elements[i].parentElement.remove();
else
elements[i].remove();
}
}
function hide_item_buttons() {
let items = document.querySelectorAll(".event-card");
let eye_button = `<div class="eye-slash-container"><div class="eye slash"><div></div><div></div></div></div>`;
items.forEach((item) => {
item.parentNode.insertAdjacentHTML('afterbegin', eye_button);
item.parentNode.querySelector(".eye-slash-container").addEventListener("click", add_to_hidden, false);
});
}
function add_to_hidden(event) {
let item = event.target; // Get the item
while(item.classList.value !== "col-md-4 col-sm-6") // Go up till you reach the item
item = item.parentNode;
let add_to_hidden_button = item.querySelector(".eye-slash-container");
add_to_hidden_button.remove(); // Remove the button
let href_and_title = get_event_href_and_title(item);
GM_config.set("items_to_hide", get_prepared_items_to_hide(href_and_title)); // Override old list
if(GM_config.get("hide_items_from_list_by_default"))
item.classList.add("gray-out-item");
// let hide_itemlist_enabled = document.querySelector("#toggle-hide-itemlist").checked;
// if(hide_itemlist_enabled)
// item.classList.add("hide-item");
GM_config.save();
}
function get_event_href_and_title(event) {
return `${event.querySelector(".event-card").pathname} - ${event.querySelector(".event-title .vertical-align-middle").innerText}`;
}
function get_event_href(event) {
return `${event.querySelector(".event-card").pathname}`;
}
function get_prepared_items_to_hide(new_title = null) {
let items_to_hide = GM_config.get("items_to_hide");
if(new_title) // Add new item title if exist
items_to_hide += `\n${new_title.trim()}`;
items_to_hide = items_to_hide.replace(/^\s*$(?:\r\n?|\n)/gm, ""); // Remove blank lines
items_to_hide = trim_spaces(items_to_hide); // Remove Spaces
items_to_hide = sort_alphabetically(items_to_hide); // Sort alphabetical
return items_to_hide;
}
function toggle_hidden_itemlist() {
let hidden_items = get_hidden_items_array();
let events = document.querySelectorAll("#event-active .col-md-4.col-sm-6"); // Get all items in store
events.forEach(function(event) {
if(event.querySelector(".definetelynotanad") === null) {
let href = get_event_href(event);
if(hidden_items.includes(href)) {
event.classList.toggle("hide-item");
}
}
})
}
function get_hidden_items_array() {
let hidden_items = GM_config.get("items_to_hide").split("\n");
hidden_items = hidden_items.map(function (el) {return el.split(" - ")[0].trim();}); // Trim away the spaces
hidden_items = hidden_items.filter((el) => el !== ""); // Remove all empty lines (shouldn't happen anymore, but safe is safe)
return hidden_items;
}
function insert_giveaway_draw_time() {
let countdown = document.querySelector(".event-countdown");
if(countdown) {
let time = new Date();
let time_left = parseInt(countdown.getAttribute("data-timeleft"));
time.setSeconds(time.getSeconds() + time_left);
countdown.insertAdjacentHTML('afterend', `<div style="font-size:18px;margin-top:20px;">Giveaway will be drawn on: <span style="font-weight:bold">${format_date_time(time)}</span></div>`);
}
}
function format_date_time(time) {
let date = time.getDate() >= 10 ? time.getDate() : '0'+time.getDate();
let month = time.getMonth() >= 10 ? time.getMonth() : '0'+time.getMonth();
let full_year = time.getFullYear();
let hours = time.getHours() >= 10 ? time.getHours() : '0'+time.getHours();
let minutes = time.getMinutes() >= 10 ? time.getMinutes() : '0'+time.getMinutes();
let formated_date = `${date}.${month}.${full_year} - ${hours}:${(minutes)}`;
return formated_date
}
function insert_task_buttons() {
let destination = document.querySelector(".actions-submit");
let button = "<button type='button' class='btn btn-success btn-sm' id='k-do-tasks' disabled>Do Tasks</button>&nbsp;<button type='button' class='btn btn-success btn-sm' id='k-check-tasks'>Check Tasks</button>";
if(destination) {
destination.innerHTML = button + destination.innerHTML;
document.getElementById("k-do-tasks").addEventListener ("click", do_tasks, false);
document.getElementById("k-check-tasks").addEventListener ("click", check_tasks, false);
}
}
function do_tasks() {
let elements = document.querySelectorAll(".event-actions table tr:not(.hidden)");
for (var i = 0; i < elements.length; i++) {
let element = elements[i];
let type = "";
let label = element.querySelector(".event-action-label").innerHTML;
if(label.includes("Confirm account email")) type = "Confirm account email";
else if(label.includes("profile level")) type = "profile level";
else if(label.includes("Wishlist")) type = "Wishlist Game";
else if(label.includes("Join")) type = "Join Group";
if(type == "Confirm account email" || type == "profile level") {
// do nothing
}
else if(type == "Wishlist Game") {
if(!element.querySelector("button").disabled) {
let appid = element.querySelector(".event-action-label a").getAttribute('data-steam-wishlist-appid');
//addToWishlist(appid);
window.open("https://store.steampowered.com/app/" + appid);
}
}
else if(type == "Join Group") {
if(!element.querySelector("button").disabled) {
element.querySelector(".event-action-label a").click();
}
}
}
}
function check_tasks(element) {
let elements = document.querySelectorAll(".event-actions table tr:not(.hidden)");
for (var i = 0; i < elements.length; i++) {
let element = elements[i];
element.querySelector("button").click();
}
document.querySelector("#k-do-tasks").disabled = false;
}
// EXPERIMENTAL DOESNT WORK
//await getSessionId("https://store.steampowered.com/app/2173600");
// async function getSessionId(url) {
// let response = await GM_xmlhttpRequest({
// method: 'GET',
// url: url,
// timeout: 5000
// });
// console.log(response);
// const sessionId = response.responseText.match(/g_sessionID\s*=\s*"(.+?)"/);
// if (!sessionId) {
// console.log("Steam session ID not found");
// return false;
// }
// return sessionId[1];
// }
// async function addToWishlist(appId) {
// const sessionId = await getSessionId(`https://store.steampowered.com/app/${appId}/`);
// if (!sessionId) {
// console.log("Steam login error");
// return false;
// }
// const response = await GM_xmlhttpRequest({
// method: 'POST',
// url:"https://store.steampowered.com/api/addtowishlist",
// headers: {
// 'Content-Type': 'application/x-www-form-urlencoded',
// 'Referer': `https://store.steampowered.com/app/${appId}/`,
// 'X-Requested-With': 'XMLHttpRequest'
// },
// data: {sessionid: sessionId, appid: appId}
// });
// return true;
// }
// Add custom styles
let styles = `
/** Eye Slash **/
.eye-slash-container {
position: absolute;
right: 0;
padding: 10px;
height: 40px;
width: 40px;
}
.eye-slash-container:hover {
cursor: pointer;
}
.eye{
width:1.25em;
height:0.75em;
position:absolute;
display:inline-block;
--background:#aaa;
--color:currentColor;
}
.eye div{
overflow:hidden;
height:50%;
position:relative;
margin-bottom:-1px;
}
.eye div:before{
content:'';
background:currentColor;
position:absolute;
left:0;
right:0;
height:300%;
border-radius:100%;
}
.eye div:last-child:before{
bottom:0;
}
.eye:before{
content:'';
position:absolute;
top:50%;
left:50%;
transform:translate(-50%, -50%);
width:0.35em;
height:0.35em;
background:var(--color);
border:0.1em solid var(--background);
border-radius:100%;
z-index:1;
}
.eye:after{
content:'';
position:absolute;
top:-0.15em;
left:calc(33.333% - 0.15em);
transform:rotate(45deg) scaleX(0);
transform-origin:left center;
width:90%;
height:0.1em;
background:var(--color);
border-top:0.1em solid var(--background);
z-index:2;
transition:transform 0.25s;
}
.eye.slash:after{
transform:rotate(45deg) scaleX(1);
}
.gray-out-item {filter: saturate(0%)}
.hide-item {display: none !important}`;
// Insert custom Styles
let style_sheet = document.createElement("style");
style_sheet.innerText = styles;
document.head.appendChild(style_sheet);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment