import pdfLib from "pdf-to-printer"; import { jsPDF } from "jspdf"; import fs from "fs"; import puppeteer from 'puppeteer'; import express from 'express'; import Joi from 'joi'; import TelegramBot from 'node-telegram-bot-api'; import https from 'https'; import axios from "axios"; const Logo = fs.readFileSync("./assets/Logo_fwaur.png", { encoding: "latin1" }); const config = JSON.parse(fs.readFileSync("./config.json", "utf8")); const schema = Joi.object({ foreign_id: Joi.string().required(), title: Joi.string().required(), text: Joi.string().required(), address: Joi.string().required(), lat: Joi.number().required(), lng: Joi.number().required(), vehicle: Joi.array().items(Joi.number()).required(), ts_create: Joi.number().required(), }); const printerName = config.printer_device_id; const PORT = config.port || 2000; const cacheFolder = "./cache/"; // Certificate const privateKey = fs.readFileSync("./assets/ssl/privkey.pem"); const certificate = fs.readFileSync("./assets/ssl/cert.pem"); const credentials = { key: privateKey, cert: certificate, }; let bot = null; const messageIDs = [1034133487]; function sendMessage(msg, idList) { idList.forEach((id) => { bot.sendMessage(id, msg); }); } if (config.activate_telegram) { const token = "6150769224:AAGhBagPEi23QtBJl65YNuwEBBXwHguDV0E"; bot = new TelegramBot(token, { polling: true }); bot.setMyCommands([ { command: "/chatid", description: "Zeigt deine Chat ID" }, { command: "/druckerliste", description: "Zeigt alle Drucker" }, ]); bot.on("message", async (msg) => { const chatId = msg.chat.id; switch (msg.text) { case "/chatid": bot.sendMessage(chatId, "Deine Chat ID ist: " + chatId); break; case "/druckerliste": let message = ""; const printers = await pdfLib.getPrinters(); printers.forEach((printer) => { message += printer.deviceId + "\n"; }); bot.sendMessage(chatId, "Drucker Liste:\n" + message); default: } }); sendMessage("[INFO]: Drucker Service wird gestartet", messageIDs); } async function printFile(_filePath, count = 1) { await pdfLib.print(_filePath, { printer: printerName, copies: count, }); } async function createPDF(_alarmData) { const doc = new jsPDF({ orientation: "landscape" }); //Header doc.addImage(Logo, "PNG", 240, 5, 44.35, 15.25); doc.setFontSize(14); doc.text(_alarmData.foreign_id, 286, 205, { align: "right" }); doc.setFontSize(20); doc.text( _alarmData.title + " - " + new Date(_alarmData.ts_create * 1000).toLocaleString(), 10, 15 ); doc.setFontSize(14); doc.text(_alarmData.text.split("RIC")[0], 10, 22); doc.setTextColor(0, 0, 0); doc.setFontSize(14); doc.text(_alarmData.address, 10, 205); await puppeteerGetImage(_alarmData.lat, _alarmData.lng); const mapImg = fs.readFileSync(cacheFolder + "map.png", "base64"); doc.addImage(mapImg, 10, 25); doc.save(_alarmData.filePath); } async function puppeteerGetImage(lat, lng) { const browser = await puppeteer.launch({ headless: true }); const page = await browser.newPage(); await page.setViewport({ // width: 720, // height: 500, width: 1050, height: 650, deviceScaleFactor: 1, }); await page.goto(`https://umap.openstreetmap.de/de/map/feuerwehr-aurich_22583#18/${lat}/${lng}`); await page.waitForNetworkIdle(); await page.evaluate(() => { document.body.innerHTML += `
`; }); await page.screenshot({ path: cacheFolder + "map.png" }); await browser.close(); return; } async function main(data) { if (config.activate_telegram) { sendMessage("[INFO]: Einsatdepesche wird Gedruckt - " + data.title, messageIDs); } const filePath = cacheFolder + data.foreign_id + ".pdf"; await createPDF({ filePath, ...data }); console.log("PDF created, printing now"); console.log(cacheFolder + data.foreign_id + ".pdf"); await printFile(filePath, config.prints || 1); } // Express Server const app = express(); app.use(express.json()); app.get('/depesche', async (req, res) => { console.log("[INFO] Received print request"); let value = {} try { await axios.get("https://app.divera247.com/api/v2/alarms?accesskey=qX1RZwmThqB0mFDkd_Bx7CNja6eHvoSCRjyb4RyGBZ40afdai6lWXbH_1YvbB5Uy") .then((res) => { if (config.debug) { fs.writeFileSync(cacheFolder + "data.json", JSON.stringify(res.data)) } console.log(res.data) value = res.data.data.items[res.data.data.sorting[0]] }) } catch (error) { if (config.activate_telegram) { sendMessage("[ERROR] Divera data error(Drucker Service): " + error, messageIDs) } return res.status(500).send(error); } if (value == {}) { if (config.activate_telegram) { sendMessage("[ERROR] No Value Data from Divera (Drucker Service): ", messageIDs) } return res.status(500).send("No Data"); } await main(value).catch((err) => { console.log(err); if (config.activate_telegram) { sendMessage("[ERROR] Internal Server Error (Drucker Service): " + err, messageIDs); } return res.status(500).send(err); }); return res.send("ok"); }); app.get("/health", (req, res) => { res.send("ok"); }); app.post("/states/status", (req, res) => { if (req.query.accesskey != config.accesskey) { return res.status(401).json({ "success": false, "error": "Unauthorized" }); } // Append request body to file fs.appendFileSync(cacheFolder + "status.json", JSON.stringify({ method: "POST", body: req.body, query: req.query }) + "\n"); res.json({ "success": true, "data": req.body }); }); app.get("/states/status", (req, res) => { if (req.query.accesskey != config.accesskey) { return res.status(401).json({ "success": false, "error": "Unauthorized" }); } // Append request body to file fs.appendFileSync(cacheFolder + "status.json", JSON.stringify({ method: "GET", body: req.body, query: req.query }) + "\n"); res.json({ "success": true, data: req.query }); }); const httpsServer = https.createServer(credentials, app); httpsServer.listen(PORT, () => { console.log(`PDF Printing Service listening on port ${PORT}`); });