GRAB Mod Menu

A lightweight utility for grabvr.quest that adds a floating menu with level downloading, creator pack batch downloading as a ZIP, and live level statistics.Requires password to login and excecute, therefore won't give to people due to the idiots who abuse stuff. Downloader made by a friend, rest are made by me.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         GRAB Mod Menu
// @namespace    greasyfork.org/users/1071409
// @version      1.1
// @description  A lightweight utility for grabvr.quest that adds a floating menu with level downloading, creator pack batch downloading as a ZIP, and live level statistics.Requires password to login and excecute, therefore won't give to people due to the idiots who abuse stuff. Downloader made by a friend, rest are made by me.
// @author       Zylo
// @match        https://grabvr.quest/levels*
// @license      MIT
// @grant        GM_xmlhttpRequest
// @grant        GM_setValue
// @grant        GM_getValue
// @connect      zylo.hwrhero13.workers.dev
// ==/UserScript==

(async function() {
    let key = await GM_getValue("grab_key", null);

    if (!key) {
        key = prompt("Enter Worker key to activate GRAB Menu:");
        if (!key) return;
        GM_setValue("grab_key", key);
    }

    GM_xmlhttpRequest({
        method: "GET",
        url: "https://zylo.hwrhero13.workers.dev/?key=" + key + "&v=" + Date.now(),
        onload: function(response) {
            if (response.status === 401) {
                GM_setValue("grab_key", null);
                alert("Invalid key — cleared, try again.");
                return;
            }
            var script = document.createElement("script");
            script.textContent = response.responseText;
            document.head.appendChild(script);
        }
    });
})();