#!/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();