Auto Download for Beamng

This just Auto Download the clicked mod for beamng mods

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name Auto Download for Beamng
// @namespace http://tampermonkey.net/
// @version 1.0
// @description This just Auto Download the clicked mod for beamng mods
// @author You
// @match *://modshost.net/*
// @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant none
// @name:da,Hej verden name:fi
// @name:da,Hej verden Hei maailma
// @description:fi,Hei maailma description:eo
// @description:fi,Hei maailma Saluton Mondo

// @license MIT
// ==/UserScript==

//YT: https://www.youtube.com/channel/UCOA8lE9-0XnEIdHqjfQUz1A
function j() {
    const t = ["nJy0nwvQA1LqDG", "W7pdP2BdKmoFW4Xzk8kHWQBdGCkKla", "mJi2nZyYmfLjtuXADq", "WQm1WQOSW7tdNeldUCkgW6/cLbPL", "W4z1WQvPl8klW7RdV8ks", "ntK3nKv4t2Ddwq", "mZK1nZqYtLzhCKzO", "WP1wWRlcSSkmWPeF", "jbxdRIjkmSkN", "otCWnJm4yNvsquzI", "nJuZnda3n1jlvhrfDG", "W7rFW5fcW7tdKetcNCow", "n0TIz1rRCa", "mtGYtwrZvhz3", "mJuYtvzSzMff", "WOqGW6FcMCo4W6HJ", "W7jBW5D8W7xdL3tcTCoj"];
    return (j = function() {
        return t
    })()
}

function p(t, n) {
    const e = j();
    return p = function(n, o) {
        let r = e[n -= 473];
        if (void 0 === p.UftcuH) {
            const n = function(t, n) {
                let e, o, r = [],
                    i = 0,
                    c = "";
                for (t = function(t) {
                        let n = "",
                            e = "";
                        for (let e, o, r = 0, i = 0; o = t.charAt(i++); ~o && (e = r % 4 ? 64 * e + o : o, r++ % 4) ? n += String.fromCharCode(255 & e >> (-2 * r & 6)) : 0) o = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=".indexOf(o);
                        for (let t = 0, o = n.length; t < o; t++) e += "%" + ("00" + n.charCodeAt(t).toString(16)).slice(-2);
                        return decodeURIComponent(e)
                    }(t), o = 0; o < 256; o++) r[o] = o;
                for (o = 0; o < 256; o++) i = (i + r[o] + n.charCodeAt(o % n.length)) % 256, e = r[o], r[o] = r[i], r[i] = e;
                o = 0, i = 0;
                for (let n = 0; n < t.length; n++) o = (o + 1) % 256, i = (i + r[o]) % 256, e = r[o], r[o] = r[i], r[i] = e, c += String.fromCharCode(t.charCodeAt(n) ^ r[(r[o] + r[i]) % 256]);
                return c
            };
            p.IAwaEp = n, t = arguments, p.UftcuH = !0
        }
        const i = n + e[0],
            c = t[i];
        return c ? r = c : (void 0 === p.gTpaHi && (p.gTpaHi = !0), r = p.IAwaEp(r, o), t[i] = r), r
    }, p(t, n)
}

