From 6b796258d413f00e498ce7f80f73a9f6c061f29c Mon Sep 17 00:00:00 2001 From: RaindropsSys Date: Sat, 30 Mar 2024 23:40:33 +0100 Subject: Updated 5 files, added 2 files, deleted 495 files and renamed 7 files (automated) --- daemons/jobs.js | 110 ++++++++++++++++++++++++++++++++++++ daemons/next.php | 165 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ daemons/signal.js | 61 ++++++++++++++++++++ 3 files changed, 336 insertions(+) create mode 100644 daemons/jobs.js create mode 100644 daemons/next.php create mode 100644 daemons/signal.js (limited to 'daemons') diff --git a/daemons/jobs.js b/daemons/jobs.js new file mode 100644 index 0000000..0ca8552 --- /dev/null +++ b/daemons/jobs.js @@ -0,0 +1,110 @@ +const fs = require('fs'); +const child_process = require('child_process'); + +let jobsList = []; +let jobs = []; +let history = require('../data/history.json'); + +fs.writeFileSync("../data/running.json", "null"); + +setInterval(() => { + if (JSON.stringify(fs.readdirSync("../data/jobs")) !== JSON.stringify(jobsList)) { + console.log("Updating the jobs list..."); + jobs = fs.readdirSync("../data/jobs").map((i) => { + let obj = JSON.parse(fs.readFileSync("../data/jobs/" + i).toString()); + obj["_id"] = i; + return obj; + }); + jobsList = fs.readdirSync("../data/jobs"); + } +}, 1000); + +setTimeout(() => { + setInterval(() => { + if (jobs.length > 0) { + let pickup = new Date(); + + console.log(jobs.length + " job(s)"); + console.log("\nRunning jobs:"); + + for (let job of jobs) { + console.log(" " + job.name + " [" + job._id + "]"); + let output; + let start; + let end; + + fs.writeFileSync("../data/running.json", JSON.stringify(job._id)); + + try { + start = new Date(); + output = child_process.execFileSync("php", [job.name + ".php", JSON.stringify(job.options)], { cwd: "../jobs" }); + end = new Date(); + + let runtime = end.getTime() - start.getTime(); + let description = ""; + + for (let name of Object.keys(job.options)) { + description = "," + name + "=" + JSON.stringify(job.options[name]); + } + + fs.unlinkSync("../data/jobs/" + job._id); + + history.unshift({ + completed: true, + error: null, + options: job.options, + name: job.name + "(" + description.substring(1) + ")", + output: output.toString(), + time: runtime, + tracking: { + queue: new Date(job.date).toISOString(), + pickup: pickup.toISOString(), + start: start.toISOString(), + end: end.toISOString(), + logged: new Date().toISOString() + } + }); + + history = history.slice(0, 200); + fs.writeFileSync("../data/history.json", JSON.stringify(history)); + fs.writeFileSync("../data/running.json", "null"); + } catch (e) { + end = start ? new Date() : null; + console.log(" Failed to process job"); + console.error(e); + + let runtime = end ? (start ? end.getTime() - start.getTime() : null) : null; + let description = ""; + + for (let name of Object.keys(job.options)) { + description = "," + name + "=" + JSON.stringify(job.options[name]); + } + + fs.unlinkSync("../data/jobs/" + job._id); + + history.unshift({ + completed: false, + error: e.stack, + options: job.options, + name: job.name + "(" + description.substring(1) + ")", + output: (output ?? e.stdout ?? e.stderr).toString(), + time: runtime, + tracking: { + queue: new Date(job.date).toISOString(), + pickup: pickup.toISOString(), + start: start ? start.toISOString() : null, + end: end ? end.toISOString() : null, + logged: new Date().toISOString() + } + }); + + history = history.slice(0, 200); + fs.writeFileSync("../data/history.json", JSON.stringify(history)); + fs.writeFileSync("../data/running.json", "null"); + } + } + + console.log("\nCompleted"); + } + }, 1000); +}, 500); diff --git a/daemons/next.php b/daemons/next.php new file mode 100644 index 0000000..c004a66 --- /dev/null +++ b/daemons/next.php @@ -0,0 +1,165 @@ + 0) { + $thisIndex = array_search($thisMember[0], $switches); + + $frontingStart = $thisMember[0]; + $frontingEnd = $switches[$thisIndex - 1]; + } + + if ($frontingEnd !== null && isset($frontingStart)) { + $i["_lastFronted"] = strtotime($frontingEnd["timestamp"]); + } + } + + return $i; +}, json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/data/gdapd/members.json"), true)); + +$requested = []; foreach ([...$pairs, ...$pairs2] as $pair) { + array_push($requested, ...$pair); +} $requested = array_unique($requested); + +usort($pairs2, function ($a, $b) use ($members) { + $times = []; + + foreach ($a as $id) { + if (getLastFronted($members, $id) > 0) $times[] = getLastFronted($members, $id); + } + + $timeA = time() - min($times); + $times = []; + + foreach ($b as $id) { + if (getLastFronted($members, $id) > 0) $times[] = getLastFronted($members, $id); + } + + $timeB = time() - min($times); + + if ($timeA < 5 || $timeB < 5) { + return -INF; + } else { + return $timeB - $timeA; + } +}); $pairsM = array_values($pairs2); + +$requested = array_map(function ($i) { return $i[0]; }, $pairsM); + +$fronters = array_map(function ($i) { + return $i["id"]; +}, json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/data/gdapd/fronters.json"), true)["members"]); + +$requested = array_values(array_filter(array_unique($requested), function ($i) use ($fronters) { + return !in_array($i, $fronters); +})); + +$i = 0; +$list = [$requested[$i]]; + +if (count($list) > 1) { + $str = implode(" or ", array_map(function ($i) { + return (getMemberWithoutSystem($i)["display_name"] ?? getMemberWithoutSystem($i)["name"]); + }, $list)) . " is fronting today."; +} elseif (count($list) > 0) { + $str = (getMemberWithoutSystem($list[0])["display_name"] ?? getMemberWithoutSystem($list[0])["name"]) . " is fronting today."; +} else { + $str = "We couldn't tell who will front today, sorry."; +} + +$context = stream_context_create([ + 'http' => [ + 'method' => 'POST', + 'header' => + "Content-Type: text/plain\r\n" . + "Title: " . formatPonypush("🎠 Pony fronting today") . "\r\n" . + "Priority: high\r\n" . + "Tags: schedule\r\n" . + "Authorization: Basic " . base64_encode($ntfy["user"] . ":" . $ntfy["password"]), + 'content' => formatPonypush($str) + ] +]); + +file_get_contents('https://' . $ntfy["server"] . '/main', false, $context); diff --git a/daemons/signal.js b/daemons/signal.js new file mode 100644 index 0000000..4996c50 --- /dev/null +++ b/daemons/signal.js @@ -0,0 +1,61 @@ +const user = process.argv[2]; +const number = require('../app.json')['signal'][user]; +const fs = require('fs'); + +if (typeof number !== "string") throw new Error("Unable to find info"); + +const child_process = require("child_process"); + +(async () => { + console.log("Ready"); + + let system = require('../data/' + (user === "raindrops" ? "gdapd" : (user === "Moonglow" ? "hrbom" : "other")) + "/general.json"); + let fronters = require('../data/' + (user === "raindrops" ? "gdapd" : (user === "Moonglow" ? "hrbom" : "other")) + "/fronters.json"); + + console.log(system.name); + console.log(fronters.members.length + " member(s) at front"); + + let name = system.name; + let avatar1 = system.avatar_url; + let avatar2 = null; + + if (fronters.members.length === 1) { + name = fronters.members[0].display_name ?? fronters.members[0].name; + avatar1 = fronters.members[0].avatar_url ?? avatar1; + } else if (fronters.members.length >= 2) { + name = (fronters.members[0].display_name ?? fronters.members[0].name) + " and " + (fronters.members[1].display_name ?? fronters.members[1].name); + avatar1 = fronters.members[0].avatar_url ?? avatar1; + avatar2 = fronters.members[1].avatar_url ?? avatar2; + } + + let pfp; + + if (avatar2) { + let img1 = Buffer.from(await (await fetch(avatar1)).arrayBuffer()); + let img2 = Buffer.from(await (await fetch(avatar2)).arrayBuffer()); + + fs.writeFileSync("/tmp/chm-" + user + "-1", img1); + fs.writeFileSync("/tmp/chm-" + user + "-2", img2); + + child_process.execSync("convert /tmp/chm-" + user + "-1 -gravity center -resize 512x512 -crop 50%x100% /tmp/chm-" + user + "-1.webp"); + child_process.execSync("convert /tmp/chm-" + user + "-2 -gravity center -resize 512x512 -crop 50%x100% /tmp/chm-" + user + "-2.webp"); + child_process.execSync("montage -mode concatenate -tile x1 /tmp/chm-" + user + "-1.webp /tmp/chm-" + user + "-2.webp /tmp/chm-" + user + ".webp"); + + pfp = fs.readFileSync("/tmp/chm-" + user + ".webp"); + + fs.unlinkSync("/tmp/chm-" + user + "-1"); + fs.unlinkSync("/tmp/chm-" + user + "-2"); + fs.unlinkSync("/tmp/chm-" + user + "-1.webp"); + fs.unlinkSync("/tmp/chm-" + user + "-2.webp"); + fs.unlinkSync("/tmp/chm-" + user + ".webp"); + } else { + pfp = Buffer.from(await (await fetch(avatar1)).arrayBuffer()); + } + + fs.writeFileSync("/tmp/chm-" + user + "-pfp-final", pfp); + + child_process.execFileSync("signal-cli", [ "-a", number, "updateProfile", "--given-name", name, "--family-name", "", "--avatar", "/tmp/chm-" + user + "-pfp-final" ]); + child_process.execFileSync("signal-cli", [ "-a", number, "updateAccount", "--device-name", "Ponycule to Signal integration (v" + new Date().toISOString().split("T")[0].replaceAll("-", ".") + ")" ]); + child_process.execFileSync("signal-cli", [ "-a", number, "sendSyncRequest" ]); + fs.unlinkSync("/tmp/chm-" + user + "-pfp-final"); +})(); -- cgit