mirror of
https://github.com/tomru/wichteln.git
synced 2026-03-03 06:27:15 +01:00
inital commit
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
picks.json
|
||||
node_modules
|
||||
19
README.md
Normal file
19
README.md
Normal 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
13
package-lock.json
generated
Normal 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
14
package.json
Normal 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
4
people.txt
Normal 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
82
wichteln.js
Executable 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();
|
||||
Reference in New Issue
Block a user