aboutsummaryrefslogtreecommitdiff
path: root/htdocs/public/answer/index.ejs
blob: fa6254c24bb7c85b84e2ff7193e384b58eb73a08 (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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<%

    function date() {
        return "" + new Date().getFullYear() + (new Date().getMonth() + 1) + new Date().getDate() + new Date().getHours() + new Date().getMinutes();
    }

    function date2() {
        return "" + new Date().getFullYear() + (new Date().getMonth() + 1);
    }

    if (typeof get["q"] !== "undefined") {
        query = get["q"].toLowerCase().substr(0, 200).replace(/[^A-Za-z0-9 +\-_/*]/, '').replace(/[\.]/, ' ').trim();
    } else {
        res.writeHead(301, {"Location": "/" + slang});
        res.end();
    }

    if (query === "") {
        res.writeHead(301, {"Location": "/" + slang});
        res.end();
    }

    cacheOnly = false;
    rl = {
        local: -1,
        global: -1,
        blocked: false
    }

    rlroot = wwwdata + "/../../data/ratelimiting";
    cache = wwwdata + "/../../data/cache";
    afile = rlroot + "/" + address;
    gfile = rlroot + "/_global";
    mfile = rlroot + "_month";

    if (!fs.existsSync(rlroot)) fs.mkdirSync(rlroot);

    if (!fs.existsSync(afile)) {
        fs.writeFileSync(afile, "1|" + date());
    } else {
        requests = fs.readFileSync(afile).toString().split("|")[0] - 1 + 1;
        vdate = fs.readFileSync(afile).toString().split("|")[1];
        if (vdate === date()) {
            requests++;
            if (requests > 3) {
                cacheOnly = true;
                rl.blocked = true;
            }
            fs.writeFileSync(afile, requests + "|" + date());
        } else {
            fs.writeFileSync(afile, "1|" + date());
        }

        rl.local = requests;
    }

    if (!fs.existsSync(gfile)) {
        fs.writeFileSync(gfile, "1|" + date());
    } else {
        requests = fs.readFileSync(gfile).toString().split("|")[0] - 1 + 1;
        vdate = fs.readFileSync(gfile).toString().split("|")[1];
        if (vdate === date()) {
            requests++;
            if (requests >= 20) {
                cacheOnly = true;
                rl.blocked = true;
            }
            fs.writeFileSync(gfile, requests + "|" + date());
        } else {
            fs.writeFileSync(gfile, "1|" + date());
        }

        rl.global = requests;
    }

    if (!fs.existsSync(mfile)) {
        fs.writeFileSync(mfile, "1|" + date2());
    } else {
        requests = fs.readFileSync(mfile).toString().split("|")[0] - 1 + 1;
        vdate = fs.readFileSync(mfile).toString().split("|")[1];
        if (vdate === date2()) {
            requests++;
            if (requests >= 1990) {
                cacheOnly = true;
                rl.blocked = true;
            }
            fs.writeFileSync(mfile, requests + "|" + date2());
        } else {
            fs.writeFileSync(mfile, "1|" + date2());
        }

        rl.global = requests;
    }

    res.writeHead(200, { "Content-Type": "text/plain" });
    text = encodeURI(query);

    if (!fs.existsSync(cache)) fs.mkdirSync(cache);

    ansfile = cache + "/answer_" + query.replaceAll(" ", "_").replaceAll("/", "_");

    if (fs.existsSync(ansfile)) {
        ds = "local";
        data = fs.readFileSync(ansfile);
    } else {
        if (cacheOnly) {
            res.end();
        } else {
            ds = "online";
            try {
                data = (await axios.get("https://api.wolframalpha.com/v1/result?appid=" + fs.readFileSync(wwwdata + "/../../data/wolfram.txt").toString() + "&i=" + text + "&units=metric&timeout=10")).data;
                fs.writeFileSync(ansfile, data);
            } catch (e) {
                data = "";
            }
        }
    }

%><%= data %>