commit 6ea454ce1c991c77f77b5e58943fbf5c48d1df25 Author: Thomas Ruoff Date: Mon Dec 10 23:06:24 2018 +0100 inital commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e082278 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +picks.json +node_modules diff --git a/README.md b/README.md new file mode 100644 index 0000000..c52c763 --- /dev/null +++ b/README.md @@ -0,0 +1,19 @@ +# Stupides Wichtel Skript + +Zieht einen Wichtel für ein Liste von Leuten und sendet eine E-Mail an den +Beschenker. + +# Usage + +Die Liste der Teilnehmer wird aus `./people.txt` eingelesen und erwartet folgendes Format pro Zeile. + +` ` + +`GroupId` ist optional, falls angegeben wird nur unterschiedlichen GroupIds +gezogen (z.B. Fred aus Familie A soll nur aus Familie B, C, ... ziehen können). + +Die Ziehung erfolgt per Zufall reihum. Falls für einen Teilnehmer kein Los +mehr zu ziehen gibt, wird ein Fehler geworfen. + + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..3f827e4 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,13 @@ +{ + "name": "wichteln", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "nodemailer": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-4.7.0.tgz", + "integrity": "sha512-IludxDypFpYw4xpzKdMAozBSkzKHmNBvGanUREjJItgJ2NYcK/s8+PggVhj7c2yGFQykKsnnmv1+Aqo0ZfjHmw==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..f978d86 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "wichteln", + "version": "1.0.0", + "description": "", + "main": "wichteln.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "nodemailer": "^4.7.0" + } +} diff --git a/people.txt b/people.txt new file mode 100644 index 0000000..d2a3780 --- /dev/null +++ b/people.txt @@ -0,0 +1,4 @@ +Name1 email1@example.com GroupA +Name2 email2@example.com GroupB +Name3 email3@example.com GroupB +Name4 email4@example.com GroupA diff --git a/wichteln.js b/wichteln.js new file mode 100755 index 0000000..97fd8b5 --- /dev/null +++ b/wichteln.js @@ -0,0 +1,82 @@ +#!/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();