Merge pull request 'Feature: Password Reset Functionality' (#4) from dev into main
Reviewed-on: #4
This commit is contained in:
commit
1a19ca954d
|
|
@ -303,5 +303,10 @@ module.exports = [
|
|||
"type": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "reset",
|
||||
"description": "Reset or change your extension password", // Opens a modal to reset password
|
||||
"type": 1
|
||||
}
|
||||
]
|
||||
53
freepbx.js
53
freepbx.js
|
|
@ -108,7 +108,6 @@ class FreepbxManager {
|
|||
vmPassword: $vmPassword
|
||||
email: ""
|
||||
maxContacts: "100"
|
||||
umEnable: false
|
||||
}) {
|
||||
status
|
||||
}
|
||||
|
|
@ -155,24 +154,47 @@ class FreepbxManager {
|
|||
return await this.pbxCall(query);
|
||||
}
|
||||
|
||||
// async updateName(ext, name) {
|
||||
// const query = gql`
|
||||
// mutation updateName($ext: ID!, $name: String!) {
|
||||
// updateExtension(input: {extensionId: $ext, name: $name}) {
|
||||
// status,
|
||||
// message
|
||||
// }
|
||||
// }`;
|
||||
async updateExtName(ext, name) {
|
||||
const query = gql`
|
||||
mutation updateExt($ext: ID!, $name: String) {
|
||||
updateExtension(input: {
|
||||
name: $name
|
||||
extensionId: $ext
|
||||
}) {
|
||||
status,
|
||||
message
|
||||
}
|
||||
}`;
|
||||
|
||||
// const variables = {
|
||||
// ext,
|
||||
// name,
|
||||
// };
|
||||
const variables = {
|
||||
name,
|
||||
ext
|
||||
};
|
||||
|
||||
// return await this.pbxCall(query, variables);
|
||||
// }
|
||||
return await this.pbxCall(query, variables);
|
||||
}
|
||||
// TODO: Implement updateName method, Current implementation resets extension for some reason
|
||||
|
||||
async updateExtPassword(ext, oldName, password) {
|
||||
const query = gql`
|
||||
mutation updateExt($ext: ID!, $name: String, $password: String) {
|
||||
updateExtension(input: {
|
||||
name: $name
|
||||
extensionId: $ext
|
||||
extPassword: $password
|
||||
}) {
|
||||
status,
|
||||
message
|
||||
}
|
||||
}`;
|
||||
const variables = {
|
||||
ext,
|
||||
password,
|
||||
name: oldName
|
||||
};
|
||||
return await this.pbxCall(query, variables);
|
||||
}
|
||||
|
||||
async joinPageGroup(ext, pageGroup) {
|
||||
const [lookup] = await this.pool.query('SELECT * FROM paging_groups WHERE page_number = ? AND ext = ?', [pageGroup, ext]);
|
||||
if (lookup) {
|
||||
|
|
@ -208,7 +230,6 @@ class FreepbxManager {
|
|||
}
|
||||
nextExt++;
|
||||
}
|
||||
|
||||
return nextExt;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
18
index.js
18
index.js
|
|
@ -138,6 +138,24 @@ client.on('interactionCreate', async interaction => {
|
|||
});;
|
||||
}
|
||||
break;
|
||||
case Discord.InteractionType.ModalSubmit:
|
||||
const modal = require(`./interactionHandlers/modals/${interaction.customId}`);
|
||||
|
||||
if (!modal) return;
|
||||
|
||||
try {
|
||||
await modal.execute(interaction);
|
||||
} catch (error) {
|
||||
log.error(error);
|
||||
await interaction.reply({ content: 'There was an error while executing this modal!', ephemeral: true }).catch((error) => {
|
||||
log.error(`Failed to inform user of error: ${error}`);
|
||||
});
|
||||
}
|
||||
break;
|
||||
default: {
|
||||
log.warn(`Unknown interaction type received: ${interaction.type}`);
|
||||
return;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -6,77 +6,9 @@ const Discord = require("discord.js")
|
|||
|
||||
module.exports = {};
|
||||
|
||||
/* Holding for upcoming sponsorship embed
|
||||
{
|
||||
"title": "The LiteNet Community PBX",
|
||||
"description": "The LiteNet Community PBX is hosted through, and is sponsored by Snakecraft Hosting!\nOffering affordable game hosting, Discord bot hosting, and VPS services since 2020.\nGet started at https://go.litenet.tel/sch-affiliate\nCheck them out on [Discord](https://discord.gg/nZFQTaZWqT)\n\n-# The link above is an affiliate link. We will receive credits from any purchase made via this link.\n-# Snakecraft Hosting has no administrative control over, nor has access to private information stored on LiteNet. Snakecraft Hosting provides hosting for LiteNet free of charge. Specific details regarding their affiliate program can be found [here](https://my.snakecrafthosting.com/index.php?rp=/knowledgebase/4/Affiliate-Program-FAQs.html)",
|
||||
"color": 7955428,
|
||||
"fields": [
|
||||
{
|
||||
"name": "What's this?",
|
||||
"value": "The community PBX is a public, free to use [FreePBX](https://freepbx.org) based phone system that any server member is welcome to get a number on!\nEveryone on the system has their own 4 digit number, that can be used to call between other members on the system.\nThe PBX runs on a Snakecraft Hosting VPS graciously provided to us at no cost!"
|
||||
},
|
||||
{
|
||||
"name": "What can it do?",
|
||||
"value": "The LiteNet phone system offers many features, including but not limited to the following:\n- Free inbound/outbound calling via +1 (610) LITENET (548-3638)\n- Private Voicemail\n- Intercom/Paging\n- Conference Rooms\n- Direct dial access to [AstroCom](https://astrocom.tel)\n- [Full extension status page](https://pbx.litenet.tel/status)\n- And more!"
|
||||
},
|
||||
{
|
||||
"name": "Privacy Policy",
|
||||
"value": "LiteNet respects the privacy of all members, and as such, only very few select staff members have access to the system files directly. Voicemails are not tracked nor listened to under any circumstances. Call logs are kept and only reviewed during investigations into violations of community guidelines, or possible illegal activity. Call recordings may be kept at the request of any individual member, and will NOT be reviewed unless prior permission was given from said member.\nAll user data may be deleted by request, or by simply running the `/delete` command.\n\nIf you believe your privacy has been violated in any way, please don't hesistate to reach out to any of our staff members!"
|
||||
},
|
||||
{
|
||||
"name": "Can it do `X`?",
|
||||
"value": "Any specific questions are welcome to be asked in our <#1102782499756724239> chat!\nIf you have a suggestion for something we should add to the PBX or Discord server, feel free to leave it in <#1148099609428762634>!"
|
||||
}
|
||||
],
|
||||
"footer": {
|
||||
"text": "Made with <3 by Chris Chrome & The LiteNet Team • Sponsored by Snakecraft Hosting",
|
||||
"icon_url": "https://f.chrischro.me/assets/Snakecraft-Social-Media-purple-v2-smaller.png"
|
||||
},
|
||||
"image": {
|
||||
"url": "https://f.chrischro.me/assets/litenet-full.png"
|
||||
},
|
||||
"thumbnail": {
|
||||
"url": "https://f.chrischro.me/assets/Snakecraft-Social-Media-purple-v2-smaller-rounder.png"
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
module.exports.execute = async (interaction) => {
|
||||
interaction.channel.send({
|
||||
embeds: [{
|
||||
"title": "The LiteNet Community PBX",
|
||||
"description": "The LiteNet Community PBX is hosted through, and is sponsored by Snakecraft Hosting!\nOffering affordable game hosting, Discord bot hosting, and VPS services since 2020.\nGet started at https://go.litenet.tel/sch-affiliate\nCheck them out on [Discord](https://discord.gg/nZFQTaZWqT)\n\n-# The link above is an affiliate link. We will receive credits from any purchase made via this link.\n-# Snakecraft Hosting has no administrative control over, nor has access to private information stored on LiteNet. Snakecraft Hosting provides hosting for LiteNet free of charge. Specific details regarding their affiliate program can be found [here](https://my.snakecrafthosting.com/index.php?rp=/knowledgebase/4/Affiliate-Program-FAQs.html)",
|
||||
"color": 7955428,
|
||||
"fields": [
|
||||
{
|
||||
"name": "What's this?",
|
||||
"value": "The community PBX is a public, free to use [FreePBX](https://freepbx.org) based phone system that any server member is welcome to get a number on!\nEveryone on the system has their own 4 digit number, that can be used to call between other members on the system.\nThe PBX runs on a Snakecraft Hosting VPS graciously provided to us at no cost!"
|
||||
},
|
||||
{
|
||||
"name": "What can it do?",
|
||||
"value": "The LiteNet phone system offers many features, including but not limited to the following:\n- Free inbound/outbound calling via +1 (610) LITENET (548-3638)\n- Private Voicemail\n- Intercom/Paging\n- Conference Rooms\n- Direct dial access to [AstroCom](https://astrocom.tel)\n- [Full extension status page](https://pbx.litenet.tel/status)\n- And more!"
|
||||
},
|
||||
{
|
||||
"name": "Privacy Policy",
|
||||
"value": "LiteNet respects the privacy of all members, and as such, only very few select staff members have access to the system files directly. Voicemails are not tracked nor listened to under any circumstances. Call logs are kept and only reviewed during investigations into violations of community guidelines, or possible illegal activity. Call recordings may be kept at the request of any individual member, and will NOT be reviewed unless prior permission was given from said member.\nAll user data may be deleted by request, or by simply running the `/delete` command.\n\nIf you believe your privacy has been violated in any way, please don't hesistate to reach out to any of our staff members!"
|
||||
},
|
||||
{
|
||||
"name": "Can it do `X`?",
|
||||
"value": "Any specific questions are welcome to be asked in our <#1102782499756724239> chat!\nIf you have a suggestion for something we should add to the PBX or Discord server, feel free to leave it in <#1148099609428762634>!"
|
||||
}
|
||||
],
|
||||
"footer": {
|
||||
"text": "Made with <3 by Chris Chrome & The LiteNet Team • Sponsored by Snakecraft Hosting",
|
||||
"icon_url": "https://f.chrischro.me/assets/Snakecraft-Social-Media-purple-v2-smaller.png"
|
||||
},
|
||||
"image": {
|
||||
"url": "https://f.chrischro.me/assets/litenet-full.png"
|
||||
},
|
||||
"thumbnail": {
|
||||
"url": "https://f.chrischro.me/assets/Snakecraft-Social-Media-purple-v2-smaller-rounder.png"
|
||||
}
|
||||
}],
|
||||
embeds: [{ "title": "The LiteNet Community PBX", "description": "The LiteNet Community PBX is hosted through, and is sponsored by RackGenius!\nOffering affordable game hosting, Discord bot hosting, and VPS services since 2020.\nGet started at https://go.litenet.tel/affiliate\nCheck them out on [Discord](https://discord.gg/nZFQTaZWqT)\n\n-# The link above is an affiliate link. We will receive credits from any purchase made via this link.\n-# RackGenius has no administrative control over, nor has access to private information stored on LiteNet. RackGenius provides hosting for LiteNet free of charge. Specific details regarding their affiliate program can be found [here](https://my.rackgenius.com/index.php?rp=/knowledgebase/4/Affiliate-Program-FAQs.html)", "footer": { "text": "Made with <3 by Chris Chrome & The LiteNet Team • Sponsored by RackGenius", "iconURL": "https://dingus.chrischro.me/raw/bfafda4c-9a2f-4f1e-8e78-fec2df7836f3.png" }, "timestamp": "2025-05-26T04:26:03.819Z", "thumbnail": { "url": "https://dingus.chrischro.me/raw/bfafda4c-9a2f-4f1e-8e78-fec2df7836f3.png" }, "image": { "url": "https://dingus.chrischro.me/raw/54d12d28-6a88-46b8-a95e-dc8c1f346cd6.png" }, "fields": [{ "name": "What's this?", "value": "The community PBX is a public, free to use [FreePBX](https://freepbx.org) based phone system that any server member is welcome to get a number on!\nEveryone on the system has their own 4 digit number, that can be used to call between other members on the system.\nThe PBX runs on a RackGenius VPS graciously provided to us at no cost!", "inline": false }, { "name": "What can it do?", "value": "The LiteNet phone system offers many features, including but not limited to the following:\n- Free inbound/outbound calling via +1 (610) LITENET (548-3638)\n- Private Voicemail\n- Intercom/Paging\n- Conference Rooms\n- Direct dial access to [AstroCom](https://astrocom.tel)\n- [Full extension status page](https://pbx.litenet.tel/status)\n- And more!", "inline": false }, { "name": "Privacy Policy", "value": "LiteNet respects the privacy of all members, and as such, only very few select staff members have access to the system files directly. Voicemails are not tracked nor listened to under any circumstances. Call logs are kept and only reviewed during investigations into violations of community guidelines, or possible illegal activity. Call recordings may be kept at the request of any individual member, and will NOT be reviewed unless prior permission was given from said member.\nAll user data may be deleted by request, or by simply running the `/delete` command.\n\nIf you believe your privacy has been violated in any way, please don't hesistate to reach out to any of our staff members!", "inline": false }, { "name": "Call Recording Notice", "value": "Due to repeated issues with prank and spam calling in the past via the PSTN, all inbound and outbound calls are recorded. Recordings are retained for seven (7) days from the end of the call. If you have any questions, please reach out via a support ticket!", "inline": false }, { "name": "Can it do `X`?", "value": "Any specific questions are welcome to be asked in our <#1102782499756724239> chat!\nIf you have a suggestion for something we should add to the PBX or Discord server, feel free to leave it in <#1148099609428762634>!", "inline": false }] }],
|
||||
components: [
|
||||
{
|
||||
type: 1,
|
||||
|
|
@ -94,9 +26,79 @@ module.exports.execute = async (interaction) => {
|
|||
emoji: "ℹ️",
|
||||
style: Discord.ButtonStyle.Primary,
|
||||
custom_id: "getExtensionInfo"
|
||||
},
|
||||
{
|
||||
type: Discord.ComponentType.Button,
|
||||
label: "Reset Password",
|
||||
emoji: "🔄",
|
||||
style: Discord.ButtonStyle.Danger,
|
||||
custom_id: "resetPassword"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
})
|
||||
// interaction.channel.send({ // Old embed before sponsorship change
|
||||
// embeds: [{
|
||||
// "title": "The LiteNet Community PBX",
|
||||
// "description": "The LiteNet Community PBX is hosted through, and is sponsored by Snakecraft Hosting!\nOffering affordable game hosting, Discord bot hosting, and VPS services since 2020.\nGet started at https://go.litenet.tel/sch-affiliate\nCheck them out on [Discord](https://discord.gg/nZFQTaZWqT)\n\n-# The link above is an affiliate link. We will receive credits from any purchase made via this link.\n-# Snakecraft Hosting has no administrative control over, nor has access to private information stored on LiteNet. Snakecraft Hosting provides hosting for LiteNet free of charge. Specific details regarding their affiliate program can be found [here](https://my.snakecrafthosting.com/index.php?rp=/knowledgebase/4/Affiliate-Program-FAQs.html)",
|
||||
// "color": 7955428,
|
||||
// "fields": [
|
||||
// {
|
||||
// "name": "What's this?",
|
||||
// "value": "The community PBX is a public, free to use [FreePBX](https://freepbx.org) based phone system that any server member is welcome to get a number on!\nEveryone on the system has their own 4 digit number, that can be used to call between other members on the system.\nThe PBX runs on a Snakecraft Hosting VPS graciously provided to us at no cost!"
|
||||
// },
|
||||
// {
|
||||
// "name": "What can it do?",
|
||||
// "value": "The LiteNet phone system offers many features, including but not limited to the following:\n- Free inbound/outbound calling via +1 (610) LITENET (548-3638)\n- Private Voicemail\n- Intercom/Paging\n- Conference Rooms\n- Direct dial access to [AstroCom](https://astrocom.tel)\n- [Full extension status page](https://pbx.litenet.tel/status)\n- And more!"
|
||||
// },
|
||||
// {
|
||||
// "name": "Privacy Policy",
|
||||
// "value": "LiteNet respects the privacy of all members, and as such, only very few select staff members have access to the system files directly. Voicemails are not tracked nor listened to under any circumstances. Call logs are kept and only reviewed during investigations into violations of community guidelines, or possible illegal activity. Call recordings may be kept at the request of any individual member, and will NOT be reviewed unless prior permission was given from said member.\nAll user data may be deleted by request, or by simply running the `/delete` command.\n\nIf you believe your privacy has been violated in any way, please don't hesistate to reach out to any of our staff members!"
|
||||
// },
|
||||
// {
|
||||
// "name": "Can it do `X`?",
|
||||
// "value": "Any specific questions are welcome to be asked in our <#1102782499756724239> chat!\nIf you have a suggestion for something we should add to the PBX or Discord server, feel free to leave it in <#1148099609428762634>!"
|
||||
// }
|
||||
// ],
|
||||
// "footer": {
|
||||
// "text": "Made with <3 by Chris Chrome & The LiteNet Team • Sponsored by Snakecraft Hosting",
|
||||
// "icon_url": "https://f.chrischro.me/assets/Snakecraft-Social-Media-purple-v2-smaller.png"
|
||||
// },
|
||||
// "image": {
|
||||
// "url": "https://f.chrischro.me/assets/litenet-full.png"
|
||||
// },
|
||||
// "thumbnail": {
|
||||
// "url": "https://f.chrischro.me/assets/Snakecraft-Social-Media-purple-v2-smaller-rounder.png"
|
||||
// }
|
||||
// }],
|
||||
// components: [
|
||||
// {
|
||||
// type: 1,
|
||||
// components: [
|
||||
// {
|
||||
// type: Discord.ComponentType.Button,
|
||||
// label: "Get an Extension",
|
||||
// emoji: "✅",
|
||||
// style: Discord.ButtonStyle.Success,
|
||||
// custom_id: "newExtension"
|
||||
// },
|
||||
// {
|
||||
// type: Discord.ComponentType.Button,
|
||||
// label: "Get your extension info",
|
||||
// emoji: "ℹ️",
|
||||
// style: Discord.ButtonStyle.Primary,
|
||||
// custom_id: "getExtensionInfo"
|
||||
// },
|
||||
// {
|
||||
// type: Discord.ComponentType.Button,
|
||||
// label: "Reset Password",
|
||||
// emoji: "🔄",
|
||||
// style: Discord.ButtonStyle.Danger,
|
||||
// custom_id: "resetPassword"
|
||||
// }
|
||||
// ]
|
||||
// }
|
||||
// ]
|
||||
// })
|
||||
}
|
||||
3
interactionHandlers/commands/reset.js
Normal file
3
interactionHandlers/commands/reset.js
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
module.exports = {};
|
||||
|
||||
module.exports.execute = require("../common/resetPasswordDialog").execute;
|
||||
|
|
@ -14,7 +14,7 @@ module.exports.execute = async (interaction) => {
|
|||
}
|
||||
await interaction.editReply({ content: `Finding available extension`, ephemeral: true });
|
||||
fpbx.getNextAvailableExtension().then(async (nextExt) => {
|
||||
await interaction.editReply({ content: `Found ${nextExt}. Creating..`, ephemeral: true });
|
||||
await interaction.editReply({ content: `Found ${nextExt}. Creating..`, ephemeral: true });
|
||||
fpbx.addExtension(nextExt, interaction.user.username).then(async (res) => {
|
||||
if (res.addExtension.status != true) {
|
||||
await interaction.editReply({ content: `Something went wrong :(`, ephemeral: true });
|
||||
|
|
@ -24,11 +24,28 @@ module.exports.execute = async (interaction) => {
|
|||
await interaction.editReply({ content: `Extension ${nextExt} created! Getting info..`, ephemeral: true });
|
||||
await fpbx.reload();
|
||||
const extInfo = await fpbx.getExtension(nextExt);
|
||||
await interaction.editReply({ embeds: [{
|
||||
title: "Your Extension Info",
|
||||
description: `**PBX Address:** \`${process.env.PBX_HOSTNAME}\`\n**Extension:** \`${extInfo.fetchExtension.user.extension}\`\n**Name:** \`${extInfo.fetchExtension.user.name}\`\n**Password:** ||\`${extInfo.fetchExtension.user.extPassword}\`||`,
|
||||
color: 0x00ff00
|
||||
}], ephemeral: true })
|
||||
await interaction.editReply({
|
||||
embeds: [{
|
||||
title: "Your Extension Info",
|
||||
description: `**PBX Address:** \`${process.env.PBX_HOSTNAME}\`\n**Extension:** \`${extInfo.fetchExtension.user.extension}\`\n**Name:** \`${extInfo.fetchExtension.user.name}\`\n**Password:** ||\`${extInfo.fetchExtension.user.extPassword}\`||`,
|
||||
color: 0x00ff00
|
||||
}],
|
||||
components: [
|
||||
{
|
||||
type: 1,
|
||||
components: [
|
||||
{
|
||||
type: Discord.ComponentType.Button,
|
||||
label: "Reset Password",
|
||||
emoji: "🔄",
|
||||
style: Discord.ButtonStyle.Danger,
|
||||
custom_id: "resetPassword"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
ephemeral: true
|
||||
})
|
||||
if (process.env.EXTENSION_ROLE_ID) await interaction.member.roles.add(process.env.EXTENSION_ROLE_ID);
|
||||
}).catch(async (error) => {
|
||||
log.error(error);
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ const pool = global.pool
|
|||
const fpbx = global.fpbx
|
||||
const client = global.client
|
||||
const log = global.log
|
||||
const Discord = require('discord.js');
|
||||
|
||||
module.exports = {};
|
||||
|
||||
|
|
@ -20,6 +21,20 @@ module.exports.execute = async (interaction) => {
|
|||
description: `**PBX Address:** \`${process.env.PBX_HOSTNAME}\`\n**Extension/Username:** \`${extInfo.fetchExtension.user.extension}\`\n**Name:** \`${extInfo.fetchExtension.user.name}\`\n**Password:** ||\`${extInfo.fetchExtension.user.extPassword}\`||`,
|
||||
color: 0x00ff00
|
||||
}
|
||||
],
|
||||
components: [
|
||||
{
|
||||
type: 1,
|
||||
components: [
|
||||
{
|
||||
type: Discord.ComponentType.Button,
|
||||
label: "Reset Password",
|
||||
emoji: "🔄",
|
||||
style: Discord.ButtonStyle.Danger,
|
||||
custom_id: "resetPassword"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
|
|
|
|||
41
interactionHandlers/common/resetPasswordDialog.js
Normal file
41
interactionHandlers/common/resetPasswordDialog.js
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
const pool = global.pool
|
||||
const fpbx = global.fpbx
|
||||
const client = global.client
|
||||
const log = global.log
|
||||
|
||||
module.exports = {};
|
||||
|
||||
module.exports.execute = async (interaction) => {
|
||||
const [lookup] = await pool.query('SELECT * FROM discord_users WHERE discordId = ?', [interaction.user.id]);
|
||||
if (!lookup) {
|
||||
await interaction.reply({ content: `We're sorry, It doesn't look like you have an extension!`, ephemeral: true });
|
||||
return;
|
||||
}
|
||||
interaction.showModal({
|
||||
title: 'Reset Extension Password',
|
||||
customId: 'resetPasswordModal',
|
||||
label: 'Reset Extension Password',
|
||||
components: [
|
||||
{
|
||||
type: 1, // Action Row
|
||||
components: [
|
||||
// {
|
||||
// type: 18, // Label
|
||||
// ,
|
||||
// component:
|
||||
// }
|
||||
{
|
||||
type: 4, // Text Input
|
||||
customId: 'newPassword',
|
||||
label: "New Password. Leave blank for random.",
|
||||
style: 1,
|
||||
min_length: 6,
|
||||
max_length: 64,
|
||||
placeholder: 'New Password',
|
||||
required: false
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
});
|
||||
}
|
||||
3
interactionHandlers/components/resetPassword.js
Normal file
3
interactionHandlers/components/resetPassword.js
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
module.exports = {};
|
||||
|
||||
module.exports.execute = require("../common/resetPasswordDialog").execute;
|
||||
35
interactionHandlers/modals/resetPasswordModal.js
Normal file
35
interactionHandlers/modals/resetPasswordModal.js
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
const pool = global.pool
|
||||
const fpbx = global.fpbx
|
||||
const client = global.client
|
||||
const log = global.log
|
||||
module.exports = {};
|
||||
|
||||
module.exports.execute = async (interaction) => {
|
||||
const [lookup] = await pool.query('SELECT * FROM discord_users WHERE discordId = ?', [interaction.user.id]);
|
||||
if (!lookup) {
|
||||
await interaction.reply({ content: `We're sorry, It doesn't look like you have an extension!`, ephemeral: true });
|
||||
return;
|
||||
}
|
||||
const extData = await fpbx.getExtension(lookup.extension); // Verify extension exists
|
||||
console.log(extData)
|
||||
await interaction.deferReply({ ephemeral: true });
|
||||
// console.log(JSON.stringify(interaction, null, 2));
|
||||
const newPassword = interaction.fields.getTextInputValue('newPassword');
|
||||
let passwordToSet = newPassword;
|
||||
let oldName = extData.fetchExtension.user.name;
|
||||
if (!newPassword || newPassword.trim() === '') {
|
||||
// Generate password based on process.env.PASSWORD_LENGTH and process.env.PASSWORD_CHARS or default to 32 alphanumeric with caps
|
||||
const length = parseInt(process.env.PASSWORD_LENGTH) || 32;
|
||||
const chars = process.env.PASSWORD_CHARS || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
||||
passwordToSet = Array.from({ length }, () => chars.charAt(Math.floor(Math.random() * chars.length))).join('');
|
||||
}
|
||||
try {
|
||||
const updated = await fpbx.updateExtPassword(lookup.extension, oldName, passwordToSet);
|
||||
//const updated = await fpbx.updateExtName(lookup.extension, passwordToSet);
|
||||
console.log(updated)
|
||||
await interaction.editReply({ content: `Your extension password has been reset successfully! Your new password is: ||\`${passwordToSet}\`||`, ephemeral: true });
|
||||
} catch (error) {
|
||||
log.error(error);
|
||||
await interaction.editReply({ content: 'There was an error while resetting your extension password!', ephemeral: true });
|
||||
}
|
||||
}
|
||||
11
migrations/003_fuck_freepbx_gql.sql
Normal file
11
migrations/003_fuck_freepbx_gql.sql
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
INSERT INTO userman_users (username, auth, description)
|
||||
|
||||
SELECT du.extension, '1', 'FPBX GQL Fix. Thanks Sangoma.'
|
||||
FROM discord_users du
|
||||
LEFT JOIN userman_users uu
|
||||
ON uu.username = du.extension
|
||||
WHERE uu.username IS NULL;
|
||||
|
||||
-- Some context for those wondering why this is here.
|
||||
-- FreePBX's GraphQL API, for some reason, REQUIRES a userman user to exist for each extension before it'll allow you to update the name or password via GraphQL.
|
||||
-- Fuck FreePBX GQL.
|
||||
10
package-lock.json
generated
10
package-lock.json
generated
|
|
@ -704,15 +704,6 @@
|
|||
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
|
||||
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
|
||||
},
|
||||
"node_modules/encoding": {
|
||||
"version": "0.1.13",
|
||||
"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
|
||||
"integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"iconv-lite": "^0.6.2"
|
||||
}
|
||||
},
|
||||
"node_modules/env-paths": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
|
||||
|
|
@ -851,6 +842,7 @@
|
|||
"version": "15.8.0",
|
||||
"resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz",
|
||||
"integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">= 10.x"
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue