From 379dc9f714182e68003dbf6ce183b80e51e93af6 Mon Sep 17 00:00:00 2001 From: ChrisChrome Date: Wed, 28 May 2025 10:34:30 -0600 Subject: [PATCH] Add LRN Lookup --- index.js | 165 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 137 insertions(+), 28 deletions(-) diff --git a/index.js b/index.js index ba95ea2..a8f0d12 100644 --- a/index.js +++ b/index.js @@ -23,7 +23,7 @@ db.push const commands = [ { - name: "lookup", + name: "cid", description: "Lookup a CallerID", contexts: [0, 1, 2], integration_types: [0, 1], @@ -40,6 +40,32 @@ const commands = [ type: 5 } ] + }, + { + name: "lrn", + description: "Lookup a Local Routing Number", + contexts: [0, 1, 2], + integration_types: [0, 1], + options: [ + { + name: "did", + description: "The number to look up (11 digit US only!)", + type: 4, + required: true + }, + { + name: "ani", + description: "The ANI to use for the lookup. i.e the caller's number (for routing info) (11 digit US only!)", + type: 4, + required: false + }, + { + name: "show", + description: "Whether to show the response to everyone or not.", + type: 5, + required: false + } + ] } ] @@ -57,36 +83,119 @@ Client.on("ready", async () => { }) Client.on("interactionCreate", async (interaction) => { - switch(interaction.type) { + switch (interaction.type) { case Discord.InteractionType.ApplicationCommand: - let show = !interaction.options.getBoolean("show"); - if (show == null) show = true; - let number = interaction.options.getInteger("number") - if (!/^\d{11}$/.test(number)) return interaction.reply({ephemeral: true, content: "<:invalid:1305271064993071185> That's not a valid number! (11 digit US only)"}); - if (await db.exists(`/cache/${number}`)) { - cached = await db.getData(`/cache/${number}`); - } else { - cached = {} - } - if (!cached.cnam || new Date() > new Date(cached?.expires)) { - // Old, get from API - interaction.reply({ephemeral: show, content: `<:checking:1305271116134092842> Looking up \`${number}\``}).then(() => { - axios.get(process.env.API_URL.replaceAll("%n", number)).then((response) => { - db.push(`/cache/${number}`, { - timestamp: new Date(), - expires: new Date(new Date().getTime() + 7 * 24 * 60 * 60 * 1000), - cnam: response.data + switch (interaction.commandName) { + case "cid": + let show = !interaction.options.getBoolean("show"); + if (show == null) show = true; + let number = interaction.options.getInteger("number") + if (!/^\d{11}$/.test(number)) return interaction.reply({ ephemeral: true, content: "<:invalid:1305271064993071185> That's not a valid number! (11 digit US only)" }); + if (await db.exists(`/cache/${number}`)) { + cached = await db.getData(`/cache/${number}`); + } else { + cached = {} + } + if (!cached.cnam || new Date() > new Date(cached?.expires)) { + // Old, get from API + interaction.reply({ ephemeral: show, content: `<:checking:1305271116134092842> Looking up \`${number}\`` }).then(() => { + axios.get(process.env.CNAM_API_URL.replaceAll("%n", number)).then((response) => { + db.push(`/cache/${number}`, { + timestamp: new Date(), + expires: new Date(new Date().getTime() + 7 * 24 * 60 * 60 * 1000), + cnam: response.data + }); + interaction.editReply({ ephemeral: show, content: `<:success:1305271084806963220> CNAM for \`${number}\` is \`${response.data}\`` }) + }).catch((err) => { + interaction.editReply({ ephemeral: show, content: `<:server_error:1305271074551758868> There was a server error when trying to get that!` }) + }) }); - interaction.editReply({ephemeral: show, content: `<:success:1305271084806963220> CNAM for \`${number}\` is \`${response.data}\``}) - }).catch((err) => { - interaction.editReply({ephemeral: show, content: `<:server_error:1305271074551758868> There was a server error when trying to get that!`}) - }) - }); - } else { - // Spit out cached version - interaction.reply({ephemeral: show, content: `<:cached:1305276187966443612> CNAM for \`${number}\` is \`${cached.cnam}\`\n-# This was cached `}) + } else { + // Spit out cached version + interaction.reply({ ephemeral: show, content: `<:cached:1305276187966443612> CNAM for \`${number}\` is \`${cached.cnam}\`\n-# This was cached ` }) + } + break; + + case "lrn": + let showLrn = !interaction.options.getBoolean("show"); + if (showLrn == null) showLrn = true; + let did = interaction.options.getInteger("did") + if (!/^\d{11}$/.test(did)) return interaction.reply({ ephemeral: true, content: "<:invalid:1305271064993071185> That's not a valid number! (11 digit US only)" }); + let ani = interaction.options.getInteger("ani") || null; + if (ani && !/^\d{11}$/.test(ani)) { + return interaction.reply({ ephemeral: true, content: "<:invalid:1305271064993071185> That's not a valid ANI! (11 digit US only)" }); + } + if (await db.exists(`/lrncache/${did}`)) { + cached = await db.getData(`/lrncache/${did}`); + } else { + cached = {} + } + if (!cached.lrn || new Date() > new Date(cached?.expires)) { + // Old, get from API + interaction.reply({ ephemeral: showLrn, content: `<:checking:1305271116134092842> Looking up \`${did}\`` }).then(() => { + axios.get(process.env.LRN_API_URL.replaceAll("%did", did).replaceAll("%ani", ani || "")).then((response) => { + let lrn = response.data; + /*lrn data: + {"tn":"15809197945","lrn":"15809197945","ocn":"5813","lata":"536","city":"LAWTON","ratecenter":"LAWTON","province":"OK","jurisdiction":"INDETERMINATE","local":"INDETERMINATE","lec":"CELLCO PARTNERSHIP DBA VERIZON WIRELESS - OK","lectype":"WIRELESS","spid":"6006","activation":"1241582400"} + */ + db.push(`/lrncache/${did}`, { + timestamp: new Date(), + expires: new Date(new Date().getTime() + 7 * 24 * 60 * 60 * 1000), // 7 days + lrn + }); + interaction.editReply({ + ephemeral: showLrn, embeds: [{ + title: `LRN for ${did}`, + fields: [ + { name: "LRN", value: `\`${lrn.lrn}\`` || "`NULL`", inline: true }, + { name: "OCN", value: `\`${lrn.ocn}\`` || "`NULL`", inline: true }, + { name: "LATA", value: `\`${lrn.lata}\`` || "`NULL`", inline: true }, + { name: "City", value: `\`${lrn.city}\`` || "`NULL`", inline: true }, + { name: "Rate Center", value: `\`${lrn.ratecenter}\`` || "`NULL`", inline: true }, + { name: "Province", value: `\`${lrn.province}\`` || "`NULL`", inline: true }, + { name: "Jurisdiction", value: `\`${lrn.jurisdiction}\`` || "`NULL`", inline: true }, + { name: "Local", value: `\`${lrn.local}\`` || "`NULL`", inline: true }, + { name: "LEC", value: `\`${lrn.lec}\`` || "`NULL`", inline: true }, + { name: "LEC Type", value: `\`${lrn.lectype}\`` || "`NULL`", inline: true }, + { name: "SPID", value: `\`${lrn.spid}\`` || "`NULL`", inline: true }, + { name: "Activation Date", value: `` } + ], + footer: { text: "This data is provided by the LRN API" }, + color: 0x00FF00 + }] + }) + }).catch((err) => { + console.error(err); + interaction.editReply({ ephemeral: showLrn, content: `<:server_error:1305271074551758868> There was a server error when trying to get that!` }) + }) + }); + } else { + // Spit out cached version + let lrn = cached.lrn; + interaction.reply({ + ephemeral: showLrn, embeds: [{ + title: `LRN for ${did}`, + fields: [ + { name: "LRN", value: `\`${lrn.lrn}\`` || "`NULL`", inline: true }, + { name: "OCN", value: `\`${lrn.ocn}\`` || "`NULL`", inline: true }, + { name: "LATA", value: `\`${lrn.lata}\`` || "`NULL`", inline: true }, + { name: "City", value: `\`${lrn.city}\`` || "`NULL`", inline: true }, + { name: "Rate Center", value: `\`${lrn.ratecenter}\`` || "`NULL`", inline: true }, + { name: "Province", value: `\`${lrn.province}\`` || "`NULL`", inline: true }, + { name: "Jurisdiction", value: `\`${lrn.jurisdiction}\`` || "`NULL`", inline: true }, + { name: "Local", value: `\`${lrn.local}\`` || "`NULL`", inline: true }, + { name: "LEC", value: `\`${lrn.lec}\`` || "`NULL`", inline: true }, + { name: "LEC Type", value: `\`${lrn.lectype}\`` || "`NULL`", inline: true }, + { name: "SPID", value: `\`${lrn.spid}\`` || "`NULL`", inline: true }, + { name: "Activation Date", value: `` } + ], + footer: { text: "This is cached data." }, + color: 0x00FF00 + }] + }) + } + break; } - break; } });