From 41e36911519131d44bbc6a2cac9b35c136f1c2f9 Mon Sep 17 00:00:00 2001 From: Thomas Ruoff Date: Mon, 18 Nov 2019 22:23:16 +0100 Subject: [PATCH] read from stdin --- .editorconfig | 2 + wichteln.js | 111 +++++++++++++++++++++++++++----------------------- 2 files changed, 62 insertions(+), 51 deletions(-) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..4ae90dd --- /dev/null +++ b/.editorconfig @@ -0,0 +1,2 @@ +[*.js] +indent_size = 2 diff --git a/wichteln.js b/wichteln.js index 97fd8b5..04b57d2 100755 --- a/wichteln.js +++ b/wichteln.js @@ -1,13 +1,13 @@ #!/usr/bin/env node -const fs = require('fs'); -const readline = require('readline'); -const nodemailer = require('nodemailer'); +const fs = require("fs"); +const readline = require("readline"); +const nodemailer = require("nodemailer"); const mailer = nodemailer.createTransport({ - sendmail: true, - newline: 'unix', - path: '/usr/sbin/sendmail' + sendmail: true, + newline: "unix", + path: "/usr/sbin/sendmail" }); function mail(email, name, pick) { @@ -25,58 +25,67 @@ Viel Spaß Thomas Ps.: Bitte gebt nicht mehr als 5 Euro pro Geschenk aus! -`, - }, (err, info) => { - console.log(info.envelope); - console.log(info.messageId); - }); +` + }, + (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; + return new Promise((resolve, reject) => { + const people = []; + const rl = readline.createInterface({ + input: process.stdin }); + rl.on("line", line => { + const [name, email, group] = line.split(/\s+/); + people.push({ name, email, group }); + }); - fs.writeFileSync('./picks.json', JSON.stringify(people.map(({name, pick}) => ({name, pick})), null, 4)); + rl.on("error", reject); - people.forEach(p => mail(p.email, p.name, p.pick)); + rl.on("close", () => { + resolve(people); + }); + }); } +const run = async () => { + const people = await read(); + + if (!people || !people.length) { + throw new Error("input file empty"); + } + + 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.txt`, + people.map(({ name, pick }) => `${name} picked ${pick}`).join("\n") + ); + + people.forEach(p => mail(p.email, p.name, p.pick)); +}; + run();