// ==UserScript== // @name Chapter Changer + Smooth Scroller // @namespace https://greasyfork.org/en/users/55535-sllypper // @version 0.6 // @description And insta-scrolling for Mangakakalot & Manganelo // @author sllypper // @match https://mangakakalot.com/chapter/* // @match https://manganelo.com/chapter/* // @grant none // @downloadURL none // ==/UserScript== (function() { 'use strict'; let scrollAmount = 32; let scrollFreq = 16; let shiftSpeedMod = 2; const states = { NONE: 0, UP: 1, SHIFTUP: 2, DOWN: 3, SHIFTDOWN: 4 } let scrollState = states.NONE; let currScrollAction = null; let buttons = document.getElementsByClassName('navi-change-chapter-btn'); if (buttons.length === 0) { buttons = document.getElementsByClassName('btn-navigation-chap'); if (buttons.length === 0) return; } buttons = buttons[0].childNodes; let prevButton = buttons[0]; let nextButton = buttons[buttons.length-1]; // if there's only one button if (buttons.length != 2) { // check if it's the next button // mangakakalot has "back" and "next" button classes are switched around if (buttons[0].classList.contains("back") || buttons[0].classList.contains("navi-change-chapter-btn-next")) { // then we're in chapter 1 and there's no prev button prevButton = null; } else { // else we're in the last chapter and there's no next button nextButton = null; } } document.addEventListener("keydown", event => { if (event.code === "KeyW" || event.code === "KeyK") { if (scrollState !== states.UP && !event.shiftKey) { clearScrollAction(); scrollState = states.UP; scrollAction(-scrollAmount, scrollFreq); } else if (scrollState !== states.SHIFTUP && event.shiftKey) { clearScrollAction(); scrollState = states.SHIFTUP; scrollAction(-scrollAmount*shiftSpeedMod, scrollFreq); } } else if (event.code === "KeyS" || event.code === "KeyJ") { if (scrollState !== states.DOWN && !event.shiftKey) { clearScrollAction(); scrollState = states.DOWN; scrollAction(scrollAmount, scrollFreq); } else if (scrollState !== states.SHIFTDOWN && event.shiftKey) { clearScrollAction(); scrollState = states.SHIFTDOWN; scrollAction(scrollAmount*shiftSpeedMod, scrollFreq); } } else if (event.code === "KeyC" && nextButton != null) { nextButton.click(); } else if (event.code === "KeyZ" && prevButton != null) { prevButton.click(); } }); document.addEventListener("keyup", event => { if (event.code === "KeyW" || event.code === "KeyK") { clearScrollAction(); } else if (event.code === "KeyS" || event.code === "KeyJ") { clearScrollAction(); } else if (event.key === "Shift") { clearScrollAction(); } }); function scrollAction(amount, freq) { currScrollAction = setInterval(() => { window.scrollBy(0, amount); }, freq) } function clearScrollAction() { clearInterval(currScrollAction); currScrollAction = null; scrollState = states.NONE; } })();