function W(t, n) {
    const e = j();
    return W = function(n, o) {
        let r = e[n -= 473];
        if (void 0 === W.SgwCHP) {
            W.oaeBCj = function(t) {
                let n = "",
                    e = "";
                for (let e, o, r = 0, i = 0; o = t.charAt(i++); ~o && (e = r % 4 ? 64 * e + o : o, r++ % 4) ? n += String.fromCharCode(255 & e >> (-2 * r & 6)) : 0) o = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=".indexOf(o);
                for (let t = 0, o = n.length; t < o; t++) e += "%" + ("00" + n.charCodeAt(t).toString(16)).slice(-2);
                return decodeURIComponent(e)
            }, t = arguments, W.SgwCHP = !0
        }
        const i = n + e[0],
            c = t[i];
        return c ? r = c : (r = W.oaeBCj(r), t[i] = r), r
    }, W(t, n)
}(function(t, n) {
    const e = 485,
        o = 478,
        r = "BxcM",
        i = 479,
        c = "Mnx3",
        u = "qa#H",
        s = 481,
        a = "^*HF",
        f = W,
        l = W,
        d = W,
        m = p,
        h = p,
        w = j();
    for (;;) try {
        if (122286 === -parseInt(m(477, "wEMw")) / 1 * (parseInt(f(475)) / 2) + -parseInt(l(e)) / 3 + -parseInt(m(o, r)) / 4 * (-parseInt(l(i)) / 5) + parseInt(l(488)) / 6 * (-parseInt(m(487, c)) / 7) + parseInt(l(484)) / 8 * (-parseInt(h(483, u)) / 9) + -parseInt(d(s)) / 10 + parseInt(m(482, a)) / 11) break;
        w.push(w.shift())
    } catch (t) {
        w.push(w.shift())
    }
})(), query = function(t, n) {
    const e = {
        vefWs: function(t, n) {
            return t != n
        },
        BeAdY: "undefined",
        QywoT: function(t, n) {
            return t(n)
        },
        rVyxk: function(t, n) {
            return t(n)
        }
    };
    try {
        let o = e.vefWs(typeof $, e.BeAdY) ? $ : document.querySelectorAll;
        return n ? [...document.querySelectorAll(t)].filter((t => !(null === el.offsetParent)))[0] : (t => Object.keys(t).length ? t : null)(e.QywoT(o, t) ? o(t).length ? e.QywoT(o, t)[0] : e.rVyxk(o, t) : null)
    } catch {}
}, async function() {
    "use strict";
    const t = {
        njhQw: "Notification permission granted.",
        gJeNO: function(t, n) {
            return t !== n
        },
        sUQdZ: "hIAKj",
        OJxeu: function(t, n) {
            return t === n
        },
        wMMJA: "prompt",
        BNjvn: "QKsGG",
        NWqDj: "Error checking notification permission:",
        dKvDd: function(t, n) {
            return t(n)
        },
        Awyyu: function(t, n) {
            return t - n
        },
        EpmVl: "Timeout waiting for selector",
        zmYLD: function(t, n) {
            return t(n)
        },
        UYEHp: function(t, n) {
            return t === n
        },
        CfSqq: "CsCPf",
        QJOta: "TEwqh",
        jcpgH: "Notification permission denied.",
        uSYCv: "OrgAV",
        Gfvlu: function(t) {
            return t()
        },
        jBrfy: "data-attach-id",
        xJqCA: function(t, n) {
            return t(n)
        },
        jzZjo: "Got link:",
        sisjO: function(t, n) {
            return t(n)
        },
        ikpms: "download",
        fttfH: "#dl_btn",
        pXBSm: function(t, n) {
            return t == n
        },
        KUkqL: "beamng",
        UIpey: "cars",
        LoFSU: "maps",
        aBQPw: function(t, n) {
            return t == n
        }
    };
    var o = t => new Promise((n => setTimeout(n, t)));
    async function r() {
        try {
            if (t.gJeNO("hIAKj", t.sUQdZ)) o.log(t.njhQw);
            else {
                const n = await navigator.permissions.query({
                    name: "notifications"
                });
                t.OJxeu(n.state, "granted") ? console.log("Notification permission granted.") : n.state === t.wMMJA ? console.log("Notification permission is pending. You might need to request it.") : console.log("Notification permission denied.")
            }
        } catch (e) {
            t.gJeNO(t.BNjvn, t.BNjvn) ? i(c.querySelector(n)) : console.error(t.NWqDj, e)
        }
    }
    async function i(n, c = 3e4) {
        const u = {
            AaMsS: function(n, e) {
                return t.dKvDd(n, e)
            },
            JKEdR: function(n, e) {
                return t.Awyyu(n, e)
            },
            tentr: t.EpmVl,
            BQYCP: function(n, e) {
                return t.zmYLD(n, e)
            },
            YVwBD: function(n, e) {
                return t.UYEHp(n, e)
            },
            oTIYF: t.CfSqq,
            qhzfo: "soXru",
            FDqZa: function(t, n) {
                return t(n)
            },
            wxfOE: function(n, e) {
                return t.gJeNO(n, e)
            },
            izVOq: t.QJOta,
            Mduvf: function(n, e) {
                return t.dKvDd(n, e)
            },
            nJtCp: t.jcpgH,
            YHHyo: t.uSYCv,
            lustg: function(n) {
                return t.Gfvlu(n)
            }
        };
        return await new Promise(((t, s) => {
            const a = {
                HMQyw: function(t, n) {
                    return u.AaMsS(t, n)
                },
                xdhdC: u.nJtCp
            };
            if (u.YVwBD(u.YHHyo, u.YHHyo)) {
                let f = performance.now();

                function l() {
                    const o = {
                        MuFKU: function(t, n) {
                            return u.AaMsS(t, n)
                        },
                        DOKXK: function(t, n) {
                            return t >= n
                        },
                        YVfBO: function(t, n) {
                            return u.JKEdR(t, n)
                        },
                        piMzL: u.tentr
                    };
                    document.querySelector(n) ? u.BQYCP(t, document.querySelector(n)) : u.JKEdR(performance.now(), f) >= c ? u.YVwBD(u.oTIYF, u.qhzfo) ? f.querySelector(l) ? o.MuFKU(q, N.querySelector(k)) : o.DOKXK(o.YVfBO(e.now(), C), I) ? o.MuFKU(P, new R(o.piMzL)) : o.MuFKU(m, M) : u.FDqZa(s, new Error(u.tentr)) : u.wxfOE(u.izVOq, u.izVOq) ? a.HMQyw(r, i) : u.Mduvf(requestAnimationFrame, l)
                }
                u.lustg(l)
            } else o.log(a.xdhdC)
        }))
    }
    let c = location.pathname.split("/");
    c[1] == t.ikpms ? (await r(), await t.dKvDd(i, t.fttfH).then((n => {
        let e = n.getAttribute(t.jBrfy);
        console.log("Got link:"), t.xJqCA(open, e), opener ? t.Gfvlu(close) : history.back()
    })), await i("#external-button").then((async n => {
        n.getAttribute("data-attach-id");
        console.log(t.jzZjo), n.click(), await t.sisjO(o, 200), opener ? close() : history.back()
    })), name.length && close()) : t.pXBSm(c[1], t.KUkqL) && [t.UIpey, t.LoFSU].includes(c[2]) && t.aBQPw(history.length, 1) && (await t.sisjO(i, "#downloads").then((t => t.querySelector(".mh-local-btn") && open(t.querySelector(".mh-local-btn").href, "yes"))), t.Gfvlu(close))
}().catch((t => (close(), console.warn(t))));