UNPKG

lewds.api

Version:

An api wrapper for lewds.ga for Discord JavaScript Bots

283 lines (272 loc) 12.3 kB
const tinees = require('./end'); const fetch = require('node-fetch'); const schema = require("./schema/unmute"); const ms = require("./functions/parseMS"); const db = require("mongoose"); class LewdClient { constructor(options = {}) { if (!options.KEY) throw new Error("No key found for Lewds API"); this.KEY = options.KEY, this.client = options.client, this.MongoDBUri = options.MongoDB; }; /** * @param {String} img endpoint to search * @returns {String} url of image */ async nsfw(img) { return fetch(`${tinees.base}${img}`, { method: 'GET', headers: { "Authorization": this.KEY } }) .then(res => res.json()) .then(json => { if (json == undefined) throw Error(`[LEWDS]: ${img} is not a valid endpoint!`) return json.result }) }; async chat(msg, userID) { const body = { msg: msg, uid: userID }; const fetch = require("node-fetch"); return fetch('https://ahni.dev/api/v1/fun/chat', { method: 'POST', body: JSON.stringify(body), headers: { "authorization": this.KEY, 'Content-Type': 'application/json' }, }) .then(res => res.json()) .then(json => { if (json == undefined) throw Error(`[LEWDS]: ${"chat"} is not a valid endpoint!`) return json.response }) } /** * does not connect to api below this vvvv * mutes a Guild Member by a given time * @param {Object} member The member * @param {Number} time The reminder time * @param {String} reason The reminder * @returns {Promise<void>} */ async mute(member, time, reason) { if (!member) throw new Error('[ LewdsAPI ] Error: Member is not defined in remind function') const data = new schema({ guildID: member.guild.id, memberID: member.user.id, reason: reason || "No Reason Given", roles: member.roles.cache.filter(r => r.id !== member.guild.id).map(r => r.id) || [], time: (parseInt(ms(time).toString()) + Date.now()) || (parseInt(ms("1m").toString()) + Date.now()), timeMS: ms(time.toString()) }); data.save().catch(e => console.log("[ LewdsAPI ] Error: saving remind to db")) }; /** * Unmutes a Guild Member by a given time * @param {Object} member The member * @param {Number} time The reminder time * @param {String} reason The reminder * @returns {Promise<void>} */ async timed(client) { if (!client) throw new Error('[ LewdsAPI ] Error: Client is not defined in remind function') setInterval(() => { schema.find({}, function (err, docs) { if (err) return console.log(err) docs.forEach(async doc => { if (doc.time <= Date.now()) { await client.guilds.fetch(doc.guildID).then(async guilds => { await guilds.members.fetch(doc.memberID).then(async (use) => { if (doc.roles.length > 0) { if (use.roles.has(use.guild.roles.premiumSubscriberRole.id)) { await use.roles.set(doc.roles, use.guild.roles.premiumSubscriberRole.id) await client.emit('timedUnmute', use, { guild: use.guild }) await schema.deleteOne(doc) } else { await use.roles.set(doc.roles) await client.emit('timedUnmute', use, { guild: use.guild }) await schema.deleteOne(doc) } } else { await use.roles.set([]); await client.emit('timedUnmute', use, { guild: use.guild }) await schema.deleteOne(doc) } }) }) } }); }); }, 10000); // 10000 milsec } /** * @param { Discord.Client } client * @param { String } message * @returns */ async quoteId(client, message, channel) { if (client == null || client == undefined) throw new Error('[LewdsAPI] Error: Client is not defined in quoteId function') if (message == null || message == undefined) throw new Error('[LewdsAPI] Error: Message is not defined in quoteId function') const id = message; let a = []; const url = message.match(/(?:https:\/\/discord.com\/channels\/[0-9].*[0-9])/) try { if (Number(id) && !url) { const a = await channel.messages.fetch(id).then( async m => { if (m.channel.nsfw && !channel.nsfw) return { content: 'This message is in an NSFW channel so i will not repost it here!', author: { accentColor: m.author.accentColor, avatarURL: m.author.avatarURL, username: m.author.username } } if (m.embeds.length > 0) return { content: 'The requested message has one or more embeds, So it cant be read yet...', author: { accentColor: m.author.accentColor, avatarURL: m.author.avatarURL, username: m.author.username } } return m; }).catch(err => { return { content: 'No valid message id/message url provided!', author: { accentColor: client.user.accentColor, avatarURL: client.user.avatarURL, username: client.user.username } }; }) return a; } else if (url && !Number(id)) { const parses = url.toString().split("/"); const b = await client.guilds.cache.get(parses[4]) if (b) { const c = await b.channels.cache.get(parses[5]) const d = c.messages.fetch(parses[6]).then( async m => { { if (m.channel.nsfw && !channel.nsfw) return { content: 'The requested message is in an NSFW channel so i will not repost it here!', author: { accentColor: m.author.accentColor, avatarURL: m.author.avatarURL, username: m.author.username } } if (m.embeds.length > 0) return { content: 'This message has one or more embeds, So it cant be read yet...', author: { accentColor: m.author.accentColor, avatarURL: m.author.avatarURL, username: m.author.username } }; return m; } }).catch(err => { return { content: 'No valid message id/message url provided!', author: { accentColor: client.user.accentColor, avatarURL: client.user.avatarURL, username: client.user.username } } }) return d; } else return { content: 'No valid message found!', author: { accentColor: client.user.accentColor, avatarURL: client.user.avatarURL, username: client.user.username } } } else { return { content: 'No valid message id/message url provided!', author: { accentColor: client.user.accentColor, avatarURL: client.user.avatarURL, username: client.user.username } } } } catch (err) { console.log(err) return "Something wasnt found or broke!" } } /** * Fetch and unmutes a Guild Member * @param {Discord.Client} client Discord Client * @returns {Promise<void>} */ async forced(client, user) { if (!client) throw new Error('[ LewdsAPI ] Error: Client is not defined in forced unmute function') schema.find({}, function (err, docs) { if (err) return console.log(err) docs.forEach(async doc => { if (doc.memberID === user.id) { const guild = await client.guilds.cache.get(doc.guildID); await guild.members.fetch(doc.memberID).then(use => { if (doc.roles.length > 0) { if (use.roles.has(use.guild.roles.premiumSubscriberRole.id)) { use.roles.set(doc.roles, use.guild.roles.premiumSubscriberRole.id) } else { use.roles.set(doc.roles) } return; } else { return use.roles.set([]); } }) await client.emit('timedUnmute', user, guild) await schema.deleteOne(doc) } }) }) } /** * Parse a ms * @param {number} ms * @returns {Promise<String>} */ async parseMS(ms) { if (typeof ms == "number") { let seconds = ms / 1000, days = seconds / 86400; seconds = seconds % 86400 let hours = seconds / 3600; seconds = seconds % 3600 let minutes = seconds / 60; seconds = seconds % 60; if (days) { return `${days} day, ${hours} hours, ${minutes} minutes` } else if (hours) { return `${hours} hours, ${minutes} minutes, ${seconds} seconds` } else if (minutes) { return `${minutes} minutes, ${seconds} seconds` } return `${seconds} second(s)` } else { return null; } } async connectToMongoDB(MongoDB) { let connected = true; db.connect(MongoDB, { useNewUrlParser: true, useUnifiedTopology: true }).catch(e => { connected = false; throw e; }).then(() => { if (connected === true) console.info("[LewdsAPI] => Connected to DB successfully.") }); } } module.exports = LewdClient;