RBX-Door-Phone/index.js

129 lines
2.7 KiB
JavaScript

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}`);
});