summaryrefslogtreecommitdiff
path: root/commands/eval.js
blob: 761b03dc723aff7a55da3801e691a5c6646e4d7a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
const vm = require('vm');

module.exports = (parameter, wrapper) => {
    let start = new Date();

    function userToUUID(user) {
        const crypto = require('crypto');
        let hash = crypto.createHash("sha1").update(user).digest("hex");
        return hash.substring(0, 8) + "-" + hash.substring(8, 12) + "-4" + hash.substring(12, 15) + "-8" + hash.substring(15, 18) + "-" + hash.substring(18, 30);
    }

    let id = userToUUID(wrapper.sender);

    try {
        if (!evalContexts[id]) {
            evalContexts[id] = {};
            vm.createContext(evalContexts[id]);
        }

        try {
            let ret = vm.runInContext(parameter, evalContexts[id]);

            try {
                wrapper.send("✅ Completed in " + (new Date().getTime() - start) + " ms, running in `isolated:" + id + "` context\n\n```plaintext\n" + JSON.stringify(ret, null, 2) + "\n```");
            } catch (e) {
                wrapper.send("⚠️ Completed with invalid JSON in " + (new Date().getTime() - start) + " ms, running in `isolated:" + id + "` context\n\n```plaintext\n" + ret + "\n```");
            }
        } catch (e) {
            wrapper.send("🚨 Failed after " + (new Date().getTime() - start) + " ms, running in `isolated:" + id + "` context\n\n```plaintext\n" + e.stack + "\n```");
        }
    } catch (e) {
        wrapper.send("⛔️ Failed to initialise context `isolated:" + id + "`:\n\n```plaintext\n" + e.stack + "\n```");
    }
}