require("dotenv").config() let registrationOpen, branding; const { sendInfo } = require("./src/telegram") function loadEnv() { registrationOpen = process.env.REGISTRATION_OPEN === "true" branding = { title: process.env.BRANDING_TITLE || "SAR Link", logo: process.env.BRANDING_LOGO || "/public/logo.png", bankDetails: { name: process.env.BANK_NAME || "Bank Name", accountNumber: process.env.ACCOUNT_NUMBER || "1234567890", accountName: process.env.ACCOUNT_NAME || "Account Name", }, price: { normal: process.env.PRICE || "100", roaming: process.env.ROAMING_PRICE || "50", gaming: process.env.GAMING_PRICE || "100", currency: process.env.PRICE_CURRENCY || "MVR", } } } loadEnv() // watch for changes to .env file const path = require("path") const fs = require("fs") fs.watchFile(path.join(__dirname, ".env"), (curr, prev) => { delete require.cache[require.resolve("dotenv")] require("dotenv").config({ override: true }) loadEnv() console.log(`Registration is now ${registrationOpen ? "open" : "closed"}`) }) // initialize express const express = require("express") const app = express() app.set("view engine", "ejs") app.set("views", "./src/views") app.use("/public", express.static("./src/public")) app.use(express.json()) app.use(express.urlencoded({ extended: true })) // add multer const multer = require("multer") if (!fs.existsSync("uploads")) fs.mkdirSync("uploads", { recursive: true }) if (!fs.existsSync("registrations.csv")) fs.writeFileSync("registrations.csv", "Customer Name,MAC Address,Device Name,Roaming,Gaming,Wired,Receipt\n", { encoding: "utf-8" }); const upload = multer({ storage: multer.diskStorage({ destination: (req, file, cb) => { cb(null, "./uploads") }, filename: (req, file, cb) => { cb(null, `${Date.now()}- ${req.body["device_name"]} - ${file.originalname}`) }, }) }) // app.use(upload.single("receipt")) // routes app.get("/", (req, res) => { res.render(registrationOpen ? "index" : "closed", { branding, message: "" }) }); app.post("/register", upload.single("transfer_receipt"), (req, res) => { if (!registrationOpen) { res.render("closed") return; } const { customer_name, mac_address, device_name, is_roaming, is_gaming } = req.body const receipt = req.file; if (!customer_name || !mac_address || !device_name || !receipt) { res.render("index", { branding, message: "Please fill all fields" }) return; } // save info to csv file const csv = `${customer_name},${mac_address},${device_name},${is_roaming === "on" ? "true" : "false"},${is_gaming === "on" ? "true" : "false"},false,${receipt.path}\n` fs.appendFile("registrations.csv", csv, (err) => { if (err) { console.error(err) res.render("index", { branding, message: "An internal error occurred" }) } }); // send receipt to telegram sendInfo(receipt.path, { customer_name, mac_address, device_name, is_roaming, is_gaming }) .then(() => { res.render("success", { branding }) }) .catch((error) => { console.error(error) res.render("index", { branding, message: "An internal error occurred" }) }) }) const port = process.env.PORT || 4818; app.listen(port, '0.0.0.0', () => { console.log(`Server is running on port ${port}`); });