Greasy Fork is available in English.

Auto Download for Beamng

This just Auto Download the clicked mod for beamng mods

// ==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))));