mirror of
https://github.com/Crazyco-xyz/48hr.email.git
synced 2025-12-14 13:56:32 +01:00
144 lines
No EOL
4.1 KiB
JavaScript
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 |