is-discord-invite
Version:
Verifies the presence of a Discord server invitation in a given string or message, with additional features for validating and confirming the authenticity and validity of the invitation link.
70 lines (60 loc) • 2.54 kB
JavaScript
const https = require('node:https');
const { name, version, devDependencies } = require('../package.json');
const testRunnerVersion = process.env.JEST_WORKER_ID === undefined ? '' : ` jest/${devDependencies.jest.replace('^', '')}`;
const headers = {
'User-Agent': `${name}/${version} (+https://github.com/sefinek/is-discord-invite)${testRunnerVersion}`,
'Accept': 'application/json',
};
const extractCode = discordLink => {
try {
const parsedUrl = new URL(discordLink);
const pathname = parsedUrl.pathname;
return pathname.startsWith('/invite/') ? pathname.substring('/invite/'.length) : pathname.substring(1);
} catch (err) {
console.error(err);
return null;
}
};
const httpRequest = (url, options) => new Promise((resolve, reject) => {
const req = https.get(url, options, res => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => {
try {
resolve({ data: JSON.parse(data), statusCode: res.statusCode });
} catch (err) {
reject(err);
}
});
});
req.on('error', reject);
req.on('timeout', () => {
req.destroy();
reject(new Error('Request timed out.'));
});
});
module.exports = async url => {
if (!url) return { success: false, code: 200, isInvitation: false, message: 'Validation error. Missing invitation.', url: {}, inviter: null, guild: null };
if (url.length >= 68) return { success: false, code: 200, isInvitation: false, message: 'Validation error. Invitation is too long.', url: {}, inviter: null, guild: null };
const invitation = extractCode(url);
if (!invitation) return { success: false, code: 200, isInvitation: false, message: 'Validation error. Unknown invitation.', url: {}, inviter: null, guild: null };
try {
const res = await httpRequest(`https://discord.com/api/v10/invites/${invitation}`, { headers });
if (res.statusCode !== 200) return { success: true, code: res.statusCode, isInvitation: false, message: res.message || 'Discord API error.', url: res.code || {}, inviter: res.data.inviter || {}, guild: res.data.guild || {} };
return {
success: true,
code: 200,
isInvitation: true,
message: 'Success',
url: {
full: url,
invitationCode: invitation,
fetchedCode: res.data.code || {},
},
inviter: res.data.inviter || {},
guild: res.data.guild || {},
};
} catch (err) {
return { success: false, code: err.response?.status || undefined, isInvitation: false, message: err.message, url: {}, inviter: null, guild: null };
}
};