From 06cfad8fa3181a21e70d76a575bf0a3d052b6f70 Mon Sep 17 00:00:00 2001 From: Ashley Date: Fri, 30 Jun 2023 10:54:53 +0000 Subject: [PATCH] add statuspage support :3 --- server.js | 219 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 162 insertions(+), 57 deletions(-) diff --git a/server.js b/server.js index d13ad884..db1cd821 100644 --- a/server.js +++ b/server.js @@ -8,7 +8,7 @@ it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the @@ -34,7 +34,14 @@ const config = require("./config.json"); const u = await media_proxy(); initlog("Loading..."); - initlog("[Welcome] Welcome To PokeTube :3 " +"Running " +`Node ${process.version} - V8 v${process.versions.v8} - ${process.platform.replace("linux", "GNU/Linux")} ${process.arch} Server - libpt ${version}` + initlog( + "[Welcome] Welcome To PokeTube :3 " + + "Running " + + `Node ${process.version} - V8 v${ + process.versions.v8 + } - ${process.platform.replace("linux", "GNU/Linux")} ${ + process.arch + } Server - libpt ${version}` ); const { @@ -54,7 +61,93 @@ ); const sha384 = modules.hash; + + var http = require("https"); + var ping = require("ping"); + if (process.env.STATUSPAGE_API) { + // The following 4 are the actual values that pertain to your account and this specific metric. + var apiKey = process.env.STATUSPAGE_API; + var pageId = process.env.STATUSPAGE_PAGEID; + var metricId = process.env.STATUSPAGE_METRICID + var apiBase = "https://api.statuspage.io/v1"; + + var url = + apiBase + "/pages/" + pageId + "/metrics/" + metricId + "/data.json"; + var authHeader = { Authorization: "OAuth " + apiKey }; + var options = { method: "POST", headers: authHeader }; + + // Need at least 1 data point for every 5 minutes. + // Submit random data for the whole day. + var totalPoints = (60 / 5) * 24; + var epochInSeconds = Math.floor(new Date() / 1000); + + // This function gets called every second. + function submit(count) { + count = count + 1; + + if (count > totalPoints) return; + + var currentTimestamp = epochInSeconds - (count - 1) * 5 * 60; + + // Measure server ping here + var host = "poketube.fun"; // Replace with the server you want to ping + + ping.promise + .probe(host) + .then((result) => { + var ping = result.time !== "unknown" ? parseInt(result.time) : -1; + + ping = Math.min(Math.max(ping, 20), 250); + + var data = { + timestamp: currentTimestamp, + value: ping, + }; + + var request = http.request(url, options, function (res) { + if (res.statusMessage === "Unauthorized") { + const genericError = + "Error encountered. Please ensure that your page code and authorization key are correct."; + return console.error(genericError); + } + res.on("data", function () { + console.log("Submitted point " + count + " of " + totalPoints); + }); + res.on("end", function () { + setTimeout(function () { + submit(count); + }, 1000); + }); + res.on("error", (error) => { + console.error(`Error caught: ${error.message}`); + }); + }); + + request.end(JSON.stringify({ data: data })); + }) + .catch((error) => { + console.error("Ping failed:", error); + // Submit a default value if the ping fails + var data = { + timestamp: currentTimestamp, + value: -1, // Use -1 to indicate ping failure + }; + + var request = http.request(url, options, function (res) { + // Handle response + }); + + request.end(JSON.stringify({ data: data })); + }); + } + + + // Initial call to start submitting data immediately. + submit(0); + + } + var app = modules.express(); initlog("Loaded express.js"); app.engine("html", require("ejs").renderFile); @@ -64,9 +157,12 @@ app.enable("trust proxy"); const renderTemplate = async (res, req, template, data = {}) => { - res.render(modules.path.resolve(`${templateDir}${modules.path.sep}${template}`),Object.assign(data)); + res.render( + modules.path.resolve(`${templateDir}${modules.path.sep}${template}`), + Object.assign(data) + ); }; - + const random_words = [ "banana pie", "how to buy an atom bomb", @@ -80,68 +176,77 @@ "monke", ]; - const initPokeTube = function() { - sinit(app, config, renderTemplate); - initlog("inited super init") - init(app); - initlog("inited app") - } - + const initPokeTube = function () { + sinit(app, config, renderTemplate); + initlog("inited super init"); + init(app); + initlog("inited app"); + }; + try { - app.use(function (req, res, next) { - res.header("Access-Control-Allow-Origin", "*"); - if (req.secure) { - res.header( - "Strict-Transport-Security", - "max-age=31536000; includeSubDomains; preload" - ); - } - res.header("secure-poketube-instance", "1"); - - next(); - }); - - app.use(function (request, response, next) { - if (config.enablealwayshttps && !request.secure) { - if (!/^https:/i.test(request.headers["x-forwarded-proto"] || request.protocol)) { - return response.redirect("https://" + request.headers.host + request.url); + app.use(function (req, res, next) { + res.header("Access-Control-Allow-Origin", "*"); + if (req.secure) { + res.header( + "Strict-Transport-Security", + "max-age=31536000; includeSubDomains; preload" + ); } - } + res.header("secure-poketube-instance", "1"); - next(); - }); + next(); + }); - app.use(function (req, res, next) { - res.header("X-PokeTube-Youtube-Client-Name", "1"); - res.header("X-PokeTube-Youtube-Client-Version", "2.20210721.00.00"); - res.header("X-PokeTube-Speeder", "6 seconds no cache, 780ms w/cache"); - if (req.url.match(/^\/(css|js|img|font)\/.+/)) { - res.setHeader("Cache-Control","public, max-age=" + config.cacher_max_age); // cache header - res.setHeader("poketube-cacher", "STATIC_FILES"); - } + app.use(function (request, response, next) { + if (config.enablealwayshttps && !request.secure) { + if ( + !/^https:/i.test( + request.headers["x-forwarded-proto"] || request.protocol + ) + ) { + return response.redirect( + "https://" + request.headers.host + request.url + ); + } + } - const a = 890; - if (!req.url.match(/^\/(css|js|img|font)\/.+/)) { - res.setHeader("Cache-Control", "public, max-age=" + a); // cache header - res.setHeader("poketube-cacher", "PAGE"); - } - next(); - }); + next(); + }); - initlog("[OK] Load headers"); + app.use(function (req, res, next) { + res.header("X-PokeTube-Youtube-Client-Name", "1"); + res.header("X-PokeTube-Youtube-Client-Version", "2.20210721.00.00"); + res.header("X-PokeTube-Speeder", "6 seconds no cache, 780ms w/cache"); + if (req.url.match(/^\/(css|js|img|font)\/.+/)) { + res.setHeader( + "Cache-Control", + "public, max-age=" + config.cacher_max_age + ); // cache header + res.setHeader("poketube-cacher", "STATIC_FILES"); + } + + const a = 890; + if (!req.url.match(/^\/(css|js|img|font)\/.+/)) { + res.setHeader("Cache-Control", "public, max-age=" + a); // cache header + res.setHeader("poketube-cacher", "PAGE"); + } + next(); + }); + + initlog("[OK] Load headers"); } catch { - initlog("[FAILED] load headers") + initlog("[FAILED] load headers"); } - + try { - app.get("/robots.txt", (req, res) => { - res.sendFile(__dirname + "/robots.txt"); - }); - - initlog("[OK] Load robots.txt"); + app.get("/robots.txt", (req, res) => { + res.sendFile(__dirname + "/robots.txt"); + }); + + initlog("[OK] Load robots.txt"); } catch { - initlog("[FAILED] load robots.txt") + initlog("[FAILED] load robots.txt"); } - - initPokeTube() + + initPokeTube(); })();