129 lines
2.7 KiB
JavaScript
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}`);
|
|
}); |