From 6cc41936a4fbaa26641bff75f86a148d7df083af Mon Sep 17 00:00:00 2001 From: Jack Date: Thu, 6 Mar 2025 20:55:36 +0000 Subject: [PATCH] ALL OF IT --- .gitignore | 1 + Dockerfile | 29 ++++++ crontab | 1 + email.html | 55 ++++++++++ jobChecker.js | 106 +++++++++++++++++++ package-lock.json | 238 +++++++++++++++++++++++++++++++++++++++++++ package.json | 10 ++ workflows/build.yaml | 24 +++++ 8 files changed, 464 insertions(+) create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 crontab create mode 100644 email.html create mode 100644 jobChecker.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 workflows/build.yaml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..07e6e47 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/node_modules diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..02e38b4 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,29 @@ +FROM node:18-alpine + +RUN apk update && apk upgrade + +WORKDIR /opt/app + +COPY ./email.html /opt/app/ + +COPY ./jobChecker.js /opt/app/ + +COPY package.json /opt/app/ + +COPY package-lock.json /opt/app/ + +RUN npm install + +#COPY ./crontab /etc/cron.d/crontab + +#RUN chmod 0644 /etc/cron.d/crontab + +#RUN /usr/bin/crontab /etc/cron.d/crontab + +#RUN apk add sudo bash + +RUN touch /var/log/cron.log + +#CMD bash -c "crond -f -d 8" + +CMD node jobChecker.js \ No newline at end of file diff --git a/crontab b/crontab new file mode 100644 index 0000000..dca564d --- /dev/null +++ b/crontab @@ -0,0 +1 @@ +0 0 * * WED node /opt/app/jobChecker.js \ No newline at end of file diff --git a/email.html b/email.html new file mode 100644 index 0000000..e7bc8b1 --- /dev/null +++ b/email.html @@ -0,0 +1,55 @@ + + + + + + +
+

+ ITS WEDNESDAY MY DUDES!!!! +

+
+ + +
+
+
+
+

+ ITS WEDNESDAY +

