From 0166108b27fad35432a1420f505514606d5fec13 Mon Sep 17 00:00:00 2001 From: Tom Smeding Date: Thu, 17 Jul 2025 15:18:26 +0200 Subject: vacancies --- modules/vacancies/bak/chalmers.sh | 30 +++++++++++++ modules/vacancies/getters/aarhus.sh | 8 ++++ modules/vacancies/getters/glasgow.sh | 7 +++ modules/vacancies/vacancies.js | 84 ++++++++++++++++++++++++++++++++++++ 4 files changed, 129 insertions(+) create mode 100755 modules/vacancies/bak/chalmers.sh create mode 100755 modules/vacancies/getters/aarhus.sh create mode 100755 modules/vacancies/getters/glasgow.sh create mode 100644 modules/vacancies/vacancies.js (limited to 'modules') diff --git a/modules/vacancies/bak/chalmers.sh b/modules/vacancies/bak/chalmers.sh new file mode 100755 index 0000000..5583223 --- /dev/null +++ b/modules/vacancies/bak/chalmers.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +set -euo pipefail + +url='https://web103.reachmee.com/ext/I003/304/main?site=5&validator=a72aeedd63ec10de71e46f8d91d0d57c&lang=UK' + +script=' +0,/
/d +//,/<\/tbody>/!d + +/<\/tr>/ { + s/.*// + x + s/\n//g + s/^ | // + /Technical and Administrative staff/d + /PhD Student Positions/d + p + d +} + +//!d +/^\s*<\/td>\s*$/d +s|\s*\(.*\)\s*|\1| +s|.*Application deadline:.*display:\s*none">\([^<]*\).*|\1| +s|.*a href=.*reachmee.*/job.*job_id[^>]*>\([^<]*\).*|\1| +s/^/ | / +H +' + +curl -s "$url" | sed -n "$script" diff --git a/modules/vacancies/getters/aarhus.sh b/modules/vacancies/getters/aarhus.sh new file mode 100755 index 0000000..882d3a3 --- /dev/null +++ b/modules/vacancies/getters/aarhus.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -euo pipefail + +curl -sL 'https://international.au.dk/about/profile/vacant-positions' \ + | grep 'DYCON\.Em[^ ]*vacancies' \ + | head -1 \ + | sed 's/^[^[]*//; s/; *$//' \ + | jq -r '.[] | (.title + " [" + .start_date + "]")' diff --git a/modules/vacancies/getters/glasgow.sh b/modules/vacancies/getters/glasgow.sh new file mode 100755 index 0000000..26886a4 --- /dev/null +++ b/modules/vacancies/getters/glasgow.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +set -euo pipefail + +curl -sL 'https://www.jobs.gla.ac.uk/jobs/college-of-science-and-engineering/school-of-computing-science-1' \ + | grep 'a href="/job/' \ + | grep -v '>Read More<' \ + | sed 's/^ *]*>//; s|||' diff --git a/modules/vacancies/vacancies.js b/modules/vacancies/vacancies.js new file mode 100644 index 0000000..be3c4b4 --- /dev/null +++ b/modules/vacancies/vacancies.js @@ -0,0 +1,84 @@ +const cmn = require("../$common.js"); +const fs = require("fs"); +const child_process = require("child_process"); +const persist = require("node-persist"); +const mkdirp = require("mkdirp"); + +const FIRST_FETCH_DELAY = 10 * 60 * 1000; // 10 seconds +const INTERVAL = 3 * 24 * 3600 * 1000; // 3 days +// const FIRST_FETCH_DELAY = 2 * 1000; +// const INTERVAL = 20 * 1000; + +let moddir = null; + +mkdirp.sync(cmn.persistdir + "/vacancies"); +const DB = persist.create({ + dir: cmn.persistdir + "/vacancies", + continuous: false, + interval: false, +}); +DB.initSync(); + +function sendNotification(text, cb) { + cmn.statusbot.send("vacancies", text, cb); + // console.log("--> " + text); + // cb(200); +} + +function refreshSite(name) { + child_process.execFile(moddir + "/getters/" + name + ".sh", (err, stdout, _stderr) => { + if (err != null) { + sendNotification("Error getting <" + name + ">: " + err, () => {}); + return; + } + + const lines = stdout.split("\n").filter(s => s.length > 0); + let news = []; + + let prev = DB.getItemSync(name); + if (prev != null) { + prev = new Set(prev); + for (let line of lines) { + if (!prev.has(line)) news.push(line); + } + } else { + news = lines; + } + + if (news.length == 0) { + console.log("[vacancies] No news for <" + name + ">"); + return; + } + console.log("[vacancies] " + news.length + " news for <" + name + ">"); + + const message = news.map(s => "<" + name + "> " + s).join("\n"); + sendNotification(message, status => { + if (status == 200) { + DB.setItemSync(name, lines); + } else { + console.log("[vacancies] Failed sending: [[[" + message + "]]]"); + } + }); + }); +} + +function refreshAll() { + console.log("[vacancies] Refreshing"); + let i = 0; + for (let name of fs.readdirSync(moddir + "/getters")) { + if (!name.endsWith(".sh")) continue; + setTimeout(() => refreshSite(name.slice(0, -3)), 2000 * i); + i++; + } +} + +module.exports = (app, io, _moddir) => { + moddir = _moddir; + + setTimeout(() => { + refreshAll(); + setInterval(() => { + refreshAll(); + }, INTERVAL); + }, FIRST_FETCH_DELAY); // wait a while before the first fetch +}; -- cgit v1.2.3-70-g09d2