Files
wichteln/wichteln.js
Thomas Ruoff 6ea454ce1c inital commit
2018-12-10 23:14:08 +01:00

83 lines
1.9 KiB
JavaScript
Executable File

#!/usr/bin/env node
const fs = require('fs');
const readline = require('readline');
const nodemailer = require('nodemailer');
const mailer = nodemailer.createTransport({
sendmail: true,
newline: 'unix',
path: '/usr/sbin/sendmail'
});
function mail(email, name, pick) {
mailer.sendMail({
from: 'ido@cassiopeia.uberspace.com',
to: email,
subject: `Dein Wichtel ${name} ist ...`,
text: `Hey ${name},
Dein Wichtel ist *trommelwirbel*
${pick} !!!
Viel Spaß
Thomas
Ps.: Bitte gebt nicht mehr als 5 Euro pro Geschenk aus!
`,
}, (err, info) => {
console.log(info.envelope);
console.log(info.messageId);
});
}
function read() {
return new Promise((resolve, reject) => {
const people = [];
const rl = readline.createInterface({
input: fs.createReadStream('people.txt')
});
rl.on('line', line => {
const [name, email, group] = line.split(/\s+/);
people.push({ name, email, group });
});
rl.on('error', reject);
rl.on('close', () => {
resolve(people);
});
});
}
async function run() {
const people = await read();
people.forEach(drawer => {
let picked;
let pickable = people.filter(p =>
!p.picked
&& drawer.name !== p.name
&& (!drawer.group || drawer.group !== p.group)
);
if (pickable.length === 0) {
throw new Error('ohhh, noone left for ', drawer.name);
}
let pickIndex = Math.floor(Math.random() * pickable.length);
drawer.pick = pickable[pickIndex].name;
pickable[pickIndex].picked = true;
});
fs.writeFileSync('./picks.json', JSON.stringify(people.map(({name, pick}) => ({name, pick})), null, 4));
people.forEach(p => mail(p.email, p.name, p.pick));
}
run();