Files
FW_Aurich_PrinterService/src/index.js
2023-06-13 17:25:28 +02:00

236 lines
6.2 KiB
JavaScript

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 += `<div id="centerPoint" style="height: 15px;width: 15px;border-radius: 50%;background-color: red;position: absolute;border: 3px solid green;margin: auto;top: 0;bottom: 0;left: 0;right: 0;z-index: 100;"></div><style>.leaflet-control-container {display:none !important;} </style>`;
});
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}`);
});