48hr.email/application/helper.js
2025-12-12 21:48:49 +01:00

144 lines
No EOL
4.1 KiB
JavaScript

const config = require('./config')
const moment = require('moment')
class Helper {
/**
* Normalize our config into a proper timestamp, so we know what emails to purge
* @returns {Date}
*/
purgeTimeStamp() {
return moment()
.subtract(config.email.purgeTime.time, config.email.purgeTime.unit)
.toDate()
}
/**
* Check if time difference between now and purgeTimeStamp is more than one day
* @param {number|Date} now
* @param {Date} past
* @returns {Boolean}
*/
moreThanOneDay(now, past) {
const DAY_IN_MS = 24 * 60 * 60 * 1000;
const nowMs = now instanceof Date ? now.getTime() : now;
const pastMs = past instanceof Date ? past.getTime() : new Date(past).getTime();
return (nowMs - pastMs) >= DAY_IN_MS;
}
/**
* Convert time to highest possible unit (minutes → hours → days),
* rounding if necessary and prefixing "~" when rounded.
*
* @param {number} time
* @param {string} unit "minutes" | "hours" | "days"
* @returns {string}
*/
convertAndRound(time, unit) {
let value = time;
let u = unit;
// upgrade units
const units = [
["minutes", 60, "hours"],
["hours", 24, "days"]
];
for (const [from, factor, to] of units) {
if (u === from && value > factor) {
value = value / factor;
u = to;
}
}
// determine if rounding is needed
const rounded = !Number.isSafeInteger(value);
if (rounded) value = Math.round(value);
return `${rounded ? "~" : ""}${value} ${u}`;
}
/**
* Build a purgeTime html element for the page to keep the clutter outside of the twig template
* @returns {String}
*/
purgeTimeElemetBuilder() {
let time = `${config.email.purgeTime.time} ${config.email.purgeTime.unit}`
let Tooltip = ''
if (config.email.purgeTime.convert) {
time = this.convertAndRound(config.email.purgeTime.time, config.email.purgeTime.unit)
if (time !== `${config.email.purgeTime.time} ${config.email.purgeTime.unit}`) {
Tooltip = `Config: ${config.email.purgeTime.time} ${config.email.purgeTime.unit}`
}
}
const footer = `<label title="${Tooltip}">
<h4 style="display: inline;"><u><i>${time}</i></u></h4>
</Label>`
return footer
}
/**
* Shuffle an array using the Durstenfeld shuffle algorithm
* @param {Array} array
* @returns {Array}
*/
shuffleArray(array) {
for (let i = array.length - 1; i >= 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
return array
}
/**
* Shuffle first item of array, keeping original order afterwards
* @param {Array} array
* @returns {Array}
*/
shuffleFirstItem(array) {
let first = array[Math.floor(Math.random() * array.length)]
array = array.filter((value) => value != first);
array = [first].concat(array)
return array
}
/**
* Hide other emails in the list and only show first (true) or show all (false)
* @param {Array} array
* @returns {Array}
*/
hideOther(array) {
if (config.http.hideOther) {
return array[0]
} else {
return array
}
}
/**
* Get a domain list from config for use
* @returns {Array}
*/
getDomains() {
switch (config.http.displaySort) {
case 0:
return this.hideOther(config.email.domains) // No modification
case 1:
return this.hideOther(config.email.domains.sort()) // Sort alphabetically
case 2:
return this.hideOther(this.shuffleFirstItem(config.email.domains.sort())) // Sort alphabetically and shuffle first item
case 3:
return this.hideOther(this.shuffleArray(config.email.domains)) // Shuffle all
}
}
}
module.exports = Helper