sascacci Helper

自动点击,解放你的双手!

目前为 2023-09-10 提交的版本。查看 最新版本

// ==UserScript==
// @name        sascacci Helper
// @name:zh     sascacci 自动点击器
// @name:en     sascacci.com Auto presser
// @namespace   Violentmonkey Scripts
// @match       https://sascacci.com/touchwaves/*
// @grant       GM_log
// @grant       GM_setValue
// @grant       GM_getValue
// @grant       GM_registerMenuCommand
// @grant       GM_unregisterMenuCommand
// @grant       GM_addValueChangeListener
// @version     0.4.1
// @author      axototl
// @license     AGPL-3.0-or-later
// @run-at      document-idle
// @icon        https://sascacci.com/favicon.ico
// @description:zh 自动点击,解放你的双手!
// @description:en An auto presser to release your hands !!!
// @description 自动点击,解放你的双手!
// ==/UserScript==
'use strict';
const codecs = [65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 109, 110, 111, 32];
const len = codecs.length;

function getValue(name, def) {
    let t = GM_getValue(name);
    if (null == t) {
        t = def;
        GM_setValue(name, t);
    }
    return t;
}


let dbg = getValue("debug", false);
const canvas = document.getElementById("cvsID");
let keeptime = getValue("keeptime", 3500);
let rnd = false;

function press(key) {
    const conf = {
        bubbles: true,
        cancelable: true,
        keyCode: key
    };
    const ke = new KeyboardEvent('keydown', conf);
    canvas.dispatchEvent(ke);
}

function random(max_plus_1) {
    const arr = new Uint32Array(1);
    crypto.getRandomValues(arr);
    return arr[0] % max_plus_1;
}

function getRand() {
    const r = random(len);
    return codecs[r];
}

let stop = false;
let pause = false;
async function main () {
    if (stop) return;
    if (!pause) {
        const cdc = getRand();
        press(cdc);
    }
    let nxt = keeptime;
    if (rnd) nxt = random(nxt);
    setTimeout(main, nxt);
}

(() => {
    if (getValue("first", true)) {
        alert("请不要让标签页处于后台后迅速切换回来, 否则可能会出现声量过大的问题\n\
Please don't leave tabs in the background and then switch them back immediately, or you may go deaf.");
        alert("Click any place to Start!\n 点击任意一处开始自动播放\n 按下pause键暂停\n Press pause to stop.");
        GM_setValue("first", false);
    }
    canvas.addEventListener("click", listen);
    function listen(ev) {
        canvas.removeEventListener("click", listen);
        main();
    }
    document.addEventListener("keydown", (ev) => {
        // GM_log(ev);
        if (ev.keyCode == 19) pause = !pause;
    });
})();


(() => {
    const props = ["✅ (Enabled) ", "❌ (Disabled) "];
    function reg_dbg() {
        return GM_registerMenuCommand(props[dbg | 0] + "调试模式 (Debug)", () => GM_setValue("debug", !dbg));
    }
    let tmp2 = reg_dbg();
    GM_addValueChangeListener("debug", (_1, _2, nv, _3) => {
        GM_unregisterMenuCommand(tmp2);
        dbg = nv;
        tmp2 = reg_dbg();
    });
    const tmp = GM_registerMenuCommand("停止运行 (Stop)", unreg);
    function unreg() {
        stop = true;
        GM_unregisterMenuCommand(tmp);
        GM_unregisterMenuCommand(tmp2);
    }

    GM_registerMenuCommand("设置间隔 (Time)", () => {
        let t;
        do {
            t = prompt("输入两次之间的时间间隔, 小于0的数值将会被当成随机数, 最大为 输入数的相反数 处理")*1;
        } while(isNaN(t) || 0 == t);
        GM_setValue("keeptime", t);
    });
    GM_addValueChangeListener("keeptime", (_1, _2, nv, _3) => (rnd = (nv < 0), keeptime = Math.abs(nv)));
})();