+
+ +
+ + \ No newline at end of file diff --git a/jobChecker.js b/jobChecker.js new file mode 100644 index 0000000..91a55c2 --- /dev/null +++ b/jobChecker.js @@ -0,0 +1,106 @@ +var nodemailer = require("nodemailer"); +var handlebars = require("handlebars"); +const cron = require('node-cron'); +var fs = require("fs"); +let transporter = nodemailer.createTransport({ + pool: true, + host: "mail.tgj.services", + port: 587, + secure: false, // use TLS + auth: { + user: "admin@tgj.services", + pass: "&,kErryPRominSBulOrTArDliaThstINtS,70", + }, + tls: { + ciphers:'SSLv3' + } + }); + +var prefix = "/opt/app/" + +var readHTMLFile = function(path, callback) { + fs.readFile(path, {encoding: 'utf-8'}, function (err, html) { + if (err) { + throw err; + callback(err); + } + else { + callback(null, html); + } + }); +}; + +var mysql = require('mysql'); +const { exit } = require("process"); + +var con = mysql.createConnection({ + host: "db.tgj.services", + user: "wednesday", + password: "ki5htfYWwWUCdfqu", + database: "wednesday_db" +}); + +console.log("waiting for wednesday!") + +con.connect(function(err) { + if (err) throw err; + //console.log("You are connected!"); + console.log("connected waiting for wednesday!") + cron.schedule('0 0 * * WED', function() { + console.log('running a task every wed'); + check(); + }); +}); + + + +var count = 0; + +//console.log(mURL); + +function check(){ + query = "SELECT user_email FROM users WHERE need_wed = '1'"; + con.query(query, function(error,results,fields){ + if(error) throw error; + console.log(results); + results.forEach(row => { + var htmlToSend; + readHTMLFile(prefix+"email.html",function(err,html){ + //console.log(html) + //console.log(randURL) + var template = handlebars.compile(html); + var replacements = { + htmlURL: "https://tgj.services", + }; + + + htmlToSend = template(replacements); + var mailOptions = { + from: 'wednesday@tgj.services', + to: row["user_email"], + subject: "BACK BY POPULAR DEMAND: IT'S WEDNESDAY MY DUUDES!", + html: htmlToSend + }; + //console.log(htmlToSend) + console.log("Job Finished! - " + row["user_email"]); + SendMail(mailOptions,results); + }); + count += 1; + }); + }); +} + +function SendMail(options,results){ + transporter.sendMail(options, function(error, info){ + if (error) { + console.log(error); + } else { + console.log('Email sent: ' + info.response); + } + }); + console.log(count) +} + +function disconnect(){ + con.end(); +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..99610b0 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,238 @@ +{ + "name": "wednesday-emails", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "cron": "^4.1.0", + "handlebars": "^4.7.8", + "msql": "^1.0.3", + "mysql": "^2.18.1", + "node-cron": "^3.0.3", + "nodemailer": "^6.10.0" + } + }, + "node_modules/@types/luxon": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz", + "integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==", + "license": "MIT" + }, + "node_modules/bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cron": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cron/-/cron-4.1.0.tgz", + "integrity": "sha512-wmcuXr2qP0UZStYgwruG6jC2AYSO9n5VMm2t93hmcEXEjWY3S2bsXe3sfGUrTs/uQ1AvRCrZ0Pp9Q032L/V9tw==", + "license": "MIT", + "dependencies": { + "@types/luxon": "~3.4.0", + "luxon": "~3.5.0" + }, + "engines": { + "node": ">=18.x" + } + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/luxon": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", + "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/msql": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/msql/-/msql-1.0.3.tgz", + "integrity": "sha512-lzO7VQjSWu38g5iHkqOV9qSS5LhiWLFRKeXuEZOwfAXn2vOdLnEK+KoOLRn3YNogegXacG2A75YwmvDqH81S7A==", + "license": "MIT" + }, + "node_modules/mysql": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", + "license": "MIT", + "dependencies": { + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/node-cron": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-3.0.3.tgz", + "integrity": "sha512-dOal67//nohNgYWb+nWmg5dkFdIwDm8EpeGYMekPMrngV3637lqnX0lbUcCtgibHTz6SEz7DAIjKvKDFYCnO1A==", + "license": "ISC", + "dependencies": { + "uuid": "8.3.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/nodemailer": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.0.tgz", + "integrity": "sha512-SQ3wZCExjeSatLE/HBaXS5vqUOQk6GtBdIIKxiFdmm01mOQZX/POJkO3SUX1wDiYcwUOJwT23scFSC9fY2H8IA==", + "license": "MIT-0", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..fd059a2 --- /dev/null +++ b/package.json @@ -0,0 +1,10 @@ +{ + "dependencies": { + "cron": "^4.1.0", + "handlebars": "^4.7.8", + "msql": "^1.0.3", + "mysql": "^2.18.1", + "node-cron": "^3.0.3", + "nodemailer": "^6.10.0" + } +} diff --git a/workflows/build.yaml b/workflows/build.yaml new file mode 100644 index 0000000..cc61c45 --- /dev/null +++ b/workflows/build.yaml @@ -0,0 +1,24 @@ +name: Build and push image + +on: + push: + branches: [main] + +jobs: + Build: + runs-on: ubuntu-latest + steps: + - name: Check out repository code + uses: actions/checkout@v3 + with: + token: ${{ gitsecrets.token }} + - name: Install + run: curl -fsSL get.docker.com | bash + - name: Clone + run: git clone https://git.tgj.services/thatguyjack/wednesday-emails.git . + - name: Login + run: echo "${{ secrets.DOCKERHUB_TOKEN }}" | docker login https://git.tgj.services -u ThatGuyJack --password-stdin + - name: Buildx Container + run: docker buildx create --name buildx --driver=docker-container + - name: Build wednesday + run: docker buildx build --builder=buildx --platform=linux/amd64 . -t git.tgj.services/thatguyjack/wednesday-emails:latest --push