inital commit

This commit is contained in:
Thomas Ruoff
2018-12-10 23:06:24 +01:00
commit 6ea454ce1c
6 changed files with 134 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
picks.json
node_modules

19
README.md Normal file
View File

@@ -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.
`<Name> <Email> <GroupId>`
`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.

13
package-lock.json generated Normal file
View File

@@ -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=="
}
}
}

14
package.json Normal file
View File

@@ -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"
}
}

4
people.txt Normal file
View File

@@ -0,0 +1,4 @@
Name1 email1@example.com GroupA
Name2 email2@example.com GroupB
Name3 email3@example.com GroupB
Name4 email4@example.com GroupA

82
wichteln.js Executable file
View File

@@ -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();