- // ==UserScript==
- // @name Scroll to Bottom, Stay Button, and Auto-Reload with Persistence and Icons for reddit-stream.com
- // @namespace typpi.online
- // @version 2.14
- // @description Adds a floating button to scroll to the bottom, checkboxes to stay at the bottom, and to reload the page every 10, 15, 20, or 30 seconds on reddit-stream.com, with persistent settings and icons for clarity.
- // @author Nick2bad4u
- // @match *://*.reddit-stream.com/*
- // @connect reddit-stream.com
- // @grant GM_xmlhttpRequest
- // @license Unlicense
- // @resource https://www.google.com/s2/favicons?sz=64&domain=reddit-stream.com
- // @icon https://www.google.com/s2/favicons?sz=64&domain=reddit-stream.com
- // @icon64 https://www.google.com/s2/favicons?sz=64&domain=reddit-stream.com
- // @tag reddit
- // ==/UserScript==
-
- (function () {
- 'use strict';
-
- console.log(
- 'Script initialized: Adding floating button, checkboxes, and persistence.',
- );
-
- // Helper function for hover effect
- function handleHover(element) {
- element.addEventListener('mouseover', function () {
- element.style.opacity = '1';
- });
- element.addEventListener('mouseout', function () {
- element.style.opacity = '0.1';
- });
- console.log(`Hover effect applied to element: ${element}`);
- }
-
- // Function to save checkbox state
- function saveCheckboxState(key, value) {
- localStorage.setItem(key, value);
- console.log(`Saved checkbox state for ${key}: ${value}`);
- }
-
- // Function to load checkbox state
- function loadCheckboxState(key) {
- const state = localStorage.getItem(key) === 'true';
- console.log(`Loaded checkbox state for ${key}: ${state}`);
- return state;
- }
-
- // Styling for the checkboxes with hover title support for icons
- function styleCheckboxWrapper(wrapper, iconText, checkboxId, titleText) {
- wrapper.style.display = 'flex';
- wrapper.style.flexDirection = 'column';
- wrapper.style.alignItems = 'center';
- wrapper.style.position = 'fixed';
- wrapper.style.bottom = '20px';
- wrapper.style.zIndex = '1000';
- wrapper.style.cursor = 'pointer';
- wrapper.style.opacity = '0.1';
- wrapper.style.transition = 'opacity 0.3s';
-
- const label = document.createElement('label');
- label.htmlFor = checkboxId;
- label.style.cursor = 'pointer';
-
- const icon = document.createElement('div');
- icon.innerHTML = iconText;
- icon.style.fontSize = '12px';
- icon.style.color = 'orange';
- icon.style.marginTop = '5px';
- icon.title = titleText;
-
- label.appendChild(icon);
- wrapper.appendChild(label);
- handleHover(wrapper);
-
- console.log(
- `Checkbox wrapper styled with icon: ${iconText} and title: ${titleText}`,
- );
- }
-
- // Scroll-to-bottom button
- const button = document.createElement('button');
- button.innerHTML = '⬇️';
- button.style.position = 'fixed';
- button.style.bottom = '20px';
- button.style.right = '20px'; // Changed from left to right
- button.style.zIndex = '1000';
- button.style.padding = '10px';
- button.style.borderRadius = '50%';
- button.style.border = 'none';
- button.style.backgroundColor = 'black';
- button.style.color = 'blue';
- button.style.fontSize = '20px';
- button.style.cursor = 'pointer';
- button.style.opacity = '0.5';
- button.style.transition = 'opacity 0.3s';
- button.title = 'Click to scroll to the bottom';
- handleHover(button);
-
- button.addEventListener('click', function () {
- globalThis.scrollTo({
- top: document.body.scrollHeight,
- behavior: 'smooth',
- });
- console.log('Scroll-to-bottom button clicked, scrolling to the bottom.');
- });
-
- // Stay-at-bottom checkbox with icon
- const stayAtBottomWrapper = document.createElement('div');
- stayAtBottomWrapper.style.right = '60px'; // Changed from left to right
- const stayAtBottomCheckboxId = 'stayAtBottomCheckbox';
- styleCheckboxWrapper(
- stayAtBottomWrapper,
- '🔽',
- stayAtBottomCheckboxId,
- 'Check to stay at the bottom',
- );
-
- const stayAtBottomCheckbox = document.createElement('input');
- stayAtBottomCheckbox.type = 'checkbox';
- stayAtBottomCheckbox.id = stayAtBottomCheckboxId;
- stayAtBottomCheckbox.checked = loadCheckboxState('stayAtBottom');
- stayAtBottomCheckbox.title = 'Check to stay at the bottom';
- stayAtBottomWrapper.insertBefore(
- stayAtBottomCheckbox,
- stayAtBottomWrapper.firstChild,
- );
-
- stayAtBottomCheckbox.addEventListener('change', function () {
- saveCheckboxState('stayAtBottom', stayAtBottomCheckbox.checked);
- });
-
- let scrollTimeout;
- const debounce = (fn, delay) => {
- return function () {
- clearTimeout(scrollTimeout);
- scrollTimeout = setTimeout(fn, delay);
- };
- };
-
- const keepAtBottom = debounce(function () {
- if (stayAtBottomCheckbox.checked) {
- globalThis.scrollTo({
- top: document.body.scrollHeight,
- behavior: 'smooth',
- });
- console.log('Auto-scrolling to the bottom (Stay at Bottom active).');
- } else {
- console.log('Auto-scrolling stopped (Stay at Bottom inactive).');
- }
- }, 200);
-
- const observer = new MutationObserver(keepAtBottom);
- observer.observe(document.body, {
- childList: true,
- subtree: true,
- });
- console.log('MutationObserver started for staying at the bottom.');
-
- // Auto-reload every 10 seconds checkbox with icon
- const autoReload10Wrapper = document.createElement('div');
- autoReload10Wrapper.style.right = '100px'; // Changed from left to right
- const autoReload10CheckboxId = 'autoReload10Checkbox';
- styleCheckboxWrapper(
- autoReload10Wrapper,
- '10s',
- autoReload10CheckboxId,
- 'Check to reload every 10 seconds',
- );
-
- const autoReload10Checkbox = document.createElement('input');
- autoReload10Checkbox.type = 'checkbox';
- autoReload10Checkbox.id = autoReload10CheckboxId;
- autoReload10Checkbox.checked = loadCheckboxState('autoReload10');
- autoReload10Checkbox.title = 'Check to reload every 10 seconds';
- autoReload10Wrapper.insertBefore(
- autoReload10Checkbox,
- autoReload10Wrapper.firstChild,
- );
-
- let reloadInterval10;
-
- function startAutoReload10() {
- reloadInterval10 = setInterval(() => {
- globalThis.location.reload();
- console.log('Page reloading every 10 seconds.');
- }, 10000);
- }
-
- if (autoReload10Checkbox.checked) startAutoReload10();
-
- autoReload10Checkbox.addEventListener('change', function () {
- saveCheckboxState('autoReload10', autoReload10Checkbox.checked);
- if (autoReload10Checkbox.checked) {
- startAutoReload10();
- } else {
- clearInterval(reloadInterval10);
- console.log('Stopped reloading every 10 seconds.');
- }
- });
-
- // Auto-reload every 15 seconds checkbox with icon
- const autoReload15Wrapper = document.createElement('div');
- autoReload15Wrapper.style.right = '140px'; // Changed from left to right
- const autoReload15CheckboxId = 'autoReload15Checkbox';
- styleCheckboxWrapper(
- autoReload15Wrapper,
- '15s',
- autoReload15CheckboxId,
- 'Check to reload every 15 seconds',
- );
-
- const autoReload15Checkbox = document.createElement('input');
- autoReload15Checkbox.type = 'checkbox';
- autoReload15Checkbox.id = autoReload15CheckboxId;
- autoReload15Checkbox.checked = loadCheckboxState('autoReload15');
- autoReload15Checkbox.title = 'Check to reload every 15 seconds';
- autoReload15Wrapper.insertBefore(
- autoReload15Checkbox,
- autoReload15Wrapper.firstChild,
- );
-
- let reloadInterval15;
-
- function startAutoReload15() {
- reloadInterval15 = setInterval(() => {
- globalThis.location.reload();
- console.log('Page reloading every 15 seconds.');
- }, 15000);
- }
-
- if (autoReload15Checkbox.checked) startAutoReload15();
-
- autoReload15Checkbox.addEventListener('change', function () {
- saveCheckboxState('autoReload15', autoReload15Checkbox.checked);
- if (autoReload15Checkbox.checked) {
- startAutoReload15();
- } else {
- clearInterval(reloadInterval15);
- console.log('Stopped reloading every 15 seconds.');
- }
- });
-
- // Auto-reload every 20 seconds checkbox with icon
- const autoReload20Wrapper = document.createElement('div');
- autoReload20Wrapper.style.right = '180px'; // Changed from left to right
- const autoReload20CheckboxId = 'autoReload20Checkbox';
- styleCheckboxWrapper(
- autoReload20Wrapper,
- '20s',
- autoReload20CheckboxId,
- 'Check to reload every 20 seconds',
- );
-
- const autoReload20Checkbox = document.createElement('input');
- autoReload20Checkbox.type = 'checkbox';
- autoReload20Checkbox.id = autoReload20CheckboxId;
- autoReload20Checkbox.checked = loadCheckboxState('autoReload20');
- autoReload20Checkbox.title = 'Check to reload every 20 seconds';
- autoReload20Wrapper.insertBefore(
- autoReload20Checkbox,
- autoReload20Wrapper.firstChild,
- );
-
- let reloadInterval20;
-
- function startAutoReload20() {
- reloadInterval20 = setInterval(() => {
- globalThis.location.reload();
- console.log('Page reloading every 20 seconds.');
- }, 20000);
- }
-
- if (autoReload20Checkbox.checked) startAutoReload20();
-
- autoReload20Checkbox.addEventListener('change', function () {
- saveCheckboxState('autoReload20', autoReload20Checkbox.checked);
- if (autoReload20Checkbox.checked) {
- startAutoReload20();
- } else {
- clearInterval(reloadInterval20);
- console.log('Stopped reloading every 20 seconds.');
- }
- });
-
- // Auto-reload every 30 seconds checkbox with icon
- const autoReload30Wrapper = document.createElement('div');
- autoReload30Wrapper.style.right = '220px'; // Changed from left to right
- const autoReload30CheckboxId = 'autoReload30Checkbox';
- styleCheckboxWrapper(
- autoReload30Wrapper,
- '30s',
- autoReload30CheckboxId,
- 'Check to reload every 30 seconds',
- );
-
- const autoReload30Checkbox = document.createElement('input');
- autoReload30Checkbox.type = 'checkbox';
- autoReload30Checkbox.id = autoReload30CheckboxId;
- autoReload30Checkbox.checked = loadCheckboxState('autoReload30');
- autoReload30Checkbox.title = 'Check to reload every 30 seconds';
- autoReload30Wrapper.insertBefore(
- autoReload30Checkbox,
- autoReload30Wrapper.firstChild,
- );
-
- let reloadInterval30;
-
- function startAutoReload30() {
- reloadInterval30 = setInterval(() => {
- globalThis.location.reload();
- console.log('Page reloading every 30 seconds.');
- }, 30000);
- }
-
- if (autoReload30Checkbox.checked) startAutoReload30();
-
- autoReload30Checkbox.addEventListener('change', function () {
- saveCheckboxState('autoReload30', autoReload30Checkbox.checked);
- if (autoReload30Checkbox.checked) {
- startAutoReload30();
- } else {
- clearInterval(reloadInterval30);
- console.log('Stopped reloading every 30 seconds.');
- }
- });
-
- // Append elements to the page
- document.body.appendChild(button);
- document.body.appendChild(stayAtBottomWrapper);
- document.body.appendChild(autoReload10Wrapper);
- document.body.appendChild(autoReload15Wrapper);
- document.body.appendChild(autoReload20Wrapper);
- document.body.appendChild(autoReload30Wrapper);
- console.log('All elements appended with styling and icons.');
- })();