require("dotenv").config({ quiet: true }); var ami = new require('asterisk-manager')(process.env.AMI_PORT, process.env.AMI_HOST, process.env.AMI_USER, process.env.AMI_PASS, true); const express = require("express"); const app = express(); ami.on('error', function (err) { console.log(err); }); // ami.on('managerevent', function (evt) { // console.log(evt); // }); // generate uid for the doorbell call (6 char alphanumeric) function generateUID() { return Math.random().toString(36).substring(2, 8); } function getDoorbellStatus(uid) { return new Promise((resolve, reject) => { console.log(`Getting doorbell status for UID: ${uid}`); ami.action({ action: 'dbget', family: 'rblxdoor', key: uid }, (err, res) => { if (err) { reject(err); } else { let listener = (evt) => { if (evt.actionId === res.actionId) { resolve(evt); ami.removeListener('dbgetresponse', listener); } } ami.on('dbgetresponse', listener); } }); }); } function genDoorbellCall(tn) { if (!tn) throw new Error('Phone number is required'); let uid = generateUID(); ami.action({ action: 'dbput', family: 'rblxdoor', key: uid, val: 1 }, (err, res) => { if (err) { console.log(err); } else { ami.action({ action: 'originate', channel: `Local/${tn}@from-internal`, context: 'roblox-door', exten: 's', priority: 1, async: true, variable: { UID: uid }, callerid: `Doorbell <18663362697>` }, (err, res) => { if (err) { console.log(err); return false; } else { console.log(uid) return uid; } }); } }) return uid } // ami.action({ // action: 'originate', // channel: 'PJSIP/100', // context: 'roblox-door', // exten: 's', // priority: 1, // async: true, // variables: { // UID: generateUID() // } // }, (err, res) => { // if (err) { // console.log(err); // } else { // console.log(res); // } // }); app.get("/doorbell/:tn", (req, res) => { let tn = req.params.tn; if (!tn) { return res.status(400).json({ error: 'Phone number (tn) is required' }); } let uid = genDoorbellCall(tn); if (uid !== false) { res.json({ success: true, uid }); } else { res.status(500).json({ success: false, error: 'Failed to generate doorbell call', detail: err }); } }); app.get("/status/:uid", async (req, res) => { let uid = req.params.uid; if (!uid) { return res.status(400).json({ error: 'UID is required' }); } try { let status = await getDoorbellStatus(uid); res.json({ success: true, status: status.val }); } catch (err) { res.status(500).json({ success: false, error: err.message }); } }); app.listen(process.env.SERVER_PORT, () => { console.log(`Server is running on port ${process.env.SERVER_PORT}`); });