diff --git a/DiscordModules/dev/blacklist.js b/DiscordModules/dev/blacklist.js new file mode 100644 index 0000000..aa92f54 --- /dev/null +++ b/DiscordModules/dev/blacklist.js @@ -0,0 +1,25 @@ +const Command = require('../../src/structures/Command'); +module.exports = class Blacklist extends Command { + constructor() { + super({ + name: 'blacklist', + description: 'Master the Blacklist', + aliases: ['bl'], + module: 'Developers', + cooldown: 0, + guildOnly: false, + developerOnly: true + }); + } + + async command(ctx) { + console.log(ctx.args) + let ACTION = ctx.args[0] + let ID = ctx.args[1] + let REASON = ctx.args.shift().shift().join(' ') + // let REASON = ctx.args[2] + + let X = await ctx.utils.db.blacklist(ID, ACTION, REASON) + console.log(X) + } +}; \ No newline at end of file diff --git a/DiscordModules/dev/dig.js b/DiscordModules/dev/dig.js new file mode 100644 index 0000000..42f080b --- /dev/null +++ b/DiscordModules/dev/dig.js @@ -0,0 +1,45 @@ +const Command = require("../../src/structures/Command"); +const exec = require("shell-exec"); +const dig = require("node-dig-dns"); +const { + MessageEmbed +} = require("discord.js"); +let DomainReg = new RegExp( + `(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]` +); +module.exports = class Dig extends Command { + constructor() { + super({ + name: "dig", + description: "dig website dns information stuff", + aliases: [], + module: "Developers", + cooldown: 10, + guildOnly: false, + developerOnly: true, + nsfw: false + }); + } + + async command(ctx) { + let count = 0; + let domain = ctx.args[0]; + let type = ctx.args[1]; + const DIG = new MessageEmbed().setTitle(`${domain} (${type})`); + if (domain.match(DomainReg)) { + try { + let result = await dig([domain, type]); + + result.answer.forEach(r => { + count++; + DIG.addField(`Answer ${count}`, r.value); + }); + } catch (error) { + DIG.setDescription( + `Either the Domain you are trying to dig for doesn't exist or the record you are requesting does not exist.` + ); + } + } + ctx.send(DIG); + } +}; \ No newline at end of file diff --git a/DiscordModules/dev/eval.js b/DiscordModules/dev/eval.js new file mode 100755 index 0000000..a1223e4 --- /dev/null +++ b/DiscordModules/dev/eval.js @@ -0,0 +1,80 @@ +const Command = require('../../src/structures/Command'); +const { table } = require('quick.db'); +const Servers = new table('servers'); +const Users = new table('users'); +const Bot = new table('bot'); + +const clean = (text) => { + if (typeof text == 'string') + return text.replace(/`/g, '`' + String.fromCharCode(8203)).replace(/@/g, '@' + String.fromCharCode(8203)); + else return text; +}; + +module.exports = class Eval extends Command { + constructor() { + super({ + name: 'eval', + description: 'Run JavaScript code directly from the process.', + aliases: [ 'ev', 'e' ], + module: 'Developers', + cooldown: 0, + guildOnly: false, + developerOnly: true + }); + } + + async command(ctx) { + if (!ctx.args.length) return; + + const client = ctx.client; + + let code = ctx.args.join(' '); + let silent = false; + + if (code.endsWith('-s')) (code = code.split('-s')[0]), (silent = true); + if (code.endsWith('--silent')) (code = code.split('--silent')[0]), (silent = true); + + try { + let evaled = await eval(code); + + if (typeof evaled != 'string') + evaled = require('util').inspect(evaled, false, await ctx.db.backend.get('eval')); + + evaled.replace(new RegExp(client.token.replace(/\./g, '\\.', 'g')), 'uwu'); + + if (!silent) { + ctx + .send(`\`\`\`js\n${clean(evaled)}\n\`\`\``) + .then(async (m) => { + await m.react('📥'); + await m.react('🗑'); + }) + .catch((err) => { + ctx + .send(`\`Content is over 2,000 characters: react to upload to Hastebin\``) + .then(async (m) => { + client.lastEval = clean(evaled); + + await m.react('📥'); + await m.react('🗑'); + }); + }); + } + } catch (error) { + ctx + .send(`\`\`\`js\n${clean(error)}\n\`\`\``) + .then(async (m) => { + await m.react('📥'); + await m.react('🗑'); + }) + .catch((err) => { + ctx.send(`\`Content is over 2,000 characters: react to upload to Hastebin\``).then(async (m) => { + client.lastEval = clean(error); + + await m.react('📥'); + await m.react('🗑'); + }); + }); + } + } +}; diff --git a/DiscordModules/dev/exec.js b/DiscordModules/dev/exec.js new file mode 100644 index 0000000..be6ceb6 --- /dev/null +++ b/DiscordModules/dev/exec.js @@ -0,0 +1,28 @@ +const Command = require('../../src/structures/Command'); +const exec = require('shell-exec'); +module.exports = class Exec extends Command { + constructor() { + super({ + name: 'exec', + description: 'Execute shell commands', + aliases: [ 'ex' ], + module: 'Developers', + cooldown: 1, + guildOnly: false, + developerOnly: true, + nsfw: false + }); + } + + async command(ctx) { + const trying = await ctx.send('Attempting to execute ' + ctx.utils.format.bold(ctx.args.join(' '))); + + await exec(ctx.args.join(' ')) + .then((r) => { + trying.edit('```bash\n' + r.stdout + '```'); + }) + .catch((error) => { + trying.edit('Failed to execute ' + ctx.utils.format.bold(ctx.args.join(' '))); + }); + } +}; diff --git a/DiscordModules/dev/reload.js b/DiscordModules/dev/reload.js new file mode 100755 index 0000000..b293e72 --- /dev/null +++ b/DiscordModules/dev/reload.js @@ -0,0 +1,38 @@ +const Command = require('../../src/structures/Command'); + +module.exports = class Reload extends Command { + constructor() { + super({ + name: 'reload', + description: 'Reload a command without restarting the process.', + aliases: [ 're' ], + module: 'Developers', + cooldown: 0, + guildOnly: false, + developerOnly: true + }); + } + + async command(ctx) { + if (!ctx.args.length) return; + const date = Date.now(); + + const data = ctx.args[0]; + const [ module, command ] = data.split('/'); + + if (!module || !command) return; + + try { + delete require.cache[require.resolve(`../${module}/${command}`)]; + delete ctx.client.commands.get(command); + + const cmd = require(`../${module}/${command}`); + const Command = new cmd(); + ctx.client.commands.set(Command.name, Command); + + return ctx.send(`Reloaded \`${Command.name}\` in ${(Date.now() - date) / 1000}s.`); + } catch (err) { + return ctx.send(`Failed to reload the command.\n\`${err}\``); + } + } +}; diff --git a/DiscordModules/dev/stop.js b/DiscordModules/dev/stop.js new file mode 100755 index 0000000..9ef0893 --- /dev/null +++ b/DiscordModules/dev/stop.js @@ -0,0 +1,19 @@ +const Command = require('../../src/structures/Command'); +module.exports = class Stop extends Command { + constructor() { + super({ + name: 'stop', + description: 'Stops the bot', + aliases: [], + module: 'Developers', + cooldown: 0, + guildOnly: false, + developerOnly: true + }); + } + + async command(ctx) { + await ctx.send('Restarting.'); + process.exit(); + } +}; diff --git a/DiscordModules/dev/update.js b/DiscordModules/dev/update.js new file mode 100644 index 0000000..b98bf5e --- /dev/null +++ b/DiscordModules/dev/update.js @@ -0,0 +1,34 @@ +const Command = require('../../src/structures/Command'); +const exec = require('shell-exec'); +module.exports = class Update extends Command { + constructor() { + super({ + name: 'update', + description: 'Execute shell commands', + aliases: [ 'up', 'pull' ], + module: 'Developers', + cooldown: 1, + guildOnly: false, + developerOnly: true, + nsfw: false + }); + } + + async command(ctx) { + const trying = await ctx.send( + `${ctx.utils.emotes.random.loading} Getting the latest updates from ${ctx.config.source.replace( + 'https://', + '' + )} ${ctx.utils.emotes.random.loading}` + ); + + await exec('git pull') + .then((r) => { + trying.edit('```fix\n' + r.stdout + '```'); + }) + .catch((error) => { + trying.edit(`Failed to get the latest updates.`); + console.error(error); + }); + } +}; diff --git a/models/Server.js b/models/Server.js new file mode 100644 index 0000000..9fb0ff1 --- /dev/null +++ b/models/Server.js @@ -0,0 +1,35 @@ +const mongoose = require("mongoose"); + +const ServerSchema = new mongoose.Schema({ + id: { + type: String, + required: true + }, + sourcefynnder: { + type: Boolean, + required: false, + default: false + }, + shortlinks: { + type: Boolean, + required: false, + default: false + }, + embeds: { + type: Boolean, + required: false, + default: true + }, + int: { + type: Boolean, + required: false, + default: true + }, + prefix: { + type: Array, + required: false, + default: ["'"] + } +}); + +module.exports = mongoose.model("server", ServerSchema); \ No newline at end of file diff --git a/models/User.js b/models/User.js new file mode 100644 index 0000000..6cf5ba2 --- /dev/null +++ b/models/User.js @@ -0,0 +1,31 @@ +const mongoose = require("mongoose"); + +const User = new mongoose.Schema({ + id: { + type: String, + required: true + }, + economy: { + bank: Number, + cash: Number + }, + blacklist: { + state: { + type: Boolean, + required: false, + default: false + }, + reason: { + type: String, + required: false + }, + date: { + type: Date, + required: false + }, + + } + +}); + +module.exports = mongoose.model("user", User); \ No newline at end of file diff --git a/utils/src/Shortlinks.js b/utils/src/Shortlinks.js new file mode 100755 index 0000000..1745fa6 --- /dev/null +++ b/utils/src/Shortlinks.js @@ -0,0 +1,80 @@ +const ShortLinkReg = /(?:\s|^)(gh|gl|gd|owo|aud|sg|ttv|teknik|bb|yt|bc|bcu|sc|bot|sw|tw|npm|xkcd)\/([a-zA-Z0-9-_.#/!]*)/g; +const ShortLinks = { + gh: 'https://github.com/$link$', + gl: 'https://gitlab.com/$link$', + yt: 'https://youtu.be/$link$', + tw: 'https://twitter.com/$link$', + npm: 'https://npm.im/$link$', + ttv: 'https://twitch.tv/$link$', + gd: 'https://gitdab.com/$link$', + owo: 'https://owo.codes/$link$', + sg: 'https://git.supernets.org/$link$', + teknik: 'https://git.teknik.io/$link$', + bb: 'https://bitbucket.org/$link$', + bc: 'https://$link$.bandcamp.com/', + bcu: 'https://bandcamp.com/$link$', + sc: 'https://soundcloud.com/$link$', + aud: 'https://audius.co/$link$', + // aur: 'https://aur.archlinux.org/packages/$link$', + sw: 'https://steamcommunity.com/sharedfiles/filedetails/?id=$link$', + bot: '', + xkcd: 'https://xkcd.com/$link$' +}; +const ShortLinkDirs = { + gh: 'Github', + gl: 'Gitlab', + gd: 'Gitdab', + yt: 'Youtube', + tw: 'Twitter', + npm: 'NPM', + ttv: 'TwitchTv', + owo: 'owo_codes', + sg: 'Supernets_Git', + aud: 'Audius', + teknik: 'Teknik_Git', + bb: 'BitBucket', + bc: 'Bandcamp_Band', + bcu: 'Bandcamp_User', + sc: 'Soundcloud', + // aur: 'Arch_Packages', + sw: 'Steam_Workshop', + bot: 'Discord_Bot_Invite', + xkcd: 'xkcd' +}; +const db = require('quick.db'); +const backend = new db.table('backend'); +module.exports = async function Shortlink(enabled, msg) { + if (!enabled || enabled === null || enabled === undefined) return; + let res = msg.content.match(ShortLinkReg); + if (!res) return; + res = res.map((x) => (x.startsWith(' ') ? x.substring(1) : x)); + let links = []; + let Amount = []; + + for (const m in res) { + for (const x in ShortLinks) { + let url = res[m]; + if (!url.startsWith(x)) continue; + url = url.replace(x + '/', ''); + + if (x == 'gh' || x == 'gl' || x == 'gd') { + url = url.replace('#', '/issues/'); + } + + if (x == 'gl') { + url = url.replace('!', '/merge_requests/'); + } else if (x == 'gd') { + url = url.replace('!', '/pulls/'); + } else if (x == 'gh') { + url = url.replace('!', '/pull/'); + } + + url = ShortLinks[x].replace('$link$', url); + links.push(`${url}`); + await backend.add(`Shortlink.${ShortLinkDirs[x]}`, 1); + await backend.add(`Shortlink.total`, 1); + } + } + + msg.channel.send(links.join('\n')); +}; \ No newline at end of file diff --git a/utils/src/SourceFynnder.js b/utils/src/SourceFynnder.js new file mode 100755 index 0000000..953d79a --- /dev/null +++ b/utils/src/SourceFynnder.js @@ -0,0 +1,78 @@ +const axios = require('axios'); +const db = require('quick.db'); +const backend = new db.table('backend'); +const Servers = new db.table('servers'); +let md5 = new RegExp( + '((?:!)?https?://static[0-9]*.(?:e621|e926).net/data/(?:sample/|preview/|)[0-9a-f]{2}/[0-9a-f]{2}/([0-9a-f]{32}).([0-9a-z]+))', + 'igm' +); + +let search_md5 = 'https://e621.net/post/show.json?md5='; +let e6 = 'https://e621.net/post/show/'; +let e9 = 'https://e926.net/post/show/'; + +const version = '0.1.0'; + +async function SourceFynnderBot(enabled, msg) { + if (!enabled || enabled === null || enabled === undefined) return; + res = msg.content.match(md5); + if (!res) return; + + let Sources = []; + for (const m in res) { + let URL = res[m]; + let hash = URL.split(md5)[2]; + + let { + data + } = await axios.get(search_md5 + hash, { + headers: { + 'user-agent': `SourceFynnder/${version} (ry / codepupper)` + } + }); + if (data.rating === 's') { + Source = e9 + data.id; + } else { + Source = e6 + data.id; + } + Sources.push(`:link::mag: ${Source}`); + } + msg.channel.send(Sources); + await backend.add('SourceFynnder.found', Sources.length); + await backend.add('SourceFynnder.foundBot', Sources.length); + await Servers.add(`${msg.guild.id}.foundSources`, Sources.length); +}; + +async function SourceFynnderAPI(url) { + url = url.toString().replace(/\,/g, ' ') + res = url.match(md5); + if (!res) throw new Error('Not a Valid e621/e926 URL'); + + let Sources = []; + for (const m in res) { + let URL = res[m]; + let hash = URL.split(md5)[2]; + + let { + data + } = await axios.get(search_md5 + hash, { + headers: { + 'user-agent': `SourceFynnder/${version} (ry / codepupper)` + } + }); + if (data.rating === 's') { + Source = e9 + data.id; + } else { + Source = e6 + data.id; + } + Sources.push(`${Source}`); + } + await backend.add('SourceFynnder.found', Sources.length); + await backend.add('SourceFynnder.foundAPI', Sources.length); + return Sources +}; + +module.exports = { + SourceFynnder: SourceFynnderBot, + APIFind: SourceFynnderAPI +} \ No newline at end of file diff --git a/vars.js b/vars.js new file mode 100644 index 0000000..51acde6 --- /dev/null +++ b/vars.js @@ -0,0 +1,43 @@ +module.exports = { + name: 'Thaldrin', + version: '3.6.4', + color: '#ff995d', + hostname: '127.2.11.1', + //hostname: 'localhost', + port: '8080', + type: { + beta: true, + prod: false + }, + prefixes: ["'", `<@434662676547764244> `, '<@!434662676547764244> '], + developers: [{ + id: '318044130796109825', + nick: 'ry' + }, + { + id: '251788826232619008', + nick: 'feo' + } + ], + logs: { + usage: '663740167684620318' + }, + contributors: [{ + id: '150745989836308480', + nick: 'Cyn', + reason: 'Shortlink Code :3' + }, + { + id: '356323373443448843', + nick: 'Twiggy', + reason: 'Letting me use his Sona as the Mascot <3' + }, + { + id: '289947794142396427', + nick: 'Fynn', + reason: 'Letting me use his name for `SourceFynnder` <3' + } + ], + source: 'https://gitdab.com/r/thaldrin', + invite: 'https://discordapp.com/oauth2/authorize?client_id=434662676547764244&scope=bot&permissions=379968' +}; \ No newline at end of file