From 900c1e976ede1cdf6c9931e174e3878dd4133dcd Mon Sep 17 00:00:00 2001 From: ChrisChrome Date: Tue, 28 Oct 2025 07:16:00 -0600 Subject: [PATCH 01/20] Use ami package --- index.js | 90 ++++++++++------------------------------------- package-lock.json | 10 ++++++ package.json | 1 + 3 files changed, 30 insertions(+), 71 deletions(-) diff --git a/index.js b/index.js index 146a8a0..74149ca 100644 --- a/index.js +++ b/index.js @@ -1,81 +1,29 @@ -require("dotenv").config({quiet: true}); -const exec = require("child_process").exec; +require("dotenv").config({ quiet: true }); +const AMI = require("ami").AMISocket +const sock = new AMI({ + connect: { + host: '127.0.0.1', + port: 5038 + }, + credentials: { + username: process.env.AMI_USER, + secret: process.env.AMI_SECRET + }, + events: true +}) const Discord = require("discord.js"); const hook = new Discord.WebhookClient({ url: process.env.DISCORD_WEBHOOK_URL }); const cfTypes = { - CF: "Unconditional", - CFB: "Busy", - CFU: "Unavailable", + CF: "Unconditional", + CFB: "Busy", + CFU: "Unavailable", } -const main = async () => { - const runAsterisk = (command) => - new Promise((resolve) => - exec(command, (error, stdout, stderr) => resolve({ error, stdout, stderr })) - ); - - try { - var forwards = {}; - const commands = [ - 'asterisk -x "database show CF"', - 'asterisk -x "database show CFB"', - 'asterisk -x "database show CFU"', - ]; - for (const command of commands) { - const { error, stdout, stderr } = await runAsterisk(command); - if (error) { - console.error(`Error executing command "${command}": ${error}`); - continue; - } - - const lines = stdout.split('\n'); - for (const line of lines) { - const match = line.match(/^\/(CF|CFB|CFU)\/(\d+)\s+:\s+(.+)$/); - if (match) { - const type = match[1]; - const extension = match[2]; - const target = match[3]; - - forwards[`${type}/${extension}`] = target.replace(/\s+$/, ''); - } - } - } - - // Search all forwards for any target that is between 700 and 800. If it exists, log to console and run `asterisk -x "database del CF[U/B] "` to delete it - for (const [key, target] of Object.entries(forwards)) { - const targetExt = parseInt(target, 10); - if ((targetExt >= 700 && targetExt < 800) || targetExt === 0) { // Also block forwards to 0 (operator line) - console.log(`Deleting forward ${key} to target ${target}`); - await hook.send(`Fuckass with extension ${key.split('/')[1]} tried to forward to ${target}. ${cfTypes[key.split('/')[0]]} Forward has been deleted.`); - const delCommand = `asterisk -x "database del ${key.replace('/', ' ')}"`; - const { error, stdout, stderr } = await runAsterisk(delCommand); - if (error) { - console.error(`Error executing command "${delCommand}": ${error}`); - } else { - console.log(`Successfully deleted forward ${key}`); - } - } - } - } catch (err) { - console.error(`Unexpected error: ${err}`); - } - setTimeout(main, process.env.CHECK_INTERVAL * 1000); // Run every CHECK_INTERVAL seconds -}; - const startup = async () => { - // Run `asterisk -x "core show version"` to get the Asterisk version. If it fails, wait 10 seconds before running main again - exec('asterisk -x "core show version"', (error, stdout, stderr) => { - if (error) { - console.error(`Error executing command: ${error}`); - console.log("Asterisk is not running. Retrying in 10 seconds..."); - setTimeout(startup, 10000); - return; - } - const version = stdout.trim(); - console.log(`Asterisk version: ${version}`); - main(); - }); + sock.connect().then(() => { + console.log(sock.amiVersion) + }) } startup(); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 60f06ee..52dd274 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "ami": "^1.0.0", "discord.js": "^14.24.0", "dotenv": "^17.2.3" } @@ -201,6 +202,15 @@ "npm": ">=7.0.0" } }, + "node_modules/ami": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ami/-/ami-1.0.0.tgz", + "integrity": "sha512-wkuxJl8ahQ4FYVwXvtJpQ7wuRUAqD30ueVpeJ1t5UyYqjzh+GtmrnaeHrXzzp+KO3ukhHZoMrsZlKB0j91oAlw==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/discord-api-types": { "version": "0.38.31", "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.31.tgz", diff --git a/package.json b/package.json index 1019a64..46daa54 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "license": "ISC", "type": "commonjs", "dependencies": { + "ami": "^1.0.0", "discord.js": "^14.24.0", "dotenv": "^17.2.3" } -- 2.43.5 From 5bbb4bf764d13ab2d9491e43bfbda1333834329f Mon Sep 17 00:00:00 2001 From: ChrisChrome Date: Tue, 28 Oct 2025 07:21:22 -0600 Subject: [PATCH 02/20] Import instead? --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 74149ca..c0a3dff 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,5 @@ require("dotenv").config({ quiet: true }); -const AMI = require("ami").AMISocket +const AMI = import("ami").AMISocket const sock = new AMI({ connect: { host: '127.0.0.1', -- 2.43.5 From 0ddf6dac996e9b7a88483d90e1c68c2c36052259 Mon Sep 17 00:00:00 2001 From: ChrisChrome Date: Tue, 28 Oct 2025 07:26:25 -0600 Subject: [PATCH 03/20] Use import everywhere, goofy --- index.js | 9 +++++---- package.json | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/index.js b/index.js index c0a3dff..b7f9912 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,7 @@ -require("dotenv").config({ quiet: true }); -const AMI = import("ami").AMISocket -const sock = new AMI({ +import dotenv from 'dotenv'; +dotenv.config({quiet: true}) +import AMISocket from 'ami'; +const sock = new AMISocket({ connect: { host: '127.0.0.1', port: 5038 @@ -11,7 +12,7 @@ const sock = new AMI({ }, events: true }) -const Discord = require("discord.js"); +import Discord from 'discord.js'; const hook = new Discord.WebhookClient({ url: process.env.DISCORD_WEBHOOK_URL }); const cfTypes = { diff --git a/package.json b/package.json index 46daa54..3aeccd6 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "keywords": [], "author": "", "license": "ISC", - "type": "commonjs", + "type": "module", "dependencies": { "ami": "^1.0.0", "discord.js": "^14.24.0", -- 2.43.5 From db2e410ab58fa23fad0282a2519c0d0659384138 Mon Sep 17 00:00:00 2001 From: ChrisChrome Date: Tue, 28 Oct 2025 07:28:06 -0600 Subject: [PATCH 04/20] Test DBGet --- index.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/index.js b/index.js index b7f9912..5787719 100644 --- a/index.js +++ b/index.js @@ -24,6 +24,12 @@ const cfTypes = { const startup = async () => { sock.connect().then(() => { console.log(sock.amiVersion) + sock.send({ + action: 'DBGetTree', + category: 'CF' + }).then(async (response) => { + console.log(response) + }) }) } -- 2.43.5 From 2a95d6626e57b44c51050d0c2656c30a9e914f61 Mon Sep 17 00:00:00 2001 From: ChrisChrome Date: Tue, 28 Oct 2025 07:28:51 -0600 Subject: [PATCH 05/20] Test 2 --- index.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/index.js b/index.js index 5787719..b36a77f 100644 --- a/index.js +++ b/index.js @@ -21,6 +21,10 @@ const cfTypes = { CFU: "Unavailable", } +sock.on('event', async (event) => { + console.log(event) +}) + const startup = async () => { sock.connect().then(() => { console.log(sock.amiVersion) -- 2.43.5 From 0a982b0115b461e7ee13b9822c86ebccd44ce929 Mon Sep 17 00:00:00 2001 From: ChrisChrome Date: Tue, 28 Oct 2025 07:29:57 -0600 Subject: [PATCH 06/20] Test 2 --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index b36a77f..fe23256 100644 --- a/index.js +++ b/index.js @@ -28,7 +28,7 @@ sock.on('event', async (event) => { const startup = async () => { sock.connect().then(() => { console.log(sock.amiVersion) - sock.send({ + sock.getList({ action: 'DBGetTree', category: 'CF' }).then(async (response) => { -- 2.43.5 From 84c8c5c6e65d1983e47ba787696038c4bc0647fa Mon Sep 17 00:00:00 2001 From: ChrisChrome Date: Tue, 28 Oct 2025 07:31:15 -0600 Subject: [PATCH 07/20] Try again? --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index fe23256..0177f65 100644 --- a/index.js +++ b/index.js @@ -30,7 +30,7 @@ const startup = async () => { console.log(sock.amiVersion) sock.getList({ action: 'DBGetTree', - category: 'CF' + family: 'CF' }).then(async (response) => { console.log(response) }) -- 2.43.5 From b5edd8ee48193b3b710e6bb4b45da561c18f0bc3 Mon Sep 17 00:00:00 2001 From: ChrisChrome Date: Tue, 28 Oct 2025 07:36:28 -0600 Subject: [PATCH 08/20] Big test? --- index.js | 80 ++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 69 insertions(+), 11 deletions(-) diff --git a/index.js b/index.js index 0177f65..d5738c0 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -dotenv.config({quiet: true}) +dotenv.config({ quiet: true }) import AMISocket from 'ami'; const sock = new AMISocket({ connect: { @@ -21,20 +21,78 @@ const cfTypes = { CFU: "Unavailable", } -sock.on('event', async (event) => { - console.log(event) -}) +const main = () => { + var respData = []; + + // getList for CF, CFB, CFU + sock.getList({ + action: 'DBGetTree', + family: 'CF' + }).then(async (response) => { + // Responses are an array of objects. The first should always have eventlist: 'start', and last should have eventlist: 'complete'. Remove these, make an array of objects {key, val} based on the rest of the response objects. + let entries = response.filter(r => r.eventlist !== 'start' && r.eventlist !== 'complete').map(r => ({ key: r.key, val: r.val })); + for (let entry of entries) { + let [type, ext] = entry.key.split('/'); + if (cfTypes[type]) { + respData.push({ + extension: ext, + type: type, + target: entry.val + }); + } + } + + }).then(() => { + sock.getList({ + action: 'DBGetTree', + family: 'CFB' + }).then(async (response) => { + let entries = response.filter(r => r.eventlist !== 'start' && r.eventlist !== 'complete').map(r => ({ key: r.key, val: r.val })); + for (let entry of entries) { + let [type, ext] = entry.key.split('/'); + if (cfTypes[type]) { + respData.push({ + extension: ext, + type: type, + target: entry.val + }); + } + } + }).then(() => { + sock.getList({ + action: 'DBGetTree', + family: 'CFU' + }).then(async (response) => { + let entries = response.filter(r => r.eventlist !== 'start' && r.eventlist !== 'complete').map(r => ({ key: r.key, val: r.val })); + for (let entry of entries) { + let [type, ext] = entry.key.split('/'); + if (cfTypes[type]) { + respData.push({ + extension: ext, + type: type, + target: entry.val + }); + } + } + }).then(() => { + console.log(`Found ${respData.length} call forwards.`); + for (let cf of respData) { + console.log(`Extension ${cf.extension} has ${cfTypes[cf.type]} call forward to ${cf.target}`); + } + setTimeout(main, 60000); // Repeat every 60 seconds + }); + }); + }); +}; const startup = async () => { sock.connect().then(() => { console.log(sock.amiVersion) - sock.getList({ - action: 'DBGetTree', - family: 'CF' - }).then(async (response) => { - console.log(response) - }) - }) + main(); + }).catch((err) => { + console.error('Error connecting to AMI:', err); + setTimeout(startup, 10000); // Retry after 10 seconds + }); } startup(); \ No newline at end of file -- 2.43.5 From f00d5fbde4be2469f29c8bf758cc2fb8a1bf8376 Mon Sep 17 00:00:00 2001 From: ChrisChrome Date: Tue, 28 Oct 2025 07:37:15 -0600 Subject: [PATCH 09/20] Buh --- index.js | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/index.js b/index.js index d5738c0..fefd930 100644 --- a/index.js +++ b/index.js @@ -31,16 +31,7 @@ const main = () => { }).then(async (response) => { // Responses are an array of objects. The first should always have eventlist: 'start', and last should have eventlist: 'complete'. Remove these, make an array of objects {key, val} based on the rest of the response objects. let entries = response.filter(r => r.eventlist !== 'start' && r.eventlist !== 'complete').map(r => ({ key: r.key, val: r.val })); - for (let entry of entries) { - let [type, ext] = entry.key.split('/'); - if (cfTypes[type]) { - respData.push({ - extension: ext, - type: type, - target: entry.val - }); - } - } + console.log(entries) }).then(() => { sock.getList({ -- 2.43.5 From f1edc11f5672f2452debf20c96ad43c8578369ec Mon Sep 17 00:00:00 2001 From: ChrisChrome Date: Tue, 28 Oct 2025 07:38:01 -0600 Subject: [PATCH 10/20] Again --- index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index fefd930..663bc49 100644 --- a/index.js +++ b/index.js @@ -30,7 +30,7 @@ const main = () => { family: 'CF' }).then(async (response) => { // Responses are an array of objects. The first should always have eventlist: 'start', and last should have eventlist: 'complete'. Remove these, make an array of objects {key, val} based on the rest of the response objects. - let entries = response.filter(r => r.eventlist !== 'start' && r.eventlist !== 'complete').map(r => ({ key: r.key, val: r.val })); + let entries = response.filter(r => r.eventlist !== 'start' && r.eventlist !== 'Complete').map(r => ({ key: r.key, val: r.val })); console.log(entries) }).then(() => { @@ -38,7 +38,7 @@ const main = () => { action: 'DBGetTree', family: 'CFB' }).then(async (response) => { - let entries = response.filter(r => r.eventlist !== 'start' && r.eventlist !== 'complete').map(r => ({ key: r.key, val: r.val })); + let entries = response.filter(r => r.eventlist !== 'start' && r.eventlist !== 'Complete').map(r => ({ key: r.key, val: r.val })); for (let entry of entries) { let [type, ext] = entry.key.split('/'); if (cfTypes[type]) { @@ -54,7 +54,7 @@ const main = () => { action: 'DBGetTree', family: 'CFU' }).then(async (response) => { - let entries = response.filter(r => r.eventlist !== 'start' && r.eventlist !== 'complete').map(r => ({ key: r.key, val: r.val })); + let entries = response.filter(r => r.eventlist !== 'start' && r.eventlist !== 'Complete').map(r => ({ key: r.key, val: r.val })); for (let entry of entries) { let [type, ext] = entry.key.split('/'); if (cfTypes[type]) { -- 2.43.5 From 9fcb753bfa13c4aef7353bfe6a4de435aed1163d Mon Sep 17 00:00:00 2001 From: ChrisChrome Date: Tue, 28 Oct 2025 07:40:39 -0600 Subject: [PATCH 11/20] Bwug --- index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 663bc49..10fc354 100644 --- a/index.js +++ b/index.js @@ -40,11 +40,11 @@ const main = () => { }).then(async (response) => { let entries = response.filter(r => r.eventlist !== 'start' && r.eventlist !== 'Complete').map(r => ({ key: r.key, val: r.val })); for (let entry of entries) { - let [type, ext] = entry.key.split('/'); + let [type, ext] = entry.key.split('/').shift(); if (cfTypes[type]) { respData.push({ extension: ext, - type: type, + type: "CFB", target: entry.val }); } -- 2.43.5 From 13dc274a364357fa5df5996f5ba224e9df8ede68 Mon Sep 17 00:00:00 2001 From: ChrisChrome Date: Tue, 28 Oct 2025 07:41:16 -0600 Subject: [PATCH 12/20] Maybe fix filtering? I suck at this --- index.js | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/index.js b/index.js index 10fc354..95630f9 100644 --- a/index.js +++ b/index.js @@ -31,7 +31,16 @@ const main = () => { }).then(async (response) => { // Responses are an array of objects. The first should always have eventlist: 'start', and last should have eventlist: 'complete'. Remove these, make an array of objects {key, val} based on the rest of the response objects. let entries = response.filter(r => r.eventlist !== 'start' && r.eventlist !== 'Complete').map(r => ({ key: r.key, val: r.val })); - console.log(entries) + for (let entry of entries) { + let [type, ext] = entry.key.split('/').shift(); + if (cfTypes[type]) { + respData.push({ + extension: ext, + type: type, + target: entry.val + }); + } + } }).then(() => { sock.getList({ @@ -44,7 +53,7 @@ const main = () => { if (cfTypes[type]) { respData.push({ extension: ext, - type: "CFB", + type: type, target: entry.val }); } @@ -55,16 +64,16 @@ const main = () => { family: 'CFU' }).then(async (response) => { let entries = response.filter(r => r.eventlist !== 'start' && r.eventlist !== 'Complete').map(r => ({ key: r.key, val: r.val })); - for (let entry of entries) { - let [type, ext] = entry.key.split('/'); - if (cfTypes[type]) { - respData.push({ - extension: ext, - type: type, - target: entry.val - }); - } + for (let entry of entries) { + let [type, ext] = entry.key.split('/').shift(); + if (cfTypes[type]) { + respData.push({ + extension: ext, + type: type, + target: entry.val + }); } + } }).then(() => { console.log(`Found ${respData.length} call forwards.`); for (let cf of respData) { -- 2.43.5 From dfadb8a468eb2e0ed780010e4899855bf8a2f11d Mon Sep 17 00:00:00 2001 From: ChrisChrome Date: Tue, 28 Oct 2025 07:42:21 -0600 Subject: [PATCH 13/20] Grr --- index.js | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/index.js b/index.js index 95630f9..eed6baa 100644 --- a/index.js +++ b/index.js @@ -31,16 +31,15 @@ const main = () => { }).then(async (response) => { // Responses are an array of objects. The first should always have eventlist: 'start', and last should have eventlist: 'complete'. Remove these, make an array of objects {key, val} based on the rest of the response objects. let entries = response.filter(r => r.eventlist !== 'start' && r.eventlist !== 'Complete').map(r => ({ key: r.key, val: r.val })); - for (let entry of entries) { - let [type, ext] = entry.key.split('/').shift(); - if (cfTypes[type]) { - respData.push({ - extension: ext, - type: type, - target: entry.val - }); - } - } + for (let entry of entries) { + let [type, ext] = entry.key.split('/').shift(); + console + respData.push({ + extension: ext, + type: type, + target: entry.val + }); + } }).then(() => { sock.getList({ @@ -50,13 +49,12 @@ const main = () => { let entries = response.filter(r => r.eventlist !== 'start' && r.eventlist !== 'Complete').map(r => ({ key: r.key, val: r.val })); for (let entry of entries) { let [type, ext] = entry.key.split('/').shift(); - if (cfTypes[type]) { - respData.push({ - extension: ext, - type: type, - target: entry.val - }); - } + console + respData.push({ + extension: ext, + type: type, + target: entry.val + }); } }).then(() => { sock.getList({ @@ -64,16 +62,15 @@ const main = () => { family: 'CFU' }).then(async (response) => { let entries = response.filter(r => r.eventlist !== 'start' && r.eventlist !== 'Complete').map(r => ({ key: r.key, val: r.val })); - for (let entry of entries) { - let [type, ext] = entry.key.split('/').shift(); - if (cfTypes[type]) { + for (let entry of entries) { + let [type, ext] = entry.key.split('/').shift(); + console respData.push({ extension: ext, type: type, target: entry.val }); } - } }).then(() => { console.log(`Found ${respData.length} call forwards.`); for (let cf of respData) { -- 2.43.5 From 395373d27b139f475196e506771a5040c2dcd960 Mon Sep 17 00:00:00 2001 From: ChrisChrome Date: Tue, 28 Oct 2025 07:44:26 -0600 Subject: [PATCH 14/20] I hate js sometimes: --- index.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index eed6baa..547302c 100644 --- a/index.js +++ b/index.js @@ -32,7 +32,9 @@ const main = () => { // Responses are an array of objects. The first should always have eventlist: 'start', and last should have eventlist: 'complete'. Remove these, make an array of objects {key, val} based on the rest of the response objects. let entries = response.filter(r => r.eventlist !== 'start' && r.eventlist !== 'Complete').map(r => ({ key: r.key, val: r.val })); for (let entry of entries) { - let [type, ext] = entry.key.split('/').shift(); + let stuff = entry.key.split('/'); + let type = stuff[1]; + let ext = stuff[2]; console respData.push({ extension: ext, @@ -48,7 +50,9 @@ const main = () => { }).then(async (response) => { let entries = response.filter(r => r.eventlist !== 'start' && r.eventlist !== 'Complete').map(r => ({ key: r.key, val: r.val })); for (let entry of entries) { - let [type, ext] = entry.key.split('/').shift(); + let stuff = entry.key.split('/'); + let type = stuff[1]; + let ext = stuff[2]; console respData.push({ extension: ext, @@ -63,7 +67,9 @@ const main = () => { }).then(async (response) => { let entries = response.filter(r => r.eventlist !== 'start' && r.eventlist !== 'Complete').map(r => ({ key: r.key, val: r.val })); for (let entry of entries) { - let [type, ext] = entry.key.split('/').shift(); + let stuff = entry.key.split('/'); + let type = stuff[1]; + let ext = stuff[2]; console respData.push({ extension: ext, -- 2.43.5 From 4e8cd9c23f4f2a01399178164a48d121388979d3 Mon Sep 17 00:00:00 2001 From: ChrisChrome Date: Tue, 28 Oct 2025 07:51:37 -0600 Subject: [PATCH 15/20] Bwug --- index.js | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 547302c..e960279 100644 --- a/index.js +++ b/index.js @@ -1,3 +1,10 @@ +const blocked = [ + '0', + '0000', + '9998', + '9999' +]; + import dotenv from 'dotenv'; dotenv.config({ quiet: true }) import AMISocket from 'ami'; @@ -81,8 +88,20 @@ const main = () => { console.log(`Found ${respData.length} call forwards.`); for (let cf of respData) { console.log(`Extension ${cf.extension} has ${cfTypes[cf.type]} call forward to ${cf.target}`); + // Check if forward target is anything in the 700-800 range, or is a number in the blocked list + if ((cf.target >= 700 && cf.target < 800) || blocked.includes(cf.target)) { + // Violation. Remove call forward from db. + console.log(`---> Violation found on extension ${cf.extension}. Removing call forward to ${cf.target}`); + sock.send({ + action: 'DBDel', + family: cf.type, + key: cf.extension + }).then((resp) => { + console.log(`-----> Call forward removed successfully.`); + hook.send(`:no_entry: **Call Forward Removed** :no_entry:\nExtension **${cf.extension}** had a **${cfTypes[cf.type]}** call forward to **${cf.target}** The call forward has been removed.`); + }) } - setTimeout(main, 60000); // Repeat every 60 seconds + setTimeout(main, 1000); // Repeat every 60 seconds }); }); }); @@ -98,4 +117,4 @@ const startup = async () => { }); } -startup(); \ No newline at end of file +startup(); \ No newline at end of file -- 2.43.5 From b5add30dda75ce56b5825dc0dab3eb2b7d3dac55 Mon Sep 17 00:00:00 2001 From: ChrisChrome Date: Tue, 28 Oct 2025 07:52:57 -0600 Subject: [PATCH 16/20] UUUU --- index.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/index.js b/index.js index e960279..faed579 100644 --- a/index.js +++ b/index.js @@ -100,12 +100,13 @@ const main = () => { console.log(`-----> Call forward removed successfully.`); hook.send(`:no_entry: **Call Forward Removed** :no_entry:\nExtension **${cf.extension}** had a **${cfTypes[cf.type]}** call forward to **${cf.target}** The call forward has been removed.`); }) - } - setTimeout(main, 1000); // Repeat every 60 seconds + } + setTimeout(main, 1000); // Repeat every 60 seconds + }; }); }); - }); -}; + }) +} const startup = async () => { sock.connect().then(() => { -- 2.43.5 From 43c81ad43362802470e02fb1ab4b42a4d38d680c Mon Sep 17 00:00:00 2001 From: ChrisChrome Date: Tue, 28 Oct 2025 07:53:34 -0600 Subject: [PATCH 17/20] 5 secs --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index faed579..7e58054 100644 --- a/index.js +++ b/index.js @@ -101,7 +101,7 @@ const main = () => { hook.send(`:no_entry: **Call Forward Removed** :no_entry:\nExtension **${cf.extension}** had a **${cfTypes[cf.type]}** call forward to **${cf.target}** The call forward has been removed.`); }) } - setTimeout(main, 1000); // Repeat every 60 seconds + setTimeout(main, 5000); // Repeat every 60 seconds }; }); }); -- 2.43.5 From e517a259a9c31849e369b1af764a770f54836d07 Mon Sep 17 00:00:00 2001 From: ChrisChrome Date: Tue, 28 Oct 2025 07:54:14 -0600 Subject: [PATCH 18/20] less log --- index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/index.js b/index.js index 7e58054..461e904 100644 --- a/index.js +++ b/index.js @@ -87,7 +87,6 @@ const main = () => { }).then(() => { console.log(`Found ${respData.length} call forwards.`); for (let cf of respData) { - console.log(`Extension ${cf.extension} has ${cfTypes[cf.type]} call forward to ${cf.target}`); // Check if forward target is anything in the 700-800 range, or is a number in the blocked list if ((cf.target >= 700 && cf.target < 800) || blocked.includes(cf.target)) { // Violation. Remove call forward from db. -- 2.43.5 From 73d56cc8c349fc0983397954ea092a5dedb12830 Mon Sep 17 00:00:00 2001 From: ChrisChrome Date: Tue, 28 Oct 2025 07:55:01 -0600 Subject: [PATCH 19/20] Bwug --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 461e904..60ca06a 100644 --- a/index.js +++ b/index.js @@ -30,7 +30,7 @@ const cfTypes = { const main = () => { var respData = []; - + console.log('checking') // getList for CF, CFB, CFU sock.getList({ action: 'DBGetTree', -- 2.43.5 From 62d2f4a7d18377cca13c4574882e5056845f78b8 Mon Sep 17 00:00:00 2001 From: ChrisChrome Date: Tue, 28 Oct 2025 07:55:19 -0600 Subject: [PATCH 20/20] Oops --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 60ca06a..66832e5 100644 --- a/index.js +++ b/index.js @@ -100,8 +100,8 @@ const main = () => { hook.send(`:no_entry: **Call Forward Removed** :no_entry:\nExtension **${cf.extension}** had a **${cfTypes[cf.type]}** call forward to **${cf.target}** The call forward has been removed.`); }) } - setTimeout(main, 5000); // Repeat every 60 seconds }; + setTimeout(main, 5000); // Repeat every 60 seconds }); }); }) -- 2.43.5