您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Fap Gauntlet for BetterFap
// ==UserScript== // @name BetterFap - Fap Gauntlet // @author Goog // @description Fap Gauntlet for BetterFap // @namespace https://aint-got-none.fap/ // @include https://test.betterfap.com/* // @include https://betterfap.com/* // @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js // @require http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js // @grant unsafeWindow // @version 0.56 // ==/UserScript== // Change/Add/Remove masturbation styles here var masturbationStyle = [ 'Normal Grip', 'Inverse Grip', 'Only Down-Strokes', 'Only Up-Strokes', //'Palm Circles', 'Squeeze', 'Top half only', 'Bottom half only', //'spin' ]; var gripStrength = [ 'Loose', 'Normal', 'Tight' //'inverse', //'normal' ]; // Change/Add/Remove speeds as you like var fapsPerSec = [ 0.1, 0.2, 0.33, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5 ]; // Change/Add/Remove dildo styles here var dildoStyle = [ 'Rub outside', 'Prod', 'Normal Thrusts', 'Deep thrusts', 'All the way' ]; // Strict speeds with a dildo didn't make sense to me // so add any speeds you'd like with a dildo here var dildoSpeed = [ 'Slow', 'Moderate', 'Fast' ]; // Below is non-user-friendly stuff. // Don't touch it if you dont want the script to break! var FGisON = false; var firstStart = true; var isPlaying = false; var currViewObj = null; var lines = 0; var currFPS = 0; var denialMode = false; var dildoMode = false; var canCum = false; var canCumNext = false; var canCumPrev = false; var currIntensity = null; var currDilInt = null; var currDilSpeed = null; var randTime = 1000; var changedNormally = null; var dildoStuff = []; var handsOffMode = false; var visualGuideMode = false; var autoOverride = false; var currCurve; var buttonsHidden = false; var cumText; // Don't touch this. var visualCurve = [ 'linear', 'ease', 'ease-in', 'ease-in-out', 'ease-out' ]; var context = new AudioContext(); var o = context.createOscillator(); o.type = "sawtooth"; o.connect(context.destination); o.frequency.value = 0; function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } function getRandomFPS() { // check bottom of script if you want to see the depths of autism //return cleanGauss(generateGaussianNoise(3 ,2)); var rand = getRandomInt(0, fapsPerSec.length - 1); return fapsPerSec[rand]; } function getCumState() { // 1 in 7 chance to be allowed to cum if (getRandomInt(1, 7) == 1) { //if (getRandomInt(1, 3) == 1) { canCum = canCumNext; canCumNext = true; } else { canCum = canCumNext; canCumNext = false; } return canCum; } function getCumText() { if (canCum === true) { cumText = "You can cum."; } else { cumText = "Do not cum."; } return cumText; } function getRandomIntensity() { var rand = getRandomInt(1, 75); var x = 2000; return masturbationStyle[getRandomInt(0, masturbationStyle.length - 1)]; } function getRandTime(randFPS) { return getRandomInt(1, 4) * 10; } function getDildoSpeed() { var rand = getRandomInt(0, 2); return dildoSpeed[rand]; } function getdildoStyle() { var rand = getRandomInt(0, 4); return dildoStyle[rand]; } function getGripStrength(style) { var rand = getRandomInt(0, gripStrength.length - 1); if (style == 'Palm Circles') { return ""; } return gripStrength[rand]; } function getVisualCurve() { var rand = getRandomInt(0, visualCurve.length - 1); return visualCurve[rand]; } function sleep(milliseconds) { var start = new Date().getTime(); for (var i = 0; i < 1e7; i++) { if ((new Date().getTime() - start) > milliseconds) { break; } } } function getNewFapData(lastInten, lastFPS) { // sets the next image's fap data i = 0; currIntensity = getRandomIntensity(); currFPS = getRandomFPS(); randTime = getRandTime(currFPS) + 1; //randTime = 7; getCumState(); currDilInt = getdildoStyle(); currDilSpeed = getDildoSpeed(); currCurve = getVisualCurve(); currGripStrength = getGripStrength(currIntensity); // it's fucking hard to maintain a feather-light touch four or five times a second, so let's not. if (((currFPS >= 4) && currIntensity == 'Inverse Grip') || ((currFPS >= 4) && currIntensity == 'Squeeze') || ((currFPS > 3) && currIntensity == 'Palm Circles') || ((currFPS > 3) && currIntensity == 'Only Up-Strokes') || ((currFPS > 3) && currIntensity == 'Only Down-Strokes') ) { do { currIntensity = getRandomIntensity(); currFPS = getRandomFPS(); currGripStrength = getGripStrength(currIntensity); } while (((currFPS >= 4) && currIntensity == 'Inverse Grip') || ((currFPS >= 4) && currIntensity == 'Squeeze') || ((currFPS > 3) && currIntensity == 'Palm Circles') || ((currFPS > 3) && currIntensity == 'Only Up-Strokes') || ((currFPS > 3) && currIntensity == 'Only Down-Strokes')); } if (isPlaying) { o.frequency.value = currFPS; } if (visualGuideMode) { if (currFPS < 2) { $("#VisualGuide")[0].style.animation = "play 0s infinite " + currCurve; $("#VisualGuide")[0].style.animation = "play " + (1 / currFPS) + "s infinite " + currCurve; } else { $("#VisualGuide")[0].style.animation = "play 0s infinite " + currCurve; $("#VisualGuide")[0].style.animation = "play " + (1 / currFPS) + "s infinite linear"; } } } function remakeDialog() { $("#FapDialog")[0].style.display = "block"; document.querySelector('div[id="FapDialog"]').innerHTML = "Starting..."; if (remakeDialog.interval) { clearInterval(remakeDialog.interval); } // set the first image's length, faps per sec, etc i = 0; currIntensity = getRandomIntensity(); currFPS = getRandomFPS(); randTime = getRandTime(currFPS); // every randtime after this has +1 so that the numbers show as multiples of ten on the first stroke instead of 10x + 9 which was annoying my autism greatly //randTime = 7; getCumState(); currDilInt = getdildoStyle(); currDilSpeed = getDildoSpeed(); currCurve = getVisualCurve(); currGripStrength = getGripStrength(currIntensity); // it's fucking hard to maintain a feather-light touch four or five times a second, so let's not. if (((currFPS >= 4) && currIntensity == 'Inverse Grip') || ((currFPS >= 4) && currIntensity == 'Squeeze') || ((currFPS > 3) && currIntensity == 'Palm Circles') || ((currFPS > 3) && currIntensity == 'Only Up-Strokes') || ((currFPS > 3) && currIntensity == 'Only Down-Strokes') ) { do { currIntensity = getRandomIntensity(); currFPS = getRandomFPS(); } while (((currFPS >= 4) && currIntensity == 'Inverse Grip') || ((currFPS >= 4) && currIntensity == 'Squeeze') || ((currFPS > 3) && currIntensity == 'Palm Circles') || ((currFPS > 3) && currIntensity == 'Only Up-Strokes') || ((currFPS > 3) && currIntensity == 'Only Down-Strokes')); } if (isPlaying) { // if the user has the audio helper enabled, change it to match current FPS o.frequency.value = currFPS; } if (visualGuideMode) { $("#VisualGuide")[0].style.display = "block"; $("#VisualGuide")[0].style.animation = "play " + (1 / currFPS) + "s infinite " + currCurve; } currViewObj = unsafeWindow.AppState.viewing; remakeDialog.interval = setInterval( function oneSecTimer() { if (handsOffMode && !canCum) { document.querySelector('div[id="FapDialog"]').innerHTML = "Hands Off, " + (randTime - i); } else if (handsOffMode && canCum) { document.querySelector('div[id="FapDialog"]').innerHTML = "Hands Off, " + (randTime - i) + "<br> You could have cum."; } else if (denialMode === false && dildoMode === false) { document.querySelector('div[id="FapDialog"]').innerHTML = currIntensity + ", " + currGripStrength + "<br />" + currFPS + "/sec, " + (randTime - i); } else if (denialMode === true && dildoMode === false) { document.querySelector('div[id="FapDialog"]').innerHTML = currIntensity + ", " + currGripStrength + "<br />" + currFPS + "/sec, " + (randTime - i) + "<br />" + getCumText(); } else if (denialMode === false && dildoMode === true) { document.querySelector('div[id="FapDialog"]').innerHTML = currDilInt + "<br />" + currDilSpeed + ", " + (randTime - i); } else if (denialMode === true && dildoMode === true) { document.querySelector('div[id="FapDialog"]').innerHTML = currDilInt + "<br />" + currDilSpeed + ", " + (randTime - i) + "<br />" + getCumText(); } //if (visualGuideMode) //document.querySelector('div[id="FapDialog"]').innerHTML = document.querySelector('div[id="FapDialog"]').innerHTML + "<br />" + currCurve; if ((randTime - i <= 1) && !(autoOverride)) { // aka if the time ticked down normally to 0, go to next image and get new fap data handsOffMode = false; //document.querySelector('div[id="errordiv"]').innerHTML += "<br/> "+ (lines++) + " t doesnt work right, <br />fav to rec breaks when start on fav or ue<br />thinks changed every slide"; getNewFapData(currIntensity, currFPS); //****next image function**** var $ = unsafeWindow.jQuery; window.top.postMessage({ action: 'next', cr: $.cookie().cr }, window.top.location.protocol + window.top.location.host); if (denialMode) { logit("now:" + canCum + " next:" + canCumNext); if (canCumNext && !canCum) { logit("switched to favs"); window.top.postMessage({ action: 'mode', mode: 'favorites', sort: 'rand', cr: $.cookie().cr }, window.top.location.protocol + window.top.location.host); } else if (!canCum && !canCumNext) { try { logit("switched to recs"); window.top.postMessage({ action: 'mode', mode: 'recommend', cr: $.cookie().cr }, window.top.location.protocol + window.top.location.host); unsafeWindow.AppState.tab.clear(); } catch (error) { logit(error); } } } //**** changedNormally = true; setTimeout(function () { currViewObj = unsafeWindow.AppState.viewing; }, 1000); } else if ((currViewObj != unsafeWindow.AppState.viewing) && (!(changedNormally) && !(handsOffMode))) { // if the user skipped their current image (or hit backspace or the image changed literally at all) currViewObj = unsafeWindow.AppState.viewing; //getNewFapData(currIntensity, currFPS); //document.querySelector('div[id="errordiv"]').innerHTML += "<br/> "+ (lines++) + " thought it was changed!"; } else if (autoOverride && randTime - i <= 1) { getNewFapData(currIntensity, currFPS); } i = i + 1; if (i > 2) { changedNormally = false; } }, 1000); } function redrawOptions() { $("div#tippy-top").first().append('<div class="view-item-container" id="embed-container-copy" style="width: 200px; height: 300px, position: relative;">'); $("div#tippy-top").first().append('<div id="FapDialog" style="font-size:400%; color: #00FF00"></div>'); $("#embed-container-copy").append('<div id="dropdown" style="font-size:100%; color: white; width: 100px; position: fixed; left: -20px; top: 50px; z-index:81000 !important">▼ Hide</div>'); $("#embed-container-copy").append('<div id="ToggleAutoAdvance" style="font-size:120%; color: white; width: 200px; position: fixed; left: -10px; top: 100px; z-index:81000 !important">Disable Auto-Advance</div>'); $("#embed-container-copy").append('<div id="ToggleFG" style="font-size:120%; color: white; width: 200px; position: fixed; left: -10px; top: 70px; z-index:81000 !important">Enable Fap Gauntlet</div>'); $("#embed-container-copy").append('<div id="ToggleDenial" style="font-size:120%; color: white; width: 200px; position: fixed; left: -10px; top: 190px; z-index:81000 !important">Enable Denial Mode</div>'); $("#embed-container-copy").append('<div id="ToggleVG" style="font-size:120%; color: white; width: 200px; position: fixed; left: -10px; top: 130px; z-index:81000 !important">Enable Visual Guide</div>'); $("#embed-container-copy").append('<div id="ToggleDildo" style="font-size:120%; color: white; width: 200px; position: fixed; left: -10px; top: 220px; z-index:81000 !important">Enable Dildo Mode</div>'); $("#embed-container-copy").append('<div id="ToggleAH" style="font-size:120%; color: white; width: 200px; position: fixed; left: -10px; top: 160px; z-index:81000 !important">Enable Audio Helper</div>'); $("#embed-container-copy").append('<div id="errordiv" style="font-size:100%; display:inline; color: white; width: 400px; position: fixed; right: -20px; top: 50px; z-index:81000 !important">ErrorLog:</div>'); var visualguide = document.createElement('div'); visualguide.innerHTML = '<div id="VisualGuide"></div>'; $("#embed-container-copy")[0].appendChild(visualguide); var topBar = document.getElementsByClassName("top-bar-center top-bar-interact")[1]; var edgedDiv = document.createElement('div'); edgedDiv.innerHTML = ""; edgedDiv.zIndex = 81000; edgedDiv.id = "EdgedButton"; edgedDiv.style.width = "auto"; edgedDiv.style.alignSelf = "left"; topBar.prepend(edgedDiv); $("#VisualGuide")[0].style.backgroundImage = "url('https://www.dropbox.com/s/b4s8lyqexgg4app/sprite.png?raw=1')"; $("#VisualGuide")[0].style.height = "600px"; $("#VisualGuide")[0].style.width = "50px"; $("#VisualGuide")[0].style.position = "fixed"; $("#VisualGuide")[0].style.left = "10px"; $("#VisualGuide")[0].style.top = "250px"; $("#VisualGuide")[0].style.zIndex = "81000"; $("#VisualGuide")[0].style.animation = "play 0s infinite linear"; $("#VisualGuide")[0].style.display = "none"; var style = document.createElement('style'); style.type = 'text/css'; var keyFrames = '\ @keyframes play {\ 100% {\ background-position: 100%;\ }\ }'; style.innerHTML = keyFrames; //.replace(/A_DYNAMIC_VALUE/g, "180deg"); document.getElementsByTagName('head')[0].appendChild(style); //--- Activate the dialog. $("#FapDialog")[0].style.position = "fixed"; $("#FapDialog")[0].style.left = "200px"; $("#FapDialog")[0].style.top = "50px"; $("#FapDialog")[0].style.zIndex = "80000"; $("#ToggleAutoAdvance")[0].style.zIndex = "81000"; $("#ToggleAutoAdvance")[0].style.cursor = "pointer"; $("#ToggleFG")[0].style.cursor = "pointer"; $("#ToggleAH")[0].style.cursor = "pointer"; $("#ToggleVG")[0].style.cursor = "pointer"; $("#ToggleDenial")[0].style.cursor = "pointer"; $("#ToggleDildo")[0].style.cursor = "pointer"; $("#EdgedButton")[0].style.cursor = "pointer"; $("#dropdown")[0].style.cursor = "pointer"; } function logit(st) { document.querySelector('div[id="errordiv"]').innerHTML += "<br/> " + (lines++) + " " + st; if (lines % 40 == 0) { document.querySelector('div[id="errordiv"]').innerHTML = "<br/> " + (lines++) + " " + st; } } function reassignEventListeners() { $(document).keypress(function (e) { // if t pressed remake the dialog if (e.which == 116 || e.keyCode == 116) { randTime = 3; } //document.querySelector('div[id="errordiv"]').innerHTML += "<br/> "+ (lines++) + " " + e.which; if (e.keyCode == 37 || e.which == 97) { getNewFapData(); } if (e.keyCode == 39 || e.which == 100) { getNewFapData(); } }); $(document).keypress(function (e) { // if t pressed remake the dialog }); $("#dropdown")[0].addEventListener("click", function (e) { if (buttonsHidden) { $("#dropdown")[0].innerHTML = "▼ Hide"; $("#ToggleAutoAdvance")[0].style.display = "block"; $("#ToggleFG")[0].style.display = "block"; $("#ToggleAH")[0].style.display = "block"; $("#ToggleVG")[0].style.display = "block"; $("#ToggleDenial")[0].style.display = "block"; $("#ToggleDildo")[0].style.display = "block"; buttonsHidden = false; } else { $("#dropdown")[0].innerHTML = "▲ Unhide"; $("#ToggleAutoAdvance")[0].style.display = "none"; $("#ToggleFG")[0].style.display = "none"; $("#ToggleAH")[0].style.display = "none"; $("#ToggleVG")[0].style.display = "none"; $("#ToggleDenial")[0].style.display = "none"; $("#ToggleDildo")[0].style.display = "none"; buttonsHidden = true; } }, false); $("#ToggleAutoAdvance")[0].addEventListener("click", function (e) { if (autoOverride) { alert('Automatic Page Cycling Re-enabled!'); $("#ToggleAutoAdvance")[0].innerHTML = "Disable Auto-Advance"; autoOverride = false; } else { alert('Automatic Page Cycling disabled!'); $("#ToggleAutoAdvance")[0].innerHTML = "Enable Auto-Advance"; autoOverride = true; } }, false); $("#ToggleFG")[0].addEventListener("click", function (e) { if (FGisON) { $("#ToggleFG")[0].innerHTML = "Enable Fap Gauntlet"; clearInterval(remakeDialog.interval); o.frequency.value = 0; $("#VisualGuide")[0].style.animation = "play 0s infinite linear"; $("#FapDialog")[0].style.display = "none"; FGisON = false; } else { FGisON = true; $("#VisualGuide")[0].style.animation = "play " + (1 / currFPS) + "s infinite " + currCurve; $("#ToggleFG")[0].innerHTML = "Disable Fap Gauntlet"; remakeDialog(); } }, false); $("#ToggleVG")[0].addEventListener("click", function (e) { $ = unsafeWindow.jQuery; if (visualGuideMode) { $("#ToggleVG")[0].innerHTML = "Enable Visual Guide"; $("#VisualGuide")[0].style.display = "none"; visualGuideMode = false; $("#VisualGuide")[0].style.animation = "play 0s infinite linear"; } else { $("#ToggleVG")[0].innerHTML = "Disable Visual Guide"; $("#VisualGuide")[0].style.display = "block"; visualGuideMode = true; $("#VisualGuide")[0].style.animation = "play " + (1 / currFPS) + "s infinite " + currCurve; } }, false); $("#ToggleDildo")[0].addEventListener("click", function (e) { if (dildoMode) { $("#ToggleDildo")[0].innerHTML = "Enable Dildo Mode"; dildoMode = false; } else { $("#ToggleDildo")[0].innerHTML = "Disable Dildo Mode"; dildoMode = true; } }, false); $("#ToggleAH")[0].addEventListener("click", function (e) { if (isPlaying) { $("#ToggleAH")[0].innerHTML = "Enable Audio Helper"; o.frequency.value = 0; isPlaying = false; } else if (firstStart) { $("#ToggleAH")[0].innerHTML = "Disable Audio Helper"; o.start(); firstStart = false; o.frequency.value = currFPS; isPlaying = true; } else { $("#ToggleAH")[0].innerHTML = "Disable Audio Helper"; o.frequency.value = currFPS; isPlaying = true; } }, false); $("#ToggleDenial")[0].addEventListener("click", function (e) { if (denialMode) { $("#ToggleDenial")[0].innerHTML = "Enable Denial Mode"; $("#EdgedButton")[0].innerHTML = ""; denialMode = false; } else { $("#ToggleDenial")[0].innerHTML = "Disable Denial Mode"; $("#EdgedButton")[0].innerHTML = "I Edged!"; denialMode = true; } }, false); $("#EdgedButton")[0].addEventListener("click", function (e) { if (denialMode) { handsOffMode = true; $ = unsafeWindow.jQuery; $("#VisualGuide")[0].style.animation = "play 0s infinite linear"; //change image var $ = unsafeWindow.jQuery; window.top.postMessage({ action: 'next', cr: $.cookie().cr }, window.top.location.protocol + window.top.location.host); setTimeout(function () { currViewObj = unsafeWindow.AppState.viewing; }, 1000); o.frequency.value = 0; randTime = 45; i = 0; } }, false); } $(window).bind('hashchange', function () { reassignEventListeners(); }); setTimeout(function () { // thanks for not having a sleep function js //update: using GM's built in wait until document loaded @thing breaks jquery on the site, weird redrawOptions(); reassignEventListeners(); }, 2000);