UNPKG

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
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 }; } };