├── .github └── workflows │ ├── codeql-analysis.yml │ └── node.js.yml ├── .gitignore ├── README.md ├── autoRun ├── Node1_McChecker.js ├── Node2_McChecker.js ├── RedditMemes.js ├── autoservercheckernode2.js ├── autoservercheckernode4.js ├── deletechannels.js ├── invites.js ├── lavalink.js ├── updateTicketMessage.js └── wingsStatus.js ├── commands ├── admin │ ├── 4k.js │ ├── analysenode1.js │ ├── analysenode2.js │ ├── blacklist.js │ ├── eval.js │ ├── exec.js │ ├── gif.js │ ├── hentai.js │ ├── neko.js │ ├── node4.js │ ├── random.js │ ├── stealemoji.js │ └── userlink.js ├── info │ ├── avatar.js │ ├── buy.js │ ├── help.js │ ├── invites.js │ ├── links.js │ ├── ping.js │ ├── snipe.js │ └── uptime.js ├── music │ ├── help.js │ ├── join.js │ ├── node.js │ ├── nowplaying.js │ ├── pause.js │ ├── play.js │ ├── queue.js │ ├── resume.js │ └── skip.js ├── server │ ├── changeversion.js │ ├── count.js │ ├── create.js │ ├── delete.js │ ├── help.js │ ├── invite.js │ ├── list.js │ ├── proxy.js │ ├── redeem.js │ ├── renew.js │ ├── status.js │ └── unproxy.js ├── staff │ ├── ban.js │ ├── create-partner.js │ ├── dmintol.js │ ├── finduser.js │ ├── gencode.js │ ├── help.js │ ├── info.js │ ├── kick.js │ ├── link.js │ ├── list.js │ ├── proxyfix.js │ ├── resetcount.js │ ├── setcount.js │ └── transfer.js └── user │ ├── delete.js │ ├── help.js │ ├── link.js │ ├── new.js │ └── password.js ├── config.template.json ├── ecosystem.config.js ├── events ├── Lavalink │ ├── nodeConnect.js │ ├── nodeCreate.js │ ├── nodeDisconnect.js │ ├── nodeError.js │ ├── nodeReconnect.js │ ├── playerCreate.js │ ├── playerDestroy.js │ ├── playerMove.js │ ├── queueEnd.js │ ├── trackEnd.js │ ├── trackError.js │ ├── trackStart.js │ └── trackStuck.js ├── error.js ├── guildMemberAdd.js ├── guildMemberRemove.js ├── interactionCreate.js ├── messageCreate.js ├── messageDelete.js ├── messageReactionAdd.js ├── messageUpdate.js ├── ready.js └── roleLogger.js ├── handlers ├── anti_crash.js ├── autodelete.js ├── command_handler.js ├── convert.js ├── event_handler.js ├── loadslash.js ├── mongoose.js ├── music.js └── progressbar.js ├── index.js ├── logs ├── console.log.js └── console │ └── placeholder.txt ├── models ├── ServerCount.js ├── serverData.js └── userData.js ├── nginxPM ├── deleteProxy.js ├── findProxy.js ├── getDomainIp.js ├── getKey.js ├── index.js └── proxy.js ├── package-lock.json ├── package.json ├── paid_creation └── paper.js ├── scam.json ├── server_creation ├── aio.js ├── bedrock.js ├── fabric.js ├── fivem.js ├── nginx.js ├── nodejs.js ├── paper.js ├── pocketminemp.js ├── purpur.js ├── python.js ├── uptimekuma.js └── vanillamc.js ├── slashCommands ├── info │ ├── myinfo.js │ └── ping.js └── server │ ├── count.js │ ├── create.js │ ├── serverlist.js │ └── status.js └── start.sh /.github/workflows/codeql-analysis.yml: -------------------------------------------------------------------------------- 1 | # For most projects, this workflow file will not need changing; you simply need 2 | # to commit it to your repository. 3 | # 4 | # You may wish to alter this file to override the set of languages analyzed, 5 | # or to provide custom queries or build logic. 6 | # 7 | # ******** NOTE ******** 8 | # We have attempted to detect the languages in your repository. Please check 9 | # the `language` matrix defined below to confirm you have the correct set of 10 | # supported CodeQL languages. 11 | # 12 | name: "CodeQL" 13 | 14 | on: 15 | push: 16 | branches: [ master ] 17 | pull_request: 18 | # The branches below must be a subset of the branches above 19 | branches: [ master ] 20 | schedule: 21 | - cron: '25 0 * * 1' 22 | 23 | jobs: 24 | analyze: 25 | name: Analyze 26 | runs-on: ubuntu-latest 27 | permissions: 28 | actions: read 29 | contents: read 30 | security-events: write 31 | 32 | strategy: 33 | fail-fast: false 34 | matrix: 35 | language: [ 'javascript' ] 36 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] 37 | # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support 38 | 39 | steps: 40 | - name: Checkout repository 41 | uses: actions/checkout@v3 42 | 43 | # Initializes the CodeQL tools for scanning. 44 | - name: Initialize CodeQL 45 | uses: github/codeql-action/init@v2 46 | with: 47 | languages: ${{ matrix.language }} 48 | # If you wish to specify custom queries, you can do so here or in a config file. 49 | # By default, queries listed here will override any specified in a config file. 50 | # Prefix the list here with "+" to use these queries and those in the config file. 51 | 52 | # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs 53 | # queries: security-extended,security-and-quality 54 | 55 | 56 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). 57 | # If this step fails, then you should remove it and run the build manually (see below) 58 | - name: Autobuild 59 | uses: github/codeql-action/autobuild@v2 60 | 61 | # ℹ️ Command-line programs to run using the OS shell. 62 | # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun 63 | 64 | # If the Autobuild fails above, remove it and uncomment the following three lines. 65 | # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. 66 | 67 | # - run: | 68 | # echo "Run, Build Application using script" 69 | # ./location_of_script_within_repo/buildscript.sh 70 | 71 | - name: Perform CodeQL Analysis 72 | uses: github/codeql-action/analyze@v2 -------------------------------------------------------------------------------- /.github/workflows/node.js.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: Node.js CI 5 | 6 | on: 7 | push: 8 | branches: [ master ] 9 | pull_request: 10 | branches: [ master ] 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: ubuntu-latest 16 | 17 | strategy: 18 | matrix: 19 | node-version: [ 18.x ] 20 | # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ 21 | 22 | steps: 23 | - uses: actions/checkout@v3 24 | - name: Use Node.js ${{ matrix.node-version }} 25 | uses: actions/setup-node@v3 26 | with: 27 | node-version: ${{ matrix.node-version }} 28 | cache: 'npm' 29 | - run: npm ci 30 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | ## installed modules 3 | node_modules 4 | .pnpm-store 5 | compose-dev.yaml 6 | 7 | ## host-log 8 | host-bot 9 | 10 | 11 | ### config file 12 | config.json 13 | 14 | 15 | ## logs files 16 | logs 17 | 18 | 19 | ## database 20 | json.sqlite* 21 | 22 | temp/* -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Luxxy-Hosting Host Bot 2 | 3 | this is edited verison of the bot for luxxy hosting. 4 | 5 | you're welcome to make pull requested as well. 6 | 7 | 8 | # setup: 9 | 10 | **install dependencies** 11 | ``` 12 | npm i 13 | ``` 14 | **Edit Configuration** 15 | self explanatory 16 | **run:** 17 | ``` 18 | npm start 19 | ``` 20 | 21 | Thanks to zachary#0842 for helping 22 | Credit to JustArtiom for v1 verison of this bot (https://github.com/JustArtiom/ArtiomsHosting-Bot/) -------------------------------------------------------------------------------- /autoRun/Node1_McChecker.js: -------------------------------------------------------------------------------- 1 | const config = require('../config.json') 2 | const pinger = require('minecraft-pinger') 3 | const wait = require('node:timers/promises').setTimeout; 4 | const axios = require('axios') 5 | const chalk = require('chalk') 6 | const Discord = require('discord.js') 7 | module.exports = async (client) => { 8 | if(!config.settings.McScript) return 9 | 10 | async function runeverything () { 11 | console.log(`${chalk.blue('[ Security ]')}`+" Minecraft Port Checker started :D") 12 | let data = (await axios({ 13 | url: config.pterodactyl.host+"/api/application/nodes/" + '2' + "?include=servers,allocations", 14 | method: 'GET', 15 | followRedirect: true, 16 | maxRedirects: 5, 17 | headers: { 18 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 19 | 'Content-Type': 'application/json', 20 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 21 | } 22 | }).catch(() => {return console.log('uhhh- something is happening with the pannel and i cant get information about the servers and allocations')}))?.data.attributes.relationships 23 | 24 | let allocations = data.allocations.data 25 | let servers = data.servers.data.filter(server => !config.settings.avoidServerPorts.includes(allocations.find(allocation => allocation.attributes.id === server.attributes.allocation)?.attributes.port)) 26 | 27 | for(let server of servers){ 28 | await wait(3000) 29 | let allocation = allocations.find(all => all.attributes.id === server.attributes.allocation) 30 | console.log(chalk.red('[ Security ]')+` Checking ${server.attributes.name} on port ${allocation.attributes.port}`+ ` Node: 1`) 31 | let mc = await pinger.pingPromise('n1.luxxy.host', allocation.attributes.port).catch(()=>{}) 32 | if(mc) { 33 | 34 | let user = (await axios({ 35 | url: config.pterodactyl.host + "/api/application/users/"+ server.attributes.user, 36 | method: 'GET', 37 | followRedirect: true, 38 | maxRedirects: 5, 39 | headers: { 40 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 41 | 'Content-Type': 'application/json', 42 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 43 | } 44 | }).catch(err => {}))?.data 45 | console.log(`${chalk.red('[ Security ]')} Minecraft server found on port ${chalk.bold(`${allocation.attributes.port}`)}, Server ID: ${chalk.bold(`${server.attributes.uuid?.split('-')[0]}`)}, Discord ID: ${chalk.bold(`${userData.all().find(x => JSON.parse(x.data).consoleID === user?.attributes.id)}`)}`) 46 | await client.channels.cache.get(config.channelID.abuse).send({ 47 | embeds:[ 48 | new Discord.EmbedBuilder() 49 | .setTitle(`Minecraft Server Found!`) 50 | .setColor(`RED`) 51 | .setDescription(`` 52 | + `**Server info:**\n` 53 | + `Server id: \`${server.attributes.uuid?.split('-')[0]}\`\n` 54 | + `Server name: \`${server.attributes.name}\`\n` 55 | + `Server port: \`${allocation.attributes.port}\`\n` 56 | + `Server domain: \`${allocation.attributes.alias}\`\n` 57 | + `\n` 58 | + `**Minecraft Stats:**\n` 59 | + `Description: \`${mc.description?.text}\`\n` 60 | + `Players online: \`${mc.players.online}\`\n` 61 | + `Players Max: \`${mc.players.max}\`\n` 62 | + `Version: \`${mc.version.name}\`\n` 63 | + `Ping: \`${mc.ping} ms\`\n` 64 | + `\n` 65 | + `**User info:**\n` 66 | + `User id: \`${user?.attributes.id}\`\n` 67 | + `Username: \`${user?.attributes.username}\`\n` 68 | + `Email: \`${user?.attributes.email}\`\n` 69 | + `Discord id: \`${userData.all().find(x => JSON.parse(x.data).consoleID === user?.attributes.id)}\`` 70 | ) 71 | ] 72 | }) 73 | } 74 | } 75 | } 76 | 77 | runeverything() 78 | setInterval(() => { 79 | runeverything() 80 | }, 21600000) 81 | 82 | } -------------------------------------------------------------------------------- /autoRun/Node2_McChecker.js: -------------------------------------------------------------------------------- 1 | const config = require('../config.json') 2 | const pinger = require('minecraft-pinger') 3 | const wait = require('node:timers/promises').setTimeout; 4 | const axios = require('axios') 5 | const chalk = require('chalk') 6 | const Discord = require('discord.js') 7 | module.exports = async (client) => { 8 | if(!config.settings.McScript) return 9 | 10 | async function runeverything () { 11 | console.log(`${chalk.blue('[ Security ]')}`+" Minecraft Port Checker started :D") 12 | let data = (await axios({ 13 | url: config.pterodactyl.host+"/api/application/nodes/" + '1' + "?include=servers,allocations", 14 | method: 'GET', 15 | followRedirect: true, 16 | maxRedirects: 5, 17 | headers: { 18 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 19 | 'Content-Type': 'application/json', 20 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 21 | } 22 | }).catch(() => {return console.log('uhhh- something is happening with the pannel and i cant get information about the servers and allocations')}))?.data.attributes.relationships 23 | 24 | let allocations = data.allocations.data 25 | let servers = data.servers.data.filter(server => !config.settings.avoidServerPorts.includes(allocations.find(allocation => allocation.attributes.id === server.attributes.allocation)?.attributes.port)) 26 | 27 | for(let server of servers){ 28 | await wait(3000) 29 | let allocation = allocations.find(all => all.attributes.id === server.attributes.allocation) 30 | console.log(chalk.red('[ Security ]')+` Checking ${server.attributes.name} on port ${allocation.attributes.port}`+ ` Node: 2`) 31 | let mc = await pinger.pingPromise('n2.luxxy.host', allocation.attributes.port).catch(()=>{}) 32 | if(mc) { 33 | 34 | let user = (await axios({ 35 | url: config.pterodactyl.host + "/api/application/users/"+ server.attributes.user, 36 | method: 'GET', 37 | followRedirect: true, 38 | maxRedirects: 5, 39 | headers: { 40 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 41 | 'Content-Type': 'application/json', 42 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 43 | } 44 | }).catch(err => {}))?.data 45 | console.log(`${chalk.red('[ Security ]')} Minecraft server found on port ${chalk.bold(`${allocation.attributes.port}`)}, Server ID: ${chalk.bold(`${server.attributes.uuid?.split('-')[0]}`)}, Discord ID: ${chalk.bold(`${userData.all().find(x => JSON.parse(x.data).consoleID === user?.attributes.id)}`)}`) 46 | await client.channels.cache.get(config.channelID.abuse).send({ 47 | embeds:[ 48 | new Discord.EmbedBuilder() 49 | .setTitle(`Minecraft Server Found!`) 50 | .setColor(`RED`) 51 | .setDescription(`` 52 | + `**Server info:**\n` 53 | + `Server id: \`${server.attributes.uuid?.split('-')[0]}\`\n` 54 | + `Server name: \`${server.attributes.name}\`\n` 55 | + `Server port: \`${allocation.attributes.port}\`\n` 56 | + `Server domain: \`${allocation.attributes.alias}\`\n` 57 | + `\n` 58 | + `**Minecraft Stats:**\n` 59 | + `Description: \`${mc.description?.text}\`\n` 60 | + `Players online: \`${mc.players.online}\`\n` 61 | + `Players Max: \`${mc.players.max}\`\n` 62 | + `Version: \`${mc.version.name}\`\n` 63 | + `Ping: \`${mc.ping} ms\`\n` 64 | + `\n` 65 | + `**User info:**\n` 66 | + `User id: \`${user?.attributes.id}\`\n` 67 | + `Username: \`${user?.attributes.username}\`\n` 68 | + `Email: \`${user?.attributes.email}\`\n` 69 | + `Discord id: \`${userData.all().find(x => JSON.parse(x.data).consoleID === user?.attributes.id)}\`` 70 | ) 71 | ] 72 | }) 73 | } 74 | } 75 | } 76 | 77 | runeverything() 78 | setInterval(() => { 79 | runeverything() 80 | }, 21600000) 81 | 82 | } -------------------------------------------------------------------------------- /autoRun/RedditMemes.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder, Colors } = require('discord.js'); 2 | const axios = require('axios'); 3 | const chalk = require('chalk'); 4 | const config = require('../config.json'); 5 | 6 | const memeChannelId = config.channelID?.memes || '1364587658281484320'; 7 | 8 | const memeSubreddits = [ 9 | 'memes', 10 | 'dankmemes', 11 | 'funny', 12 | 'wholesomememes', 13 | 'HistoryMemes', 14 | 'ProgrammerHumor', 15 | 'AdviceAnimals', 16 | 'MemeEconomy', 17 | 'Animemes', 18 | 'PrequelMemes' 19 | ]; 20 | 21 | const postIntervalMinutes = 5; 22 | let lastMemeUrl = ''; 23 | 24 | async function fetchAndPostMeme(client, targetChannel) { 25 | if (!client || !targetChannel || !targetChannel.isTextBased()) { 26 | console.error(chalk.red('[Meme] Invalid client or channel object passed to fetchAndPostMeme.')); 27 | return; 28 | } 29 | console.log(chalk.blue(`[Meme] Attempting to fetch a new meme...`)); 30 | 31 | let memeData = null; 32 | const shuffledSubreddits = [...memeSubreddits].sort(() => 0.5 - Math.random()); 33 | 34 | for (const subreddit of shuffledSubreddits) { 35 | try { 36 | const url = `https://www.reddit.com/r/${subreddit}/hot.json?limit=100`; 37 | console.log(chalk.cyan(`[Meme] Trying subreddit: r/${subreddit}`)); 38 | 39 | const response = await axios.get(url, { timeout: 8000 }); 40 | const posts = response.data?.data?.children; 41 | 42 | if (!posts || posts.length === 0) { 43 | console.warn(chalk.yellow(`[Meme] No posts returned from r/${subreddit}.`)); 44 | continue; 45 | } 46 | 47 | const validPosts = posts 48 | .map(post => post.data) 49 | .filter(post => 50 | post && 51 | !post.stickied && 52 | !post.over_18 && 53 | post.url && 54 | (post.post_hint === 'image' || /\.(jpg|jpeg|png|gif)$/i.test(post.url)) && 55 | post.url !== lastMemeUrl 56 | ); 57 | 58 | if (validPosts.length > 0) { 59 | memeData = validPosts[Math.floor(Math.random() * validPosts.length)]; 60 | lastMemeUrl = memeData.url; 61 | console.log(chalk.green(`[Meme] Found meme from r/${subreddit}: "${memeData.title}"`)); 62 | break; 63 | } else { 64 | console.warn(chalk.yellow(`[Meme] No suitable image posts found in r/${subreddit} this time.`)); 65 | } 66 | 67 | } catch (error) { 68 | if (axios.isAxiosError(error)) { 69 | console.error(chalk.red(`[Meme] Axios error fetching from r/${subreddit}: ${error.response?.status || error.message}`)); 70 | } else { 71 | console.error(chalk.red(`[Meme] Non-Axios error fetching from r/${subreddit}:`), error); 72 | } 73 | } 74 | } 75 | 76 | if (!memeData) { 77 | console.error(chalk.red('[Meme] Failed to fetch a suitable meme after trying multiple subreddits.')); 78 | return; 79 | } 80 | 81 | try { 82 | const embed = new EmbedBuilder() 83 | .setTitle(memeData.title.substring(0, 256)) 84 | .setURL(`https://reddit.com${memeData.permalink}`) 85 | .setImage(memeData.url) 86 | .setColor(client.embedColor || config.embedColor || Colors.Orange) 87 | .setFooter({ text: `r/${memeData.subreddit} • Posted by u/${memeData.author} • 👍 ${memeData.ups}` }); 88 | 89 | await targetChannel.send({ embeds: [embed] }); 90 | console.log(chalk.green(`[Meme] Successfully posted meme to channel #${targetChannel.name} (${targetChannel.id}).`)); 91 | } catch (error) { 92 | console.error(chalk.red(`[Meme] Failed to send meme embed to Discord channel ${targetChannel.id}:`), error); 93 | } 94 | } 95 | 96 | module.exports = async (client) => { 97 | if (!memeChannelId) { 98 | console.error(chalk.red('[Meme] Meme channel ID (config.channelID.memes) is not defined in config.json. Meme posting disabled.')); 99 | return; 100 | } 101 | 102 | console.log(chalk.blue('[Meme] Waiting a few seconds for client cache...')); 103 | await new Promise(resolve => setTimeout(resolve, 5000)); 104 | 105 | const memeChannel = client.channels.cache.get(memeChannelId); 106 | 107 | if (memeChannel && memeChannel.isTextBased()) { 108 | console.log(chalk.blue(`[Meme] Initializing meme poster for channel #${memeChannel.name}. Interval: ${postIntervalMinutes} minutes.`)); 109 | 110 | // await fetchAndPostMeme(client, memeChannel); // Optional immediate run 111 | 112 | setInterval(() => { 113 | fetchAndPostMeme(client, memeChannel); 114 | }, postIntervalMinutes * 60 * 1000); 115 | 116 | } else { 117 | console.error(chalk.red(`[Meme] Could not find meme channel with ID: ${memeChannelId} or it's not a text-based channel. Meme posting disabled.`)); 118 | } 119 | }; 120 | -------------------------------------------------------------------------------- /autoRun/autoservercheckernode2.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios') 2 | const config = require('../config.json') 3 | const { WebhookClient, EmbedBuilder } = require('discord.js') 4 | const cron = require('node-cron') 5 | 6 | const webhook = new WebhookClient({ id: config.settings.webhook.id, token: config.settings.webhook.token }); 7 | module.exports = async (client) => { 8 | if (!config.settings.serverchecker) return 9 | console.log('checker enabled running every hour on the dot') 10 | cron.schedule('0 * * * *', () => { 11 | axios({ 12 | url: `${config.pterodactyl.host}/api/application/nodes/8?include=servers,allocations`, 13 | method: 'GET', 14 | followRedirect: true, 15 | maxRedirects: 5, 16 | headers: { 17 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 18 | 'Content-Type': 'application/json', 19 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 20 | } 21 | }).then(res => { 22 | const serverid = res.data.attributes.relationships.servers.data.filter(server => server.attributes.identifier) 23 | 24 | for(let server of serverid){ 25 | if (server.attributes.egg === 28 || server.attributes.egg === 45 || server.attributes.egg === 40 || server.attributes.egg === 2 || server.attributes.egg === 47 || server.attributes.egg === 5) { 26 | 27 | axios({ 28 | url: `${config.pterodactyl.host}/api/client/servers/${server.attributes.identifier}/resources`, 29 | method: 'GET', 30 | followRedirect: true, 31 | maxRedirects: 5, 32 | headers: { 33 | 'Authorization': 'Bearer ' + config.pterodactyl.clientAPI, 34 | 'Content-Type': 'application/json', 35 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 36 | } 37 | }).then(serverdata => { 38 | if(serverdata.data.attributes.current_state == 'offline'){ return console.log('offline') } 39 | if (serverdata.data.attributes.resources.uptime > 10800000) { 40 | webhook.send(`${server.attributes.identifier} more then 3 hours ${server.attributes.egg}`) 41 | axios({ 42 | url: `${config.pterodactyl.host}/api/client/servers/${server.attributes.identifier}/power`, 43 | method: 'POST', 44 | followRedirect: true, 45 | maxRedirects: 5, 46 | headers: { 47 | 'Authorization': 'Bearer ' + config.pterodactyl.clientAPI, 48 | 'Content-Type': 'application/json', 49 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 50 | }, 51 | data: { 52 | "signal": "kill" 53 | }, 54 | }).then(kille => { 55 | console.log(kille) 56 | }).catch(fuckfuck => console.log(fuckfuck)) 57 | webhook.send(`${server.attributes.identifier} kill ${server.attributes.egg}`) 58 | } else { 59 | return webhook.send(`${server.attributes.identifier} safe ${server.attributes.egg}`) 60 | } 61 | 62 | }).catch(e => { console.log(e) }) 63 | } else webhook.send(`${server.attributes.identifier} not a minecraft server ${server.attributes.egg}`) 64 | } 65 | }).catch(() => {return console.log('uhhh- something is happening with the pannel and i cant get information about the servers')}) 66 | }) 67 | } 68 | -------------------------------------------------------------------------------- /autoRun/autoservercheckernode4.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios') 2 | const config = require('../config.json') 3 | const { WebhookClient, EmbedBuilder } = require('discord.js') 4 | const cron = require('node-cron') 5 | 6 | const webhook = new WebhookClient({ id: config.settings.webhook.id, token: config.settings.webhook.token }); 7 | module.exports = async (client) => { 8 | return webhook.send('disabled') 9 | // if (!config.settings.serverchecker) return 10 | // console.log('checker enabled running every hour on the dot') 11 | // cron.schedule('0 * * * *', () => { 12 | // axios({ 13 | // url: `${config.pterodactyl.host}/api/application/nodes/10?include=servers,allocations`, 14 | // method: 'GET', 15 | // followRedirect: true, 16 | // maxRedirects: 5, 17 | // headers: { 18 | // 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 19 | // 'Content-Type': 'application/json', 20 | // 'Accept': 'Application/vnd.pterodactyl.v1+json', 21 | // } 22 | // }).then(res => { 23 | // const serverid = res.data.attributes.relationships.servers.data.filter(server => server.attributes.identifier) 24 | 25 | // for(let server of serverid){ 26 | // if (server.attributes.egg === 28 || server.attributes.egg === 45 || server.attributes.egg === 40 || server.attributes.egg === 2 || server.attributes.egg === 47 || server.attributes.egg === 5) { 27 | 28 | // axios({ 29 | // url: `${config.pterodactyl.host}/api/client/servers/${server.attributes.identifier}/resources`, 30 | // method: 'GET', 31 | // followRedirect: true, 32 | // maxRedirects: 5, 33 | // headers: { 34 | // 'Authorization': 'Bearer ' + config.pterodactyl.clientAPI, 35 | // 'Content-Type': 'application/json', 36 | // 'Accept': 'Application/vnd.pterodactyl.v1+json', 37 | // } 38 | // }).then(serverdata => { 39 | // if(serverdata.data.attributes.current_state == 'offline'){ return console.log('offline') } 40 | // if (serverdata.data.attributes.resources.uptime > 10800000) { 41 | // webhook.send(`${server.attributes.identifier} more then 3 hours ${server.attributes.egg}`) 42 | // axios({ 43 | // url: `${config.pterodactyl.host}/api/client/servers/${server.attributes.identifier}/power`, 44 | // method: 'POST', 45 | // followRedirect: true, 46 | // maxRedirects: 5, 47 | // headers: { 48 | // 'Authorization': 'Bearer ' + config.pterodactyl.clientAPI, 49 | // 'Content-Type': 'application/json', 50 | // 'Accept': 'Application/vnd.pterodactyl.v1+json', 51 | // }, 52 | // data: { 53 | // "signal": "kill" 54 | // }, 55 | // }).then(kille => { 56 | // console.log(kille) 57 | // }).catch(fuckfuck => console.log(fuckfuck)) 58 | // webhook.send(`${server.attributes.identifier} kill ${server.attributes.egg}`) 59 | // } else { 60 | // return webhook.send(`${server.attributes.identifier} safe ${server.attributes.egg}`) 61 | // } 62 | 63 | // }).catch(e => { console.log(e) }) 64 | // } else webhook.send(`${server.attributes.identifier} not a minecraft server ${server.attributes.egg}`) 65 | // } 66 | // }).catch(() => {return console.log('uhhh- something is happening with the pannel and i cant get information about the servers')}) 67 | // }) 68 | } 69 | -------------------------------------------------------------------------------- /autoRun/deletechannels.js: -------------------------------------------------------------------------------- 1 | const config = require('../config.json') 2 | 3 | module.exports = async (client) => { 4 | const guild = client.guilds.cache.get(config.settings.guildID) 5 | 6 | guild.channels.cache.filter(c => c.parentId === config.parentID.createAccount ).forEach(async (channel) => { 7 | channel.delete({ reason: 'Auto-deleted' }) 8 | console.log(`Deleted channel ${channel.name} (${channel.id})`) 9 | }) 10 | } -------------------------------------------------------------------------------- /autoRun/lavalink.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json') 3 | 4 | module.exports = async (client) => { 5 | if(!config.settings.lavalinkStatus) return 6 | const channel = client.channels.cache.get(config.lavalink.channelID) 7 | let msg = (await channel.messages.fetch({limit: 10})).filter(m => m.author.id === client.user.id).last() 8 | 9 | const embed = new Discord.EmbedBuilder() 10 | .setColor(0x2F3136) 11 | .setDescription("Please wait for a minute!\nStatus is getting ready!") 12 | 13 | if(!msg) { 14 | channel.send({embeds: [embed]}) 15 | }else { 16 | msg.edit({embeds: [embed]}) 17 | } 18 | 19 | setInterval(() => { 20 | let all = [] 21 | client.manager.nodes.forEach(node => { 22 | let info = [] 23 | info.push(`Status: ${node.connected ? "🟢" : "🔴"}`) 24 | info.push(`Node: ${(node.options.identifier)}`) 25 | info.push(`Player: ${node.stats.players}`) 26 | info.push(`Playing Players: ${node.stats.playingPlayers}`) 27 | info.push(`Uptime: ${new Date(node.stats.uptime).toISOString().slice(11, 19)}`) 28 | info.push("\nCPU") 29 | info.push(`Cores: ${node.stats.cpu.cores}`) 30 | info.push(`System Load: ${(Math.round(node.stats.cpu.systemLoad * 100) / 100).toFixed(2)}%`) 31 | info.push(`Lavalink Load: ${(Math.round(node.stats.cpu.lavalinkLoad * 100) / 100).toFixed(2)}%`) 32 | all.push(info.join('\n')) 33 | }) 34 | client.manager.nodes.forEach(node => { 35 | const rembed = new Discord.EmbedBuilder() 36 | .setAuthor({ name: `Luxxy Hosting Lavalink Status`, iconURL: `${client.user.avatarURL({ size: 1024, format: 'png' })}`, url: 'https://discord.js.org' }) 37 | .setDescription(`\`\`\`${all.join('\n\n----------------------------\n')}\n\n` + 38 | `Node - [1]\n` + 39 | `Total Memory - [${Math.round(require('os').totalmem() / 2000/ 2000)}mb]\n` + 40 | `Free Memory - [${Math.round(require('os').freemem() / 1024 / 1024)} mb]\n` + 41 | `RSS - [${Math.round(process.memoryUsage().rss / 1024 / 1024)} mb]\n` + 42 | `Heap Total - [${Math.round(process.memoryUsage().heapTotal / 1024 / 1024)} mb]\n` + 43 | `Heap Used - [${Math.round(process.memoryUsage().heapUsed / 1024 / 1024)} mb]\n` + 44 | `External - [${Math.round(process.memoryUsage().external / 1024 / 1024)} mb]\n` + 45 | `Array Buffer - [${Math.round(process.memoryUsage().rss / 1024 / 1024)} mb]\n` + 46 | `CPU Model - [${require('os').cpus()[0].model}]\n` + 47 | `Cores - [${require('os').cpus().length}]\n` + 48 | `Speed - [${require('os').cpus()[0].speed}Mhz]\n` + 49 | `Platform - [${process.platform}]\n` + 50 | `PID - [${process.pid}]\n` + 51 | `\n` + `\`\`\``) 52 | .setColor(0x5865F2) 53 | .setTimestamp(Date.now()); 54 | msg.edit({embeds: [rembed]}); 55 | }) 56 | }, 10000) 57 | } -------------------------------------------------------------------------------- /autoRun/updateTicketMessage.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, ChannelType, DiscordAPIError } = require('discord.js'); 2 | const config = require('../config.json'); 3 | 4 | module.exports = async (client) => { 5 | return; 6 | let channel = client.channels.cache.get(config.channelID.ticketChannel); 7 | 8 | if (!channel || channel.type !== ChannelType.GuildText) return; 9 | 10 | let msg = (await channel.messages.fetch({ limit: 10 }))?.last(); 11 | 12 | let toSendEmbed = [ 13 | new EmbedBuilder() 14 | .setTitle(`Interactions`) 15 | .setColor(`Aqua`) 16 | .setDescription(`📩 - Create a ticket\n💻 - Apply for volunteer developer\n👨‍💼 - Apply staff`) 17 | ]; 18 | 19 | let ToSendComponents = [ 20 | new ActionRowBuilder().addComponents( 21 | new ButtonBuilder() 22 | .setCustomId('CreateTicket') 23 | .setEmoji('📩') 24 | .setStyle(ButtonStyle.Secondary) 25 | .setDisabled(!config.settings.interactions.createTicket), 26 | 27 | new ButtonBuilder() 28 | .setCustomId('ApplyDeveloper') 29 | .setEmoji('💻') 30 | .setStyle(ButtonStyle.Secondary) 31 | .setDisabled(!config.settings.interactions.developer), 32 | 33 | new ButtonBuilder() 34 | .setCustomId('ApplyStaff') 35 | .setEmoji('👨‍💼') 36 | .setStyle(ButtonStyle.Secondary) 37 | .setDisabled(!config.settings.interactions.staff) 38 | ) 39 | ]; 40 | 41 | if (msg) { 42 | await msg.edit({ embeds: toSendEmbed, components: ToSendComponents }); 43 | } else { 44 | await channel.send({ embeds: toSendEmbed, components: ToSendComponents }); 45 | } 46 | }; 47 | -------------------------------------------------------------------------------- /autoRun/wingsStatus.js: -------------------------------------------------------------------------------- 1 | const config = require('../config.json') 2 | const { EmbedBuilder } = require('discord.js') 3 | const axios = require('axios') 4 | module.exports = async (client) => { 5 | if(!config.settings.nodeStatus) return 6 | 7 | setInterval(async() => { 8 | let channel = client.channels.cache.get(config.channelID.nodeStatus) 9 | let msg = (await channel.messages.fetch({limit: 10})).filter(m => m.author.id === client.user.id).last() 10 | 11 | let panel = '' 12 | let node1 = '' 13 | let lavalink = '' 14 | 15 | await axios({ 16 | url: config.pterodactyl.host+"/api/application/nodes/" + "8" + "?include=servers,location,allocations", 17 | method: 'GET', 18 | followRedirect: true, 19 | maxRedirects: 5, 20 | headers: { 21 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 22 | 'Content-Type': 'application/json', 23 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 24 | } 25 | }).then(async node => { 26 | panel = "🟢 Online" 27 | 28 | await axios({ 29 | url: config.pterodactyl.host + '/api/client/servers/' + config.settings.statusembeds.node1 + "/resources", 30 | method: 'GET', 31 | followRedirect: true, 32 | maxRedirects: 5, 33 | headers: { 34 | 'Authorization': 'Bearer ' + config.pterodactyl.clientAPI, 35 | 'Content-Type': 'application/json', 36 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 37 | } 38 | }).then(data => { 39 | node1 = `🟢 Online (${node.data.attributes.relationships.servers.data.length}/600)` 40 | lavalink = `${data.data.attributes.current_state === 'running' ? `🟢 Online`: data.data.attributes.current_state === 'offline' ? `🔴 Offline` : `🔄 ${data.data.attributes.current_state}`}` 41 | }).catch(() => { 42 | lavalink = `🔴 Offline` 43 | node1 = `🔴 Offline (${node.data.attributes.relationships.servers.data.length}/600)` 44 | }) 45 | 46 | }).catch(err => { 47 | panel = '🔴 Offline' 48 | node1 = '🔴 Offline' 49 | }) 50 | 51 | 52 | let embed = [ 53 | new EmbedBuilder() 54 | .setTitle(`Luxxy Hosting Node Status:`) 55 | .setDescription(`**Node Status:**\nNode 1: ${node1}\n\nPanel: ${panel}\n\n*updating every \`${config.settings.nodeStatusDelay} seconds\`*`) 56 | .setColor(`#677bf9`) 57 | .setTimestamp() 58 | .setFooter({text: `Last Time Updated`}) 59 | ] 60 | 61 | if(!msg) { 62 | channel.send({embeds: embed}) 63 | }else { 64 | msg.edit({embeds: embed}) 65 | } 66 | 67 | }, config.settings.nodeStatusDelay * 1000) 68 | } -------------------------------------------------------------------------------- /commands/admin/4k.js: -------------------------------------------------------------------------------- 1 | const Discord = require("discord.js"); 2 | const { NekoBot } = require("nekobot-api"); 3 | const api = new NekoBot(); 4 | 5 | module.exports = { 6 | name: "4k", 7 | category: "Owner", 8 | description: "nah", 9 | aliases: ['4k'], 10 | run: async (client, message, args) => { 11 | 12 | if (message.channel.nsfw === true) { 13 | 14 | const nsfw = await api.get("4k") 15 | 16 | const embed = new Discord.EmbedBuilder() 17 | .setImage(nsfw) 18 | 19 | message.reply({ embeds: [embed] }).catch(err => message.reply('error')) 20 | } else return message.reply("not nsfw channel") 21 | 22 | } 23 | } -------------------------------------------------------------------------------- /commands/admin/analysenode1.js: -------------------------------------------------------------------------------- 1 | const config = require('../../config.json') 2 | const Discord = require('discord.js') 3 | const pretty = require('prettysize'); 4 | const axios = require('axios') 5 | const stringTable = require('string-table') 6 | const ms = require('ms') 7 | module.exports = { 8 | name: "analysenode1", 9 | aliases: [''], 10 | async run(client, message, args){ 11 | if(!message.member.roles.cache.has(config.roleID.administrator)) return message.channel.send('You do not have the required permissions to use this command.') 12 | if(!args[0]) return message.channel.send(`you stupid... chose a number: !analyse `) 13 | let sortby 14 | 15 | if(args[1]) { 16 | sortby = args[1].toLowerCase() === 'cpu' ? "CPU" : args[1].toLowerCase() === "ram" ? "RAM" : args[1].toLowerCase() === "disk" ? "DISK" : null 17 | } 18 | 19 | let msg 20 | let start = Date.now() 21 | await axios({ 22 | url: config.pterodactyl.host+"/api/application/nodes/" + "2" + "?include=servers,location,allocations", 23 | method: 'GET', 24 | followRedirect: true, 25 | maxRedirects: 5, 26 | headers: { 27 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 28 | 'Content-Type': 'application/json', 29 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 30 | } 31 | }).then(async ({data}) => { 32 | 33 | msg = await message.reply('Calculating '+data.attributes.relationships.servers.data.length+' servers. . .') 34 | 35 | let done = (await Promise.all(data.attributes.relationships.servers.data.map(x => x.attributes).map(async server => { 36 | 37 | let id = server.identifier 38 | let name = server.name 39 | 40 | try{ 41 | let {data: {attributes: {resources}}} = await axios({ 42 | url: config.pterodactyl.host + '/api/client/servers/' + id + "/resources", 43 | method: 'GET', 44 | followRedirect: true, 45 | maxRedirects: 5, 46 | headers: { 47 | 'Authorization': 'Bearer ' + config.pterodactyl.clientAPI, 48 | 'Content-Type': 'application/json', 49 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 50 | } 51 | }) 52 | return {Name: name, ID: id, CPU: resources.cpu_absolute + "%", RAM: pretty(resources.memory_bytes), Disk: pretty(resources.disk_bytes), resources} 53 | }catch(err){return {Name: 0, ID: 0, CPU: 0, RAM: 0, Disk: 0, resources: {memory_bytes: "0"}}} 54 | }))).sort(function(a, b) { 55 | return sortby === 'CPU' ? b?.resources?.cpu_absolute - a?.resources?.cpu_absolute : sortby === 'DISK' ? b?.resources?.disk_bytes - a?.resources?.disk_bytes : b?.resources?.memory_bytes - a?.resources?.memory_bytes 56 | }).slice(0, args[0]) 57 | msg.edit(`\`\`\`\n${stringTable.create(done)}\`\`\`\ntime taken: ${ms(Date.now() - start)}`).catch(err => {message.reply(`:x: Too Long Message!`)}) 58 | 59 | }).catch(x => {msg.edit(`${x}.`)}) 60 | } 61 | } -------------------------------------------------------------------------------- /commands/admin/analysenode2.js: -------------------------------------------------------------------------------- 1 | const config = require('../../config.json') 2 | const Discord = require('discord.js') 3 | const pretty = require('prettysize'); 4 | const axios = require('axios') 5 | const stringTable = require('string-table') 6 | const ms = require('ms') 7 | module.exports = { 8 | name: "analysenode2", 9 | aliases: [''], 10 | async run(client, message, args){ 11 | if(!message.member.roles.cache.has(config.roleID.administrator)) return message.channel.send('You do not have the required permissions to use this command.') 12 | if(!args[0]) return message.channel.send(`you stupid... chose a number: !analyse `) 13 | let sortby 14 | 15 | if(args[1]) { 16 | sortby = args[1].toLowerCase() === 'cpu' ? "CPU" : args[1].toLowerCase() === "ram" ? "RAM" : args[1].toLowerCase() === "disk" ? "DISK" : null 17 | } 18 | 19 | let msg 20 | let start = Date.now() 21 | await axios({ 22 | url: config.pterodactyl.host+"/api/application/nodes/" + "1" + "?include=servers,location,allocations", 23 | method: 'GET', 24 | followRedirect: true, 25 | maxRedirects: 5, 26 | headers: { 27 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 28 | 'Content-Type': 'application/json', 29 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 30 | } 31 | }).then(async ({data}) => { 32 | 33 | msg = await message.reply('Calculating '+data.attributes.relationships.servers.data.length+' servers. . .') 34 | 35 | let done = (await Promise.all(data.attributes.relationships.servers.data.map(x => x.attributes).map(async server => { 36 | 37 | let id = server.identifier 38 | let name = server.name 39 | 40 | try{ 41 | let {data: {attributes: {resources}}} = await axios({ 42 | url: config.pterodactyl.host + '/api/client/servers/' + id + "/resources", 43 | method: 'GET', 44 | followRedirect: true, 45 | maxRedirects: 5, 46 | headers: { 47 | 'Authorization': 'Bearer ' + config.pterodactyl.clientAPI, 48 | 'Content-Type': 'application/json', 49 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 50 | } 51 | }) 52 | return {Name: name, ID: id, CPU: resources.cpu_absolute + "%", RAM: pretty(resources.memory_bytes), Disk: pretty(resources.disk_bytes), resources} 53 | }catch(err){return {Name: 0, ID: 0, CPU: 0, RAM: 0, Disk: 0, resources: {memory_bytes: "0"}}} 54 | }))).sort(function(a, b) { 55 | return sortby === 'CPU' ? b?.resources?.cpu_absolute - a?.resources?.cpu_absolute : sortby === 'DISK' ? b?.resources?.disk_bytes - a?.resources?.disk_bytes : b?.resources?.memory_bytes - a?.resources?.memory_bytes 56 | }).slice(0, args[0]) 57 | 58 | msg.edit(`\`\`\`\n${stringTable.create(done)}\`\`\`\ntime taken: ${ms(Date.now() - start)}`).catch(err => {message.reply(`:x: Too Long Message!`)}) 59 | 60 | }).catch(x => {msg.edit(`${x}.`)}) 61 | } 62 | } -------------------------------------------------------------------------------- /commands/admin/blacklist.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../../config.json'); 3 | const db = require("quick.db"); 4 | module.exports = { 5 | name: "blacklist", 6 | category: "Owner", 7 | description: "Blacklist a user from the bot.", 8 | run: async (client, message, args) => { 9 | if (message.author.id !== config.settings.owner) return; 10 | if (args[0] === "add") { 11 | 12 | const user = message.mentions.users.first() || message.guild.members.cache.get(args[1]); 13 | if (!user) return message.channel.send({ embeds: [ new Discord.EmbedBuilder().setColor(Discord.Colors.Blue).setDescription('You Need to moniton a vaild user') ] }); 14 | if (user.id === client.user.id) return message.channel.send({ embeds: [ new Discord.EmbedBuilder().setColor(Discord.Colors.Blue).setDescription('You can\'t blacklist me') ] }); 15 | if (user.id === message.author.id) return message.channel.send({ embeds: [ new Discord.EmbedBuilder().setColor(Discord.Colors.Blue).setDescription('You can\'t blacklist yourself') ] }); 16 | if (user.id === config.settings.owner) return message.channel.send({ embeds: [ new Discord.EmbedBuilder().setColor(Discord.Colors.Blue).setDescription('You can\'t blacklist the owner') ] }); 17 | if (user.bot) return message.channel.send({ embeds: [ new Discord.EmbedBuilder().setColor(Discord.Colors.Blue).setDescription('You can\'t blacklist a bot') ] }); 18 | 19 | let fetched = db.get(`blacklist_${user.id}`) 20 | if(!fetched) { 21 | db.set(`blacklist_${user.id}`, true) 22 | message.reply({ embeds: [ new Discord.EmbedBuilder().setColor(Discord.Colors.Blue).setDescription(`${user.tag} has been blacklisted`) ] }); 23 | } else { 24 | return message.reply({ embeds: [ new Discord.EmbedBuilder().setColor(Discord.Colors.Blue).setDescription(`${user.tag} is already blacklisted`) ] }); 25 | } 26 | 27 | 28 | } 29 | 30 | if (args[0] === "remove") { 31 | 32 | const user = message.mentions.users.first() || message.guild.members.cache.get(args[1]); 33 | if (!user) return message.channel.send({ embeds: [ new Discord.EmbedBuilder().setColor(Discord.Colors.Blue).setDescription('You Need to moniton a vaild user') ] }); 34 | if (user.id === client.user.id) return message.channel.send({ embeds: [ new Discord.EmbedBuilder().setColor(Discord.Colors.Blue).setDescription('You can\'t blacklist me') ] }); 35 | if (user.id === message.author.id) return message.channel.send({ embeds: [ new Discord.EmbedBuilder().setColor(Discord.Colors.Blue).setDescription('You can\'t blacklist yourself') ] }); 36 | if (user.id === config.settings.owner) return message.channel.send({ embeds: [ new Discord.EmbedBuilder().setColor(Discord.Colors.Blue).setDescription('You can\'t blacklist the owner') ] }); 37 | if (user.bot) return message.channel.send({ embeds: [ new Discord.EmbedBuilder().setColor(Discord.Colors.Blue).setDescription('You can\'t blacklist a bot') ] }); 38 | 39 | let fetched = db.get(`blacklist_${user.id}`) 40 | if(!fetched) { 41 | return message.reply({ embeds: [ new Discord.EmbedBuilder().setColor(Discord.Colors.Blue).setDescription(`${user.tag} is not blacklisted`) ] }); 42 | }else{ 43 | db.delete(`blacklist_${user.id}`) 44 | message.reply({ embeds: [ new Discord.EmbedBuilder().setColor(Discord.Colors.Blue).setDescription(`${user.tag} has been removed from the blacklist`) ] }); 45 | } 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /commands/admin/eval.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder } = require("discord.js"); 2 | const { post } = require("node-superfetch"); 3 | 4 | module.exports = { 5 | name: "eval", 6 | category: "Owner", 7 | description: "Eval Code", 8 | run: async (client, message, args) => { 9 | if (message.author.id === "517107022399799331") { 10 | 11 | const embed = new EmbedBuilder() 12 | .addFields({ name: "Input", value: "```js\n" + args.join(" ") + "```"}); 13 | 14 | try { 15 | const code = args.join(" "); 16 | if (!code) return message.channel.send("Please include the code."); 17 | let evaled; 18 | 19 | if (code.includes(`SECRET`) || code.includes(`TOKEN`) || code.includes("process.env")) { 20 | evaled = "No, shut up, what will you do it with the token?"; 21 | } else { 22 | evaled = await eval(code); 23 | } 24 | 25 | if (typeof evaled !== "string") evaled = await require("util").inspect(evaled, { depth: 0 }); 26 | 27 | let output = clean(evaled); 28 | if (output.length > 1024) { 29 | 30 | const { body } = await post("https://hastebin.com/documents").send(output); 31 | embed.addField("Output", `https://hastebin.com/${body.key}.js`).setColor(0xFF0000); 32 | 33 | } else { 34 | embed.addFields({ name: "Output", value: "```js\n" + output + "```" }).setColor(0xFF0000); 35 | } 36 | 37 | message.channel.send({embeds: [embed]}); 38 | 39 | } catch (error) { 40 | let err = clean(error); 41 | if (err.length > 1024) { 42 | 43 | const { body } = await post("https://hastebin.com/documents").send(err); 44 | embed.addFields({ name: "Output", value: `https://hastebin.com/${body.key}.js`}).setColor(0xFF0000); 45 | } else { 46 | embed.addFields({ name: "Output", value: "```js\n" + err + "```"}).setColor(0xFF0000); 47 | } 48 | 49 | message.channel.send({embeds: [embed]}); 50 | } 51 | } else { 52 | message.channel.send({ 53 | embeds: [ 54 | new EmbedBuilder() 55 | .setTitle("Error") 56 | .setDescription("You are not the owner of this bot.") 57 | .setColor(0xFF0000) 58 | .setFooter("sus", client.user.displayAvatarURL({ 59 | format: "png", 60 | dynamic: true, 61 | size: 1024 62 | })) 63 | ] 64 | }) 65 | } 66 | } 67 | } 68 | function clean(string) { 69 | if (typeof text === "string") { 70 | return string.replace(/`/g, "`" + String.fromCharCode(8203)) 71 | .replace(/@/g, "@" + String.fromCharCode(8203)) 72 | } else { 73 | return string; 74 | } 75 | } -------------------------------------------------------------------------------- /commands/admin/exec.js: -------------------------------------------------------------------------------- 1 | const Discord = require("discord.js"); 2 | const util = require('util'); 3 | const exec = util.promisify(require('child_process').exec); 4 | 5 | module.exports = { 6 | name: "exec", 7 | category: "Owner", 8 | description: "Execute a command", 9 | run: async (client, message, args) => { 10 | if (message.author.id === "517107022399799331") { 11 | exec(args.join(" "), (err, stdout, stderr) => { 12 | if (err) { 13 | message.channel.send(err); 14 | return; 15 | } 16 | if (stderr) { 17 | message.channel.send(stderr); 18 | return; 19 | } 20 | message.channel.send({ content: `\`\`\`${stdout}\`\`\`` }).catch(err => { 21 | message.channel.send(`sus ${err}`); 22 | }); 23 | }); 24 | } else { 25 | message.reply('') 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /commands/admin/gif.js: -------------------------------------------------------------------------------- 1 | const Discord = require("discord.js"); 2 | const { NekoBot } = require("nekobot-api"); 3 | const api = new NekoBot(); 4 | 5 | module.exports = { 6 | name: "gif", 7 | category: "Owner", 8 | description: "nah", 9 | aliases: ['pgif'], 10 | run: async (client, message, args) => { 11 | 12 | if (message.channel.nsfw === true) { 13 | 14 | const nsfw = await api.get("pgif") 15 | 16 | const embed = new Discord.EmbedBuilder() 17 | .setImage(nsfw) 18 | 19 | message.reply({ embeds: [embed] }).catch(err => message.reply('error')) 20 | } else return message.reply("not nsfw channel") 21 | 22 | } 23 | } -------------------------------------------------------------------------------- /commands/admin/hentai.js: -------------------------------------------------------------------------------- 1 | const Discord = require("discord.js"); 2 | const { NekoBot } = require("nekobot-api"); 3 | const api = new NekoBot(); 4 | 5 | module.exports = { 6 | name: "hentai", 7 | category: "Owner", 8 | description: "nah", 9 | aliases: ['h'], 10 | run: async (client, message, args) => { 11 | 12 | if (message.channel.nsfw === true) { 13 | 14 | const nsfw = await api.get("hentai") 15 | 16 | const embed = new Discord.EmbedBuilder() 17 | .setImage(nsfw) 18 | 19 | message.reply({ embeds: [embed] }).catch(err => message.reply('error')) 20 | } else return message.reply("not nsfw channel") 21 | 22 | } 23 | } -------------------------------------------------------------------------------- /commands/admin/neko.js: -------------------------------------------------------------------------------- 1 | const Discord = require("discord.js"); 2 | const { NekoBot } = require("nekobot-api"); 3 | const api = new NekoBot(); 4 | 5 | module.exports = { 6 | name: "neko", 7 | category: "Owner", 8 | description: "nah", 9 | aliases: ['anime'], 10 | run: async (client, message, args) => { 11 | 12 | if (message.channel.nsfw === true) { 13 | 14 | const nsfw = await api.get("hneko") 15 | 16 | const embed = new Discord.EmbedBuilder() 17 | .setImage(nsfw) 18 | 19 | message.reply({ embeds: [embed] }).catch(err => message.reply('error')) 20 | } else return message.reply("not nsfw channel") 21 | 22 | } 23 | } -------------------------------------------------------------------------------- /commands/admin/node4.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js') 2 | const axios = require('axios') 3 | 4 | module.exports = { 5 | name: "node4", 6 | category: "admin", 7 | description: "nah", 8 | aliases: ['n4'], 9 | run: async (client, message, args) => { 10 | await axios.get("https://n2.luxxy.host:997/api/v1/stats").then(e => { 11 | let name = e.data.name 12 | let uptime = e.data.uptime 13 | let network_rx = e.data.network_rx 14 | let network_tx = e.data.network_tx 15 | let cpuusage = e.data.cpu 16 | let memory_total = e.data.memory_total 17 | let memory_used = e.data.memory_used 18 | let disk_total = e.data.disk_total 19 | let disk_used = e.data.disk_used 20 | let ping = e.data.ping 21 | let servers = e.data.servers 22 | let servers_running = e.data.serversrunning 23 | let servers_stopped = e.data.serversstopped 24 | 25 | axios.get('https://n4.luxxy.host:997/api/v1/stats/network').then(fuck => { 26 | 27 | 28 | const embed = new Discord.EmbedBuilder() 29 | .setAuthor({ name: message.author.username, iconURL: message.author.displayAvatarURL({ format: 'png', size: 1024, dynamic: true }) }) 30 | .addFields( 31 | { name: `Hostname:`, value: name, inline: true } 32 | ) 33 | .addFields( 34 | { name: `Uptime:`, value: uptime, inline: true } 35 | ) 36 | .addFields( 37 | { name: `Network Total:`, value: `Download: ${formatBytes(network_rx)} \nUpload: ${formatBytes(network_tx)}`, inline: true } 38 | ) 39 | .addFields( 40 | { name: `Cpu Usage:`, value: `${cpuusage}%`, inline: true } 41 | ) 42 | .addFields( 43 | { name: `Memory Usage:`, value: `${formatBytes(memory_used)}/${formatBytes(memory_total)}`, inline: true } 44 | ) 45 | .addFields( 46 | { name: `Disk Usage:`, value: `${formatBytes(disk_used)}/${formatBytes(disk_total)}`, inline: true } 47 | ) 48 | .addFields( 49 | { name: `Server Ping:`, value: `${ping}ms`, inline: true } 50 | ) 51 | .addFields( 52 | { name: `Servers Running`, value: `${servers_running}/${servers}`, inline: true } 53 | ) 54 | .setColor('Blurple') 55 | .setTimestamp() 56 | .addFields( 57 | { name: 'Network Speed Usage', value: `${formatBytes(fuck.data.network_rx_sec)}/${formatBytes(fuck.data.network_tx_sec)}` } 58 | ) 59 | 60 | message.reply({embeds: [embed]}) 61 | }) 62 | }) 63 | } 64 | } 65 | const units = ['bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']; 66 | function formatBytes(x) { 67 | let l = 0, n = parseInt(x, 10) || 0; 68 | 69 | while(n >= 1024 && ++l){ 70 | n = n/1024; 71 | } 72 | 73 | return(n.toFixed(n < 10 && l > 0 ? 1 : 0) + ' ' + units[l]); 74 | } 75 | -------------------------------------------------------------------------------- /commands/admin/random.js: -------------------------------------------------------------------------------- 1 | const Discord = require("discord.js"); 2 | const axios = require('axios') 3 | 4 | module.exports = { 5 | name: "random", 6 | category: "Owner", 7 | description: "nah", 8 | aliases: ['r'], 9 | run: async (client, message, args) => { 10 | 11 | if (message.channel.nsfw === true) { 12 | axios.get('https://api.luxxy.host/api/random?key=fl-5s94ed').then(e => { 13 | const embed = new Discord.EmbedBuilder() 14 | .setImage(e.data.image) 15 | .setColor(Discord.Colors.Aqua) 16 | message.reply({ embeds: [embed] }) 17 | }).catch(err => message.reply('not working at this time')) 18 | } else return message.reply("not nsfw channel") 19 | 20 | } 21 | } -------------------------------------------------------------------------------- /commands/admin/stealemoji.js: -------------------------------------------------------------------------------- 1 | const Discord = require("discord.js"); 2 | const axios = require('axios') 3 | 4 | module.exports = { 5 | name: "stealemoji", 6 | category: "Owner", 7 | description: "nah", 8 | run: async (client, message, args) => { 9 | if (!message.member.permissions.has(Discord.PermissionsBitField.Flags.Administrator)) return message.channel.send("No, You don't have permission to use this command") 10 | 11 | let emoji = args[0]; 12 | let name = args.slice(1).join(" "); 13 | 14 | if (!emoji) { 15 | return message.reply('Please provide an emoji 💀') 16 | } 17 | 18 | if (!name) { 19 | return message.reply('Please specify emoji name') 20 | } 21 | 22 | if (emoji.startsWith('<') && emoji.endsWith('>')) { 23 | const id = emoji.match(/\d{15,}/g)[0]; 24 | 25 | const type = await axios.get(`https://cdn.discordapp.com/emojis/${id}.gif`) 26 | .then(image => { 27 | if (image) return "gif" 28 | else return "png" 29 | }).catch(err => { 30 | return "png" 31 | }) 32 | 33 | emoji = `https://cdn.discordapp.com/emojis/${id}.${type}?quality=lossless` 34 | } 35 | 36 | if (emoji.startsWith('')) { 37 | const id = emoji.match(/\d{15,}/g)[0]; 38 | 39 | const type = await axios.get(`https://cdn.discordapp.com/emojis/${id}.png`) 40 | .then(image => { 41 | if (image) return "png" 42 | else return "gif" 43 | }).catch(err => { 44 | return "gif" 45 | }) 46 | 47 | emoji = `https://cdn.discordapp.com/emojis/${id}.${type}?quality=lossless` 48 | } 49 | 50 | if (!emoji.startsWith("https")) { 51 | return await message.reply({ content: "you can't steal this emoji" }) 52 | } 53 | if (!emoji.startsWith("http")) { 54 | return await message.reply({ content: "you can't steal this emoji" }) 55 | } 56 | 57 | 58 | message.guild.emojis.create({ attachment: `${emoji}`, name: `${name}` }) 59 | .then(emoji => { 60 | const embed = new Discord.EmbedBuilder() 61 | .setColor('Aqua') 62 | .setDescription(`Successfully Added ${emoji}, with then name **${name}**`) 63 | 64 | return message.reply({ embeds: [embed] }) 65 | }).catch(err => { 66 | message.reply({ content: `💀 probs no slots to fill ${err}` }) 67 | }) 68 | 69 | } 70 | } -------------------------------------------------------------------------------- /commands/admin/userlink.js: -------------------------------------------------------------------------------- 1 | const userData = require('../../models/userData'); 2 | const moment = require('moment'); 3 | const axios = require('axios') 4 | const config = require('../../config.json') 5 | 6 | module.exports = { 7 | name: "userlink", 8 | category: "Owner", 9 | description: "Links User to Account", 10 | run: async (client, message, args) => { 11 | if (message.author.id === config.settings.owner) { 12 | 13 | const discorduser = await message.mentions.users.first(); 14 | const consoleid = args[1] 15 | if (!args[1]) { 16 | return message.reply('Please put a console id <:what2:965935677416013824>') 17 | } 18 | 19 | axios({ 20 | url: `${config.pterodactyl.host}/api/application/users/${consoleid}`, 21 | method: 'GET', 22 | followRedirect: true, 23 | maxRedirects: 5, 24 | headers: { 25 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 26 | 'Content-Type': 'application/json', 27 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 28 | }, 29 | }).then(async user => { 30 | userData({ 31 | ID: discorduser.id, 32 | consoleID: user.data.attributes.id, 33 | email: user.data.attributes.email, 34 | username: user.data.attributes.username, 35 | linkTime: moment().format("HH:mm:ss"), 36 | linkDate: moment().format("YYYY-MM-DD"), 37 | }).save().catch(e => message.reply('no')) 38 | 39 | message.reply(`🍑 i have linked <@!${discorduser.id}> to the account **${user.data.attributes.username}**`) 40 | }).catch(e => message.reply(`Error: ${e}`)) 41 | 42 | } 43 | } 44 | } -------------------------------------------------------------------------------- /commands/info/avatar.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js') 2 | 3 | 4 | module.exports = { 5 | name: "avatar", 6 | aliases: ['av'], 7 | 8 | async run(client, message, args) { 9 | const user = message.mentions.users.first() || message.author 10 | const avatar = user.displayAvatarURL({ format: 'png', dynamic: true, size: 1024 }) 11 | 12 | message.reply({ 13 | embeds: [ 14 | new Discord.EmbedBuilder() 15 | .setColor(0xff0000) 16 | .setTitle(`${user.username}'s avatar`) 17 | .setDescription(`🖼 [Link to avatar](${avatar})`) 18 | .setImage(avatar) 19 | ] 20 | }) 21 | } 22 | } -------------------------------------------------------------------------------- /commands/info/buy.js: -------------------------------------------------------------------------------- 1 | // const Discord = require('discord.js') 2 | 3 | // module.exports = { 4 | // name: "buy", 5 | // aliases: [], 6 | // async run(client, message, args){ 7 | // if(!args[0]) return message.channel.send(`Corect command format: \`!buy server\``) 8 | // if(args[0] === "server"){ 9 | // if(!userServers.get(message.author.id)) return message.channel.send({embeds:[ 10 | // new Discord.EmbedBuilder() 11 | // .setTitle(`:x: | Error`) 12 | // .setColor(`RED`) 13 | // .setDescription(":x: You dont have an account created. type `!user new` to create one") 14 | // ]}) 15 | // message.channel.send({embeds:[ 16 | // new Discord.EmbedBuilder() 17 | // .setColor(`BLUE`) 18 | // .addField(`❗ | Invite Rewards`, `Are you sure you want to sell \`3 invites\` for \`a server\`?`) 19 | // .setFooter(`You have 30 seconds till this embed expires`) 20 | // ]}).then(x => { 21 | // x.react('✅') 22 | // x.react('❌') 23 | 24 | // let filter = (reaction, user) => user.id === message.author.id; 25 | 26 | // const collector = x.createReactionCollector({ filter, time: 30000, max: 1}); 27 | 28 | // collector.on('collect', (reaction, user) => { 29 | // if(!invinfo.get(message.author.id)) return message.channel.send({embeds:[ 30 | // new Discord.EmbedBuilder() 31 | // .setTitle(`:x: | Something went wrong, you dont have invites saved in my database, type ">invites" to fix it`) 32 | // .setColor("RED") 33 | // ]}) 34 | // if(reaction.emoji.name === '✅'){ 35 | 36 | // if(invinfo.get(message.author.id).invites >= 3){ 37 | // message.channel.send({embeds:[ 38 | // new Discord.EmbedBuilder() 39 | // .setColor("BLUE") 40 | // .addField(`✅ | Payment succesufuly completed`, `You just bought a **simple** server!`) 41 | // ]}) 42 | // invinfo.subtract(message.author.id + '.invites', 3) 43 | // userServers.add(message.author.id + ".simple.have", 1) 44 | // invinfo.add(message.author.id + ".sold", 3) 45 | // }else{ 46 | // message.channel.send({embeds:[ 47 | // new Discord.EmbedBuilder() 48 | // .setTitle(`:x: | You dont have enough invites`) 49 | // .setColor(`RED`) 50 | // ]}) 51 | // return 52 | // } 53 | // }else{ 54 | // message.channel.send({embeds:[ 55 | // new Discord.EmbedBuilder() 56 | // .setTitle(`:x: | Canceled`) 57 | // .setColor(`RED`) 58 | // ]}) 59 | // } 60 | // }) 61 | // }) 62 | // } 63 | // } 64 | // } -------------------------------------------------------------------------------- /commands/info/help.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js') 2 | module.exports = { 3 | name: "help", 4 | aliases: [''], 5 | async run(client, message, args){ 6 | message.reply({embeds:[ 7 | new Discord.EmbedBuilder() 8 | .setTitle(`❓ | Need help?`) 9 | .setColor(0x677bf9) 10 | .addFields({ name: `**Pterodactyl commands:**`, value: `!user\n!server`, inline: true}) 11 | .addFields({ name: `**Info:**`, value: `!ping\n!invites\n!help`, inline: true}) 12 | ]}) 13 | } 14 | } -------------------------------------------------------------------------------- /commands/info/invites.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js') 2 | module.exports = { 3 | name: "invite", 4 | aliases: ['invites'], 5 | async run(client, message, args){ 6 | const user = message.mentions.users.first() || message.author 7 | 8 | if(!invinfo.get(user.id)){ 9 | await invinfo.set(user.id, { 10 | invites: 0, 11 | regular: 0, 12 | left: 0, 13 | sold: 0 14 | }) 15 | } 16 | 17 | message.reply(`**${user.username}** have **${invinfo.get(user.id).invites}** invites ( **${invinfo.get(user.id).regular}** joined, **${invinfo.get(user.id).left}** left, **${invinfo.get(user.id).sold}** sold)`) 18 | } 19 | } -------------------------------------------------------------------------------- /commands/info/links.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js') 2 | module.exports = { 3 | name: "links", 4 | aliases: ['link'], 5 | async run(client, message, args){ 6 | const embed = new Discord.EmbedBuilder() 7 | .setColor(client.embedColor) 8 | .addFields({ name: 'Panel', value: '[Link](https://panel.luxxy.cloud)'}) 9 | .addFields({ name: 'Website', value: '[Link](https://luxxy.cloud)'}) 10 | .addFields({ name: 'Discord', value: '[Link](https://discord.gg/luxxycloud)'}) 11 | .addFields({ name: 'Github', value: '[Link](https://github.com/luxxy-hosting)'}) 12 | message.reply({ embeds: [embed] }) 13 | 14 | } 15 | } -------------------------------------------------------------------------------- /commands/info/ping.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js') 2 | module.exports = { 3 | name: "ping", 4 | aliases: [''], 5 | async run(client, message, args){ 6 | let created = message.createdTimestamp 7 | message.channel.send(`pinging...`).then(msg => { 8 | const ping = msg.createdAt - message.createdAt; 9 | const api_ping = client.ws.ping; 10 | msg.edit({ 11 | content: null, 12 | embeds:[ 13 | new Discord.EmbedBuilder() 14 | .setColor(client.embedColor) 15 | .addFields({ name: 'Bot Ping', value: `\`\`\`ini\n[ ${ping}ms ]\n\`\`\``, inline: true }) 16 | .addFields({ name: 'Api Ping', value: `\`\`\`ini\n[ ${api_ping}ms ]\n\`\`\``, inline: true }) 17 | .setFooter({ text: `Requested by ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) 18 | .setTimestamp() 19 | ] 20 | }) 21 | }) 22 | } 23 | } -------------------------------------------------------------------------------- /commands/info/snipe.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js') 2 | module.exports = { 3 | name: "snipe", 4 | aliases: [''], 5 | async run(client, message, args){ 6 | let snipe = client.snipes.get(message.channel.id) 7 | if (!snipe) return message.channel.send(`:x: There is nothing to snipe`) 8 | 9 | snipe = [...snipe.values()] 10 | snipe.reverse(); 11 | 12 | let number = 0; 13 | 14 | if (!args[0]) number = 0; 15 | else number = (parseInt(args[0]) - 1); 16 | 17 | if (number >= snipe.length) number = snipe.length - 1; 18 | if (number < 0) number = 0; 19 | 20 | let snipedMessage = snipe[number]; 21 | 22 | message.channel.send({ 23 | embeds: [ 24 | new Discord.EmbedBuilder() 25 | .setTitle(`Message ${snipedMessage.action} by ${snipedMessage.member.user.tag}`) 26 | .setDescription(snipedMessage.message ? "`" + snipedMessage.message + "`" : "ㅤ") 27 | .setImage(snipedMessage.image) 28 | .setFooter({text: `${number + 1}/${snipe.length} - Edited at`}) 29 | .setTimestamp(snipedMessage.timestamp) 30 | .setColor(Discord.Colors.Blue) 31 | ] 32 | }); 33 | } 34 | } -------------------------------------------------------------------------------- /commands/info/uptime.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js') 2 | 3 | module.exports = { 4 | name: 'uptime', 5 | aliases: [''], 6 | 7 | async run(client, message, args) { 8 | const uptime = { 9 | days: Math.floor(client.uptime / 86400000), 10 | hours: Math.floor(client.uptime / 3600000), 11 | minutes: Math.floor(client.uptime / 60000), 12 | seconds: Math.floor(client.uptime / 1000) 13 | } 14 | const embed = new Discord.EmbedBuilder() 15 | .setColor('BLUE') 16 | .setDescription(`✅ **${client.user.tag}** is online for ${uptime.days} days, ${uptime.hours} hours, ${uptime.minutes} minutes and ${uptime.seconds} seconds.`) 17 | message.reply({ embeds: [embed] }); 18 | } 19 | } -------------------------------------------------------------------------------- /commands/music/help.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const fs = require('fs'); 3 | module.exports = async (client, message, args) => { 4 | const commands = fs.readdirSync('./commands/music/'); 5 | const push = []; 6 | for (let i = 0; i < commands.length; i++) { 7 | let command = commands[i].split('.')[0]; 8 | push.push(command); 9 | } 10 | const embed = new Discord.EmbedBuilder() 11 | .setColor(client.embedcolor) 12 | .setTitle('Music Help') 13 | .setDescription(`**${push.join(', ')}**`) 14 | .setFooter({ text: `Requested by ${message.author.tag}`, icon: message.author.avatarURL() }); 15 | return message.channel.send({ embeds: [embed] }); 16 | } -------------------------------------------------------------------------------- /commands/music/join.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder, Colors } = require("discord.js"); 2 | 3 | module.exports = async (client, message, args) => { 4 | const { channel } = message.member.voice; 5 | 6 | if(!message.guild.me.voice.channel) { 7 | 8 | const player = message.client.manager.create({ 9 | guild: message.guild.id, 10 | voiceChannel: channel.id, 11 | textChannel: message.channel.id, 12 | volume: 50, 13 | selfDeafen: true, 14 | }); 15 | 16 | player.connect(); 17 | 18 | let thing = new EmbedBuilder() 19 | .setColor(client.embedcolor) 20 | .setDescription(`**Join the voice channel**\nJoined <#${channel.id}> and bound to <#${message.channel.id}>`) 21 | return message.channel.send({embeds: [thing]}); 22 | 23 | } else if (message.guild.me.voice.channel !== channel) { 24 | 25 | let thing = new EmbedBuilder() 26 | .setColor(Colors.Red) 27 | .setDescription(`You must be in the same channel as ${message.client.user}`); 28 | return message.channel.send({embeds: [thing]}); 29 | } 30 | } -------------------------------------------------------------------------------- /commands/music/node.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | 3 | module.exports = async (client, message, args) => { 4 | const all = client.manager.nodes.map(node => 5 | `Node ${(node.options.identifier)} Connected` + 6 | `\nPlayer: ${node.stats.players}` + 7 | `\nPlaying Players: ${node.stats.playingPlayers}` + 8 | `\nUptime: ${new Date(node.stats.uptime).toISOString().slice(11, 19)}` + 9 | `\n\nMemory` + 10 | `\nReservable Memory: ${Math.round(node.stats.memory.reservable / 1024 / 1024)}mb` + 11 | `\nUsed Memory: ${Math.round(node.stats.memory.used / 1024 / 1024)}mb` + 12 | `\nFree Memory: ${Math.round(node.stats.memory.free / 1024 / 1024)}mb` + 13 | `\nAllocated Memory: ${Math.round(node.stats.memory.allocated / 1024 / 1024)}mb` + 14 | "\n\nCPU" + 15 | `\nCores: ${node.stats.cpu.cores}` + 16 | `\nSystem Load: ${(Math.round(node.stats.cpu.systemLoad * 100) / 100).toFixed(2)}%` + 17 | `\nLavalink Load: ${(Math.round(node.stats.cpu.lavalinkLoad * 100) / 100).toFixed(2)}%` 18 | ).join('\n\n----------------------------\n'); 19 | const embed = new Discord.EmbedBuilder() 20 | .setDescription(`\`\`\`${all}\`\`\``) 21 | .setColor(0x0099ff) 22 | message.reply({embeds: [embed]}) 23 | } -------------------------------------------------------------------------------- /commands/music/nowplaying.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder, Colors } = require("discord.js"); 2 | const { convertTime } = require('../../handlers/convert'); 3 | const { progressbar } = require('../../handlers/progressbar.js') 4 | 5 | module.exports = async (client, message, args) => { 6 | 7 | const player = message.client.manager.get(message.guild.id); 8 | 9 | if (!player.queue.current) { 10 | let thing = new EmbedBuilder() 11 | .setColor(Colors.Red) 12 | .setDescription("There is no music playing."); 13 | return message.channel.send({ embeds: [thing] }); 14 | } 15 | 16 | const song = player.queue.current 17 | 18 | // Progress Bar 19 | var total = song.duration; 20 | var current = player.position; 21 | var size = 20; 22 | var line = '▬'; 23 | var slider = '🔘'; 24 | 25 | let embed = new EmbedBuilder() 26 | .setDescription(`**Now Playing**\n[${song.title}](${song.uri}) - \`[${convertTime(song.duration)}]\` [<@${song.requester.id}>]`) 27 | .setThumbnail(song.displayThumbnail("3")) 28 | .setColor(client.embedcolor) 29 | .addFields({ name: "\u200b", value: progressbar(total, current, size, line, slider)}) 30 | .addFields({ name: "\u200b", value: `\`${convertTime(current)} / ${convertTime(total)}\``}) 31 | return message.channel.send({embeds: [embed]}) 32 | 33 | } -------------------------------------------------------------------------------- /commands/music/pause.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder, Colors, Embed } = require("discord.js"); 2 | 3 | module.exports = async (client, message, args) => { 4 | const player = message.client.manager.get(message.guild.id); 5 | 6 | if (!player.queue.current) { 7 | let thing = new EmbedBuilder() 8 | .setColor(Colors.Red) 9 | .setDescription("There is no music playing."); 10 | return message.channel.send({embeds: [thing]}); 11 | } 12 | 13 | if (player.paused) { 14 | let thing = new EmbedBuilder() 15 | .setColor(Colors.Red) 16 | .setDescription(`The player is already paused.`) 17 | .setTimestamp() 18 | return message.channel.send({embeds: [thing]}); 19 | } 20 | 21 | player.pause(true); 22 | 23 | const song = player.queue.current; 24 | 25 | let thing = new EmbedBuilder() 26 | .setColor(client.embedcolor) 27 | .setTimestamp() 28 | .setDescription(`**Paused**\n[${song.title}](${song.uri})`) 29 | return message.channel.send({embeds: [thing]}); 30 | 31 | } -------------------------------------------------------------------------------- /commands/music/play.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder, PermissionsBitField } = require('discord.js'); 2 | const { convertTime } = require('../../handlers/convert'); 3 | 4 | module.exports = async (client, message, args) => { 5 | if (!message.guild.members.me.permissions.has([ 6 | PermissionsBitField.Flags.Connect, 7 | PermissionsBitField.Flags.Speak 8 | ])) { 9 | return message.reply('I do not have the permissions to connect to voice channels.'); 10 | } 11 | 12 | const { channel } = message.member.voice; 13 | if (!channel) return message.reply('You need to be in a voice channel to play music.'); 14 | 15 | const player = client.manager.create({ 16 | guild: message.guild.id, 17 | voiceChannel: channel.id, 18 | textChannel: message.channel.id, 19 | selfDeafen: true, 20 | volume: 80, 21 | }); 22 | 23 | if (player.state !== 'CONNECTED') await player.connect(); 24 | 25 | const search = args.join(' '); 26 | let res; 27 | try { 28 | res = await player.search(search, message.author); 29 | if (!player) 30 | return message.channel.send({ embeds: [new EmbedBuilder() 31 | .setColor(client.embedColor) 32 | .setTimestamp() 33 | .setDescription('Nothing is playing right now...')] }); 34 | 35 | if (res.loadType === 'LOAD_FAILED') { 36 | if (!player.queue.current) player.destroy(); 37 | throw res.exception; 38 | } 39 | } catch (err) { 40 | return message.reply(`There was an error while searching: ${err.message}`); 41 | } 42 | 43 | switch (res.loadType) { 44 | case 'NO_MATCHES': { 45 | if (!player.queue.current) player.destroy(); 46 | return message.channel.send({ embeds: [new EmbedBuilder() 47 | .setColor(client.embedColor) 48 | .setTimestamp() 49 | .setDescription(`No matches found for - ${search}`)] }); 50 | } 51 | 52 | case 'TRACK_LOADED': { 53 | const track = res.tracks[0]; 54 | player.queue.add(track); 55 | if (!player.playing && !player.paused && !player.queue.size) { 56 | return player.play(); 57 | } 58 | const embed = new EmbedBuilder() 59 | .setColor(client.embedColor) 60 | .setTimestamp() 61 | .setThumbnail(track.displayThumbnail('hqdefault')) 62 | .setDescription(`${global.emojiaddsong || ''} **Added song to queue**\n[${track.title}](${track.uri}) - \`[${convertTime(track.duration)}]\``); 63 | return message.channel.send({ embeds: [embed] }); 64 | } 65 | 66 | case 'PLAYLIST_LOADED': { 67 | player.queue.add(res.tracks); 68 | if (!player.playing && !player.paused && player.queue.totalSize === res.tracks.length) player.play(); 69 | const embed = new EmbedBuilder() 70 | .setColor(client.embedColor) 71 | .setTimestamp() 72 | .setDescription(`**Added playlist to queue**\n${res.tracks.length} Songs [${res.playlist.name}](${search}) - \`[${convertTime(res.playlist.duration)}]\``); 73 | return message.channel.send({ embeds: [embed] }); 74 | } 75 | 76 | case 'SEARCH_RESULT': { 77 | const track = res.tracks[0]; 78 | player.queue.add(track); 79 | if (!player.playing && !player.paused && !player.queue.size) { 80 | return player.play(); 81 | } 82 | const embed = new EmbedBuilder() 83 | .setColor(client.embedColor) 84 | .setTimestamp() 85 | .setThumbnail(track.displayThumbnail('hqdefault')) 86 | .setDescription(`**Added song to queue**\n[${track.title}](${track.uri}) - \`[${convertTime(track.duration)}]\` [<@${track.requester.id}>]`); 87 | return message.channel.send({ embeds: [embed] }); 88 | } 89 | } 90 | }; 91 | -------------------------------------------------------------------------------- /commands/music/queue.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder, Colors } = require("discord.js"); 2 | const { convertTime } = require('../../handlers/convert'); 3 | 4 | 5 | module.exports = async (client, message, args) => { 6 | const player = message.client.manager.get(message.guild.id); 7 | 8 | if (!player.queue.current) { 9 | let thing = new EmbedBuilder() 10 | .setColor(Colors.Red) 11 | .setDescription("There is no music playing."); 12 | return message.channel.send({embeds: [thing]}); 13 | } 14 | 15 | const queue = player.queue; 16 | 17 | const embed = new EmbedBuilder() 18 | .setColor(client.embedcolor) 19 | 20 | const multiple = 10; 21 | const page = args.length && Number(args[0]) ? Number(args[0]) : 1; 22 | 23 | const end = page * multiple; 24 | const start = end - multiple; 25 | 26 | const tracks = queue.slice(start, end); 27 | 28 | if (queue.current) embed.addFields({ name: "Now Playing", value: `[${queue.current.title}](${queue.current.uri}) \`[${convertTime(queue.current.duration)}]\``}); 29 | 30 | if (!tracks.length) embed.setDescription(`No tracks in ${page > 1 ? `page ${page}` : "the queue"}.`); 31 | else embed.setDescription(`Queue List\n` + tracks.map((track, i) => `${start + (++i)} - [${track.title}](${track.uri}) \`[${convertTime(track.duration)}]\``).join("\n")); 32 | 33 | const maxPages = Math.ceil(queue.length / multiple); 34 | 35 | embed.addFields({ name: "\u200b", value: `Page ${page > maxPages ? maxPages : page} of ${maxPages}`}); 36 | 37 | return message.channel.send({embeds: [embed]}); 38 | } -------------------------------------------------------------------------------- /commands/music/resume.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder, Colors } = require("discord.js"); 2 | 3 | module.exports = async (client, message, args) => { 4 | 5 | const player = message.client.manager.get(message.guild.id); 6 | const song = player.queue.current; 7 | 8 | if (!player.queue.current) { 9 | let thing = new EmbedBuilder() 10 | .setColor(Colors.Red) 11 | .setDescription("There is no music playing."); 12 | return message.channel.send({embeds: [thing]}); 13 | } 14 | 15 | if (!player.paused) { 16 | let thing = new EmbedBuilder() 17 | .setColor(Colors.Red) 18 | .setDescription(`The player is already **resumed**.`) 19 | .setTimestamp() 20 | return message.channel.send({embeds: [thing]}); 21 | } 22 | 23 | player.pause(false); 24 | 25 | let thing = new EmbedBuilder() 26 | .setDescription(`**Resumed**\n[${song.title}](${song.uri})`) 27 | .setColor(client.embedcolor) 28 | .setTimestamp() 29 | return message.channel.send({embeds: [thing]}); 30 | 31 | } -------------------------------------------------------------------------------- /commands/music/skip.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder, Colors } = require("discord.js"); 2 | 3 | module.exports = async (client, message, args) => { 4 | const player = message.client.manager.get(message.guild.id); 5 | 6 | if (!player.queue.current) { 7 | let thing = new EmbedBuilder() 8 | .setColor(Colors.Red) 9 | .setDescription("There is no music playing."); 10 | return message.channel.send({embeds: [thing]}); 11 | } 12 | 13 | const autoplay = player.get("autoplay"); 14 | const song = player.queue.current; 15 | 16 | if (autoplay === false) { 17 | player.stop(); 18 | } else { 19 | player.stop(); 20 | player.queue.clear(); 21 | player.set("autoplay", false); 22 | } 23 | 24 | let thing = new EmbedBuilder() 25 | .setDescription(`**Skipped**\n[${song.title}](${song.uri})`) 26 | .setColor(client.embedcolor) 27 | .setTimestamp() 28 | return message.channel.send({embeds: [thing]}) 29 | } -------------------------------------------------------------------------------- /commands/server/count.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js') 2 | 3 | module.exports = async (client, message, args) => { 4 | const user = message.mentions.users.first() || message.author; 5 | if (!serverCount.get(user.id)) { 6 | await serverCount.set(user.id, { 7 | gameused: 0, 8 | botused: 0, 9 | gamehave: 1, 10 | bothave: 2 11 | }); 12 | } 13 | 14 | const usage = serverCount.get(user.id); 15 | message.channel.send({ 16 | embeds: [ 17 | new Discord.EmbedBuilder() 18 | .setTitle(`${success} ${user.username}'s Server Count`) 19 | .setColor(0x677bf9) 20 | .setDescription(`**${user.username}**\nGameservers: \`${usage.gameused}/${usage.gamehave}\`\nBot Servers: \`${usage.botused}/${usage.bothave}\``) 21 | ] 22 | }); 23 | }; 24 | -------------------------------------------------------------------------------- /commands/server/delete.js: -------------------------------------------------------------------------------- 1 | const config = require('../../config.json') 2 | const Discord = require('discord.js'); 3 | const axios = require('axios'); 4 | const userData = require('../../models/userData'); 5 | const serverData = require('../../models/serverData'); 6 | module.exports = async (client, message, args) => { 7 | const userDB = await userData.findOne({ ID: message.author.id }) 8 | if (!userDB) { 9 | message.reply(`${error} You dont have an account created. type \`${config.bot.prefix}user new\` to create one`); 10 | return; 11 | } 12 | if (!args[1]) return message.reply(`${error} What server should i delete? please provide you server id *(${config.bot.prefix}server delete )*`) 13 | if (args[1].match(/[0-9a-z]+/i) == null) 14 | return message.channel.send("lol only use english characters."); 15 | 16 | args[1] = args[1].split('-')[0]; 17 | 18 | let msg = await message.channel.send('Let me check if this is your server, please wait . . .') 19 | axios({ 20 | url: config.pterodactyl.host + "/api/application/users/" + userDB.consoleID + "?include=servers", 21 | method: 'GET', 22 | followRedirect: true, 23 | maxRedirects: 5, 24 | headers: { 25 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 26 | 'Content-Type': 'application/json', 27 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 28 | } 29 | }).then(async response => { 30 | const preoutput = response.data.attributes.relationships.servers.data 31 | const output = await preoutput.find(srv => srv.attributes ? srv.attributes.identifier == args[1] : false) 32 | 33 | if (!output) return msg.edit(`:x: I could not find that server`) 34 | if (!output.attributes.user === userDB.consoleID) return msg.edit(`:x: You are not the owner of this server`) 35 | 36 | msg.edit({ 37 | content: `Are you sure you want to delete \`${output.attributes.name}\`? once you delete your server you will never be able to recover it and all data and files will be lost forever!`, 38 | components: [ 39 | new Discord.ActionRowBuilder() 40 | .addComponents( 41 | new Discord.ButtonBuilder() 42 | .setCustomId('AcceptDelete') 43 | .setLabel('Yes') 44 | .setStyle('Success'), 45 | ) 46 | .addComponents( 47 | new Discord.ButtonBuilder() 48 | .setCustomId('RejectDelete') 49 | .setLabel('No') 50 | .setStyle('Danger'), 51 | ) 52 | ] 53 | }) 54 | 55 | const filter = i => i.user.id === message.author.id; 56 | const Collector = msg.createMessageComponentCollector({ filter, time: 300000 }); 57 | 58 | Collector.on('collect', async i => { 59 | i.deferUpdate() 60 | Collector.stop() 61 | if (i.customId === "AcceptDelete") { 62 | msg.edit({ 63 | content: `Deleting Server \n Please wait . . .`, 64 | }) 65 | 66 | axios({ 67 | url: config.pterodactyl.host + "/api/application/servers/" + output.attributes.id, 68 | method: 'get', 69 | followRedirect: true, 70 | maxRedirects: 5, 71 | headers: { 72 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 73 | 'Content-Type': 'application/json', 74 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 75 | } 76 | }).then(deleted => { 77 | axios({ 78 | url: config.pterodactyl.host + "/api/application/servers/" + output.attributes.id + "/force", 79 | method: 'DELETE', 80 | followRedirect: true, 81 | maxRedirects: 5, 82 | headers: { 83 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 84 | 'Content-Type': 'application/json', 85 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 86 | } 87 | }).then(() => { 88 | msg.edit(`${success} Server deleted!`) 89 | if (!serverCount.get(message.author.id)) return msg.edit('WTF? how did u got a server?') 90 | serverData.findOne({ serverAdminID: output.attributes.id }).then(async (data) => { 91 | if (data) { 92 | if (data.type === 'gameserver') { 93 | serverCount.subtract(message.author.id + '.gameused', 1) 94 | console.log('gameused') 95 | } else if (data.type === 'botserver') { 96 | serverCount.subtract(message.author.id + '.botused', 1) 97 | console.log('botused') 98 | } 99 | } 100 | }).then(() => { serverData.deleteOne({ serverAdminID: output.attributes.id }) }).catch(err => { 101 | console.log(err) 102 | }) 103 | }).catch(err => { 104 | msg.edit(`Error: ${err}`) 105 | }) 106 | }) 107 | 108 | 109 | } 110 | if (i.customId === "RejectDelete") { 111 | msg.edit({ 112 | content: `${success} Server deletion canceled`, 113 | }) 114 | } 115 | }) 116 | 117 | Collector.on('end', () => { 118 | msg.edit({ components: [] }) 119 | }) 120 | }) 121 | } -------------------------------------------------------------------------------- /commands/server/help.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | module.exports = (client, message, args) => { 3 | message.channel.send({embeds:[ 4 | new Discord.EmbedBuilder() 5 | .setTitle(`❓ | Need help?`) 6 | .setColor(Discord.Colors.Red) 7 | .setDescription(`\`!server count\` - shows how many server slots you have and used\n\`!server create\` - create a server\n\`!server delete\` - delete a server\n\`!server list\` - shows all your servers created\n\`!server status\` - allows you to interact with the server\n\`!server proxy\` - Proxy your server to your domain\n\`!server unproxy\` - Delete a proxy\n\`!server renew\` - Renew your expired server`) 8 | ]}) 9 | } -------------------------------------------------------------------------------- /commands/server/list.js: -------------------------------------------------------------------------------- 1 | const config = require('../../config.json') 2 | const Discord = require('discord.js'); 3 | const axios = require('axios'); 4 | const userData = require('../../models/userData'); 5 | module.exports = async (client, message, args) => { 6 | const userDB = await userData.findOne({ ID: message.author.id }) 7 | if (!userDB) { 8 | message.reply(`${error} You dont have an account created. type \`${config.bot.prefix}user new\` to create one`); 9 | return; 10 | } 11 | 12 | 13 | axios({ 14 | url: config.pterodactyl.host + "/api/application/users/" + userDB.consoleID + "?include=servers", 15 | method: 'GET', 16 | followRedirect: true, 17 | maxRedirects: 5, 18 | headers: { 19 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 20 | 'Content-Type': 'application/json', 21 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 22 | } 23 | }).then(async response => { 24 | responce = response.data.attributes.relationships.servers.data 25 | let id = 1 26 | let id2 = 1 27 | 28 | if(responce.length <= 35){ 29 | message.reply({ 30 | embeds:[ 31 | new Discord.EmbedBuilder() 32 | .setTitle(`${message.author.username}'s servers`) 33 | .addFields({ name: 'Server Id:', value: `\`\`\`\n${responce.map(x => `${id++}. ${x.attributes.identifier}`).join('\n') || 'no Servers'}\`\`\``, inline: true}) 34 | .addFields({ name: 'Server Name:', value: `\`\`\`\n${responce.map(x => `${id2++}. ${x.attributes.name}`).join('\n') || 'no Servers'}\`\`\``, inline: true }) 35 | .setColor(Discord.Colors.Green) 36 | ] 37 | }).catch(err => { 38 | message.reply({ 39 | embeds:[ 40 | new Discord.EmbedBuilder() 41 | .setTitle(`:x: | HOW MANY SERVERS DO U HAVE???`) 42 | .setDescription(`${err}`) 43 | .setColor(Discord.Colors.Red) 44 | ] 45 | }) 46 | }) 47 | }else{ 48 | let id = 1 49 | let servers = responce.map(x => `${id++}. ${x.attributes.identifier} ➜ ${x.attributes.name}`).join('\n') 50 | message.channel.send({ 51 | files:[ 52 | { 53 | attachment: Buffer.from(servers), 54 | name: "servers.js" 55 | } 56 | ] 57 | }) 58 | } 59 | }) 60 | } -------------------------------------------------------------------------------- /commands/server/proxy.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../../config.json') 3 | const axios = require('axios') 4 | const { getDomainIP, proxyDomain, findProxy, deleteProxy } = require(`../../nginxPM/index`) 5 | module.exports = async (client, message, args) => { 6 | return message.reply(`:x: This command is deprecated, please use \`${config.bot.prefix}server domain\` instead`) 7 | let port 8 | let localdomain 9 | let serverid = args[1] 10 | let domain = args[2] 11 | if( 12 | !serverid || 13 | !serverid?.split('-')[0] || 14 | !domain || 15 | domain.split('.').length === 1 16 | ) return message.channel.send(`:x: Incorrect command usage. Please run: \`${config.bot.prefix}server proxy \``) 17 | const userdata = require('../../models/userData') 18 | const userdb = await userdata.findOne({ ID: message.author.id }) 19 | let preoutput = (await axios({ 20 | url: config.pterodactyl.host + "/api/application/users/" + userdb.consoleID + "?include=servers", 21 | method: 'GET', 22 | followRedirect: true, 23 | maxRedirects: 5, 24 | headers: { 25 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 26 | 'Content-Type': 'application/json', 27 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 28 | } 29 | }).catch(err => {})).data.attributes.relationships.servers.data 30 | 31 | if(!preoutput) return message.channel.send(`:x: There was an error connecting to the panel`) 32 | 33 | const isurserver = await preoutput.find(srv => srv.attributes ? srv.attributes.identifier == args[1] : false) 34 | if(!isurserver) return message.reply(`:x: I could not find that server`) 35 | 36 | let serverdata = (await axios({ 37 | url: config.pterodactyl.host + "/api/client/servers/" + serverid, 38 | method: 'GET', 39 | followRedirect: true, 40 | maxRedirects: 5, 41 | headers: { 42 | 'Authorization': 'Bearer ' + config.pterodactyl.clientAPI, 43 | 'Content-Type': 'application/json', 44 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 45 | } 46 | }).catch(err => {}))?.data.attributes 47 | if(!serverdata) return message.channel.send(`:x: There was an error connecting to the panel`) 48 | 49 | localdomain = serverdata.sftp_details.ip 50 | 51 | if(serverdata.relationships.allocations.data.length !== 1){ 52 | let i = 1 53 | message.reply({ 54 | embeds:[ 55 | new Discord.EmbedBuilder() 56 | .addFields({ name: `Apparently you have more than one port`, value: `The ports you have are:\n\`\`\`\n${serverdata.relationships.allocations.data.map(x => i++ +". "+ x.attributes.port).join('\n')}\`\`\`\nPlease send a new message with the port you want to proxy` } ) 57 | .setColor(Discord.Colors.Orange) 58 | ] 59 | }) 60 | const filter = m => m.author.id === message.author.id 61 | let collected = await message.channel.awaitMessages({ filter, max: 1, time: 10000, errors: ['time'] }).catch(err => {return message.reply(`Time had expired . . .`)}) 62 | if(isNaN(collected?.first()?.content)) return message.reply(`:x: The Message you sent is not a number`) 63 | let postchosen = parseInt(collected.first().content) 64 | if(!serverdata.relationships.allocations.data.map(x => x.attributes.port).includes(postchosen)) return message.reply(`:x: The port selected isnt in the list.`) 65 | 66 | port = postchosen 67 | }else{ 68 | port = serverdata.relationships.allocations.data[0].attributes.port 69 | } 70 | 71 | let msg = await message.channel.send(`Proxying . . .`) 72 | 73 | domainIP = await getDomainIP(domain) 74 | if(!domainIP || domainIP !== '23.26.226.86') return msg.edit(`The domain you gave doesnt have the right ip address. the ip should be: \`23.26.226.86\` *with cloudflare proxy turned off*`) 75 | 76 | msg.edit(`Creating LetsEncrypt certificate, this might take some time.`) 77 | let proxyinfo = await proxyDomain(domain, localdomain, port) 78 | 79 | if(!proxyinfo.error){ 80 | msg.edit(`${success} Your domain had been proxied. Proxy id: ${proxyinfo.data.id}`) 81 | 82 | let userDomains = domains.get(message.author.id) || [] 83 | 84 | domains.set(message.author.id, [...new Set(userDomains), { 85 | domain: domain.toLowerCase(), 86 | serverID: serverid, 87 | }]); 88 | 89 | }else{ 90 | if(proxyinfo.message === 'Request failed with status code 500'){ 91 | let proxytodelete = await findProxy(domain) 92 | if(!proxytodelete)return msg.edit(`There was an error proxying your domain. I could not get the ssl certificate. This error could happend if you proxyed this domain more than 5 times in a week`) 93 | 94 | if(await deleteProxy(proxytodelete.id)){ 95 | msg.edit(`There was an error proxying your domain. I could not get the ssl certificate. This error could happend if you proxyed this domain more than 5 times in a week. Just to know, i deleted your proxy sience it doesnt work`) 96 | }else{ 97 | msg.edit(`There was an error proxying your domain. I could not create a ssl certificate and i could not delete the proxy after the error *id was not found*`) 98 | } 99 | 100 | }else if (proxyinfo.message === 'Request failed with status code 400'){ 101 | msg.edit(`There was an error proxying your domain. I think someone already proxied this domain`) 102 | } else { 103 | msg.edit(`There was an error proxying your domain. Error: ${proxyinfo.message}`) 104 | } 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /commands/server/redeem.js: -------------------------------------------------------------------------------- 1 | const config = require('../../config.json'); 2 | module.exports = async(client, message, args) => { 3 | return message.reply(`${error} This command is not yet implemented.`); 4 | if (!userData.get(message.author.id)) { 5 | message.reply(":x: You dont have an account created. type `!user new` to create one"); 6 | return; 7 | } 8 | const user = message.author; 9 | 10 | const code = args[1] 11 | 12 | const oneoneone = (userid, amount) => { 13 | serverCount.add(userid + '.have', amount) 14 | } 15 | 16 | const oldbal = serverCount.get(user.id + '.have') 17 | if (!code) { 18 | return message.reply(`Usage: \`${config.bot.prefix}server redeem \``) 19 | } 20 | 21 | if (!codes.get(code)) { 22 | return message.reply(`That code does not exist 💀`) 23 | } 24 | 25 | if (codes.get(code).balance <= 0) { 26 | return message.reply(`That code has been redeemed 💀`) 27 | } 28 | 29 | oneoneone(user.id, codes.get(code).balance) 30 | 31 | message.reply(`You have redeemed ${codes.get(code).balance} servers! \n Check with \`${config.bot.prefix}server count\``) 32 | codes.delete(code) 33 | } 34 | -------------------------------------------------------------------------------- /commands/server/renew.js: -------------------------------------------------------------------------------- 1 | const config = require('../../config.json'); 2 | const Discord = require('discord.js'); 3 | const ServerData = require('../../models/serverData'); 4 | 5 | module.exports = async (client, message, args) => { 6 | const userId = message.author.id; 7 | const prefix = config.bot.prefix || '!'; 8 | const errorEmoji = config.emojis?.error || '❌'; 9 | const successEmoji = config.emojis?.success || '✅'; 10 | const warningEmoji = config.emojis?.warning || '⚠️'; 11 | const waitingEmoji = config.emojis?.waiting || '⏳'; 12 | const unauthorizedEmoji = config.emojis?.unauthorized || '🚫'; 13 | const infoEmoji = config.emojis?.info || 'ℹ️'; 14 | 15 | if (!args[1]) { 16 | const usageEmbed = new Discord.EmbedBuilder() 17 | .setColor(Discord.Colors.Blue) 18 | .setTitle(`${infoEmoji} Command Usage: ${prefix}renew`) 19 | .setDescription(`Please provide the required arguments, including the Server ID as the second argument.\n\nExample format might be: \`${prefix}renew \`\nCheck required format or use \`${prefix}server list\` to find IDs.`); 20 | return message.reply({ embeds: [usageEmbed] }); 21 | } 22 | 23 | const serverIdToRenew = args[1]; 24 | 25 | try { 26 | const server = await ServerData.findOne({ serverID: serverIdToRenew }); 27 | 28 | if (!server) { 29 | const notFoundEmbed = new Discord.EmbedBuilder() 30 | .setColor(Discord.Colors.Red) 31 | .setDescription(`${errorEmoji} Error: Could not find any server data with the ID \`${Discord.escapeMarkdown(serverIdToRenew)}\` (provided as the second argument).\nPlease verify the ID with \`${prefix}server list\`.`); 32 | return message.reply({ embeds: [notFoundEmbed] }); 33 | } 34 | 35 | if (server.ownerID !== userId && server.serverAdminID !== userId) { 36 | const unauthorizedEmbed = new Discord.EmbedBuilder() 37 | .setColor(Discord.Colors.Orange) 38 | .setDescription(`${unauthorizedEmoji} Authorization Error: You are not the owner or designated admin for the server with ID \`${Discord.escapeMarkdown(server.serverID)}\`.`); 39 | return message.reply({ embeds: [unauthorizedEmbed] }); 40 | } 41 | 42 | const now = new Date(); 43 | if (server.expiresAt <= now) { 44 | const expiredEmbed = new Discord.EmbedBuilder() 45 | .setColor(Discord.Colors.Yellow) 46 | .setDescription(`${warningEmoji} Already Expired: The server **${Discord.escapeMarkdown(server.serverName)}** (ID: \`${server.serverID}\`) has already expired. Renewal via this command is not possible.`); 47 | return message.reply({ embeds: [expiredEmbed] }); 48 | } 49 | 50 | const twentyFourHoursInMillis = 24 * 60 * 60 * 1000; 51 | const timeRemaining = server.expiresAt.getTime() - now.getTime(); 52 | 53 | if (timeRemaining > twentyFourHoursInMillis) { 54 | const renewalAvailableDate = new Date(server.expiresAt.getTime() - twentyFourHoursInMillis); 55 | const renewalAvailableTimestamp = Math.floor(renewalAvailableDate.getTime() / 1000); 56 | 57 | const tooEarlyEmbed = new Discord.EmbedBuilder() 58 | .setColor(Discord.Colors.Blue) 59 | .setDescription( 60 | `${waitingEmoji} Too Early: Renewal for server **${Discord.escapeMarkdown(server.serverName)}** (ID: \`${server.serverID}\`) is not yet available.\n` + 61 | `Renewal will be possible after ().` 62 | ); 63 | return message.reply({ embeds: [tooEarlyEmbed] }); 64 | } 65 | 66 | if (!server.warned) { 67 | const notWarnedEmbed = new Discord.EmbedBuilder() 68 | .setColor(Discord.Colors.Blue) 69 | .setDescription(`${waitingEmoji} Not Ready: Renewal for server **${Discord.escapeMarkdown(server.serverName)}** (ID: \`${server.serverID}\`) is not enabled yet. Please wait for the 24-hour expiration warning notification for this server.`); 70 | return message.reply({ embeds: [notWarnedEmbed] }); 71 | } 72 | 73 | const newExpiresAt = new Date(server.expiresAt.getTime() + 7 * twentyFourHoursInMillis); 74 | const newExpiresAtTimestamp = Math.floor(newExpiresAt.getTime() / 1000); 75 | 76 | server.expiresAt = newExpiresAt; 77 | server.warned = false; 78 | await server.save(); 79 | 80 | const successEmbed = new Discord.EmbedBuilder() 81 | .setColor(Discord.Colors.Green) 82 | .setTitle(`${successEmoji} Server Renewed Successfully!`) 83 | .setDescription(`The server **${Discord.escapeMarkdown(server.serverName)}** (ID: \`${server.serverID}\`) has been renewed for another 7 days.`) 84 | .addFields( 85 | { name: 'New Expiration Date', value: ` ()`, inline: true }, 86 | { name: 'Renewed By', value: message.author.tag, inline: true } 87 | ) 88 | .setTimestamp() 89 | .setFooter({ text: `Server ID: ${server.serverID}` }); 90 | 91 | return message.reply({ embeds: [successEmbed] }); 92 | 93 | } catch (error) { 94 | console.error(`Error executing renew command for server ID ${serverIdToRenew || 'N/A'}:`, error); 95 | const errorEmbed = new Discord.EmbedBuilder() 96 | .setColor(Discord.Colors.Red) 97 | .setTitle(`${errorEmoji} Command Error`) 98 | .setDescription(`🆘 An unexpected error occurred while trying to renew server ID \`${Discord.escapeMarkdown(serverIdToRenew || 'N/A')}\`. Please report this to the bot developer.`); 99 | try { 100 | await message.reply({ embeds: [errorEmbed] }); 101 | } catch (e) { 102 | console.error("Failed to send error reply:", e); 103 | } 104 | } 105 | }; -------------------------------------------------------------------------------- /commands/server/unproxy.js: -------------------------------------------------------------------------------- 1 | const { findProxy, deleteProxy } = require(`../../nginxPM/index`) 2 | const config = require('../../config.json') 3 | module.exports = async (client, message, args) => { 4 | return message.reply('disabled') 5 | message.delete() 6 | if(!args[1]) return message.reply(`${error} What domain should i unproxy? command usage: \`${config.bot.prefix}unproxy \``) 7 | if(!domains.get(message.author.id)?.find(x => x.domain === args[1].toLowerCase())) return message.reply(`:x: I could not find this domain in ur domain list`) 8 | 9 | let msg = await message.channel.send(`unproxying . . .`) 10 | 11 | let proxytodelete = await findProxy(args[1].toLowerCase()) 12 | if(!proxytodelete) return msg.edit(`${error} I Could not find your proxied domain.`) 13 | 14 | if(await deleteProxy(proxytodelete.id)){ 15 | msg.edit(`${success} Domain unproxied!`) 16 | domains.set(message.author.id, domains.get(message.author.id)?.filter(x => x.domain !== args[1].toLowerCase())) 17 | }else{ 18 | msg.edit(`${error} There was an error deleting the domain!`) 19 | } 20 | } -------------------------------------------------------------------------------- /commands/staff/ban.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../../config.json'); 3 | const { 4 | EmbedBuilder, 5 | Permissions, 6 | } = require(`discord.js`); 7 | 8 | module.exports = async (client, message, args) => { 9 | if (!message.member.roles.cache.has(config.roleID.admin)) return message.channel.send('You do not have the required permissions to use this command.'); 10 | const user = message.mentions.members.filter(member=>member.guild.id==message.guild.id).first() || message.guild.members.cache.get(args[0] ? args[0] : ``) || await message.guild.members.fetch(args[0] ? args[0] : ``).catch(() => {}) || false; 11 | if (!user) return message.reply({ 12 | embeds: [ 13 | new Discord.EmbedBuilder() 14 | .setTitle(`:x: | You need to mention a user`) 15 | .setColor(Discord.Colors.Red) 16 | ] 17 | }) 18 | if (!message.guild.members.cache.get(user.id)) return message.reply({ 19 | embeds: [ 20 | new Discord.EmbedBuilder() 21 | .setTitle(`:x: | ${user.user.tag} is not in this server`) 22 | .setColor(Discord.Colors.Red) 23 | ] 24 | }) 25 | const memberPosition = user.roles.highest.position; 26 | const moderationPosition = message.member.roles.highest.position; 27 | if (moderationPosition <= memberPosition) 28 | return message.reply({embeds : [new EmbedBuilder() 29 | .setColor(Discord.Colors.Red) 30 | .setTitle(`:x: | I cannot ban someone, who is above/equal you`) 31 | ]}); 32 | let reason = args.slice(2).join(` `); 33 | if (!reason) { 34 | reason = `NO REASON`; 35 | } 36 | 37 | message.guild.members.cache.get(user.id).ban({ reason: reason }).then(e => { 38 | message.channel.send({ 39 | embeds: [ 40 | new Discord.EmbedBuilder() 41 | .setTitle(`:white_check_mark: | ${user.user.tag} has been banned for: ` + reason) 42 | .setColor(Discord.Colors.Green) 43 | ] 44 | }) 45 | }).catch(err => { 46 | message.channel.send({ 47 | embeds: [ 48 | new Discord.EmbedBuilder() 49 | .setTitle(`:x: | ${user.user.tag} could not be banned`) 50 | .setDescription(`${err}`) 51 | .setColor(Discord.Colors.Green) 52 | ] 53 | }) 54 | }) 55 | } 56 | -------------------------------------------------------------------------------- /commands/staff/create-partner.js: -------------------------------------------------------------------------------- 1 | const { default: axios } = require('axios'); 2 | const Discord = require('discord.js'); 3 | const config = require('../../config.json'); 4 | const moment = require('moment'); 5 | const userData = require('../../models/userData'); 6 | 7 | module.exports = async (client, message, args) => { 8 | if (!message.member.roles.cache.has(config.roleID.admin)) return message.channel.send('You do not have the required permissions to use this command.'); 9 | const user = await message.mentions.users.first() 10 | 11 | if (!user) return message.reply({ 12 | embeds: [ 13 | new Discord.EmbedBuilder() 14 | .setTitle(`:x: | You need to mention a user`) 15 | .setColor(`RED`) 16 | ] 17 | }) 18 | const userDB = await userData.findOne({ ID: user.id }); 19 | 20 | if (!userDB) { 21 | message.reply(`${user.username} is not in the database`) 22 | return; 23 | } 24 | 25 | const memory = args[2] 26 | 27 | if (!memory) { 28 | message.reply(`Please specify a memory size eg \`${config.bot.prefix}partner-create-partner <@user> 4096\``) 29 | return; 30 | } 31 | 32 | if (isNaN(memory)) { 33 | message.reply(`Memory size must be a number`) 34 | } 35 | 36 | if (memory < 4096) { 37 | message.reply(`Memory size must be at least 4096`) 38 | } 39 | 40 | if (memory > 16432) { 41 | message.reply(`Memory size must be less than 16432`) 42 | } 43 | 44 | message.reply(`${user.username} is now a partner`) 45 | message.reply(`Creating partner Server with ${memory} MB`).then(msg => { 46 | const data = ({ 47 | "name": `[Partner] ${user.username}'s Server`, 48 | "user": userDB.consoleID, 49 | "nest": 1, 50 | "egg": 48, 51 | "docker_image": "ghcr.io/pterodactyl/yolks:java_18", 52 | "startup": "java -Xms128M -Xmx{{SERVER_MEMORY}}M -Dterminal.jline=false -Dterminal.ansi=true -jar {{SERVER_JARFILE}}", 53 | "limits": { 54 | "memory": memory, 55 | "swap": 0, 56 | "disk": 32240, 57 | "io": 500, 58 | "cpu": 0 59 | }, 60 | "environment": { 61 | "MINECRAFT_VERSION": "latest", 62 | "SERVER_JARFILE": "server.jar", 63 | "DL_PATH": "https://api.papermc.io/v2/projects/paper/versions/1.20.2/builds/318/downloads/paper-1.20.2-318.jar", 64 | "BUILD_NUMBER": "latest" 65 | }, 66 | "feature_limits": { 67 | "databases": 2, 68 | "allocations": 1, 69 | "backups": 10 70 | }, 71 | "deploy": { 72 | "locations": [ 2 ], 73 | "dedicated_ip": false, 74 | "port_range": [] 75 | }, 76 | "start_on_completion": false 77 | }) 78 | 79 | axios({ 80 | url: config.pterodactyl.host + "/api/application/servers", 81 | method: 'POST', 82 | followRedirect: true, 83 | maxRedirects: 5, 84 | headers: { 85 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 86 | 'Content-Type': 'application/json', 87 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 88 | }, 89 | data: data, 90 | }).then(res => { 91 | msg.edit(`${user.username}'s Partner Server has been created \n ${res.data.attributes.identifier} \n https://panel.luxxy.cloud/server/${res.data.attributes.identifier} `) 92 | 93 | // log 94 | const logchannel = client.channels.cache.get('971131533131915264') 95 | const embed = new Discord.EmbedBuilder() 96 | .setTitle(`${user.username}'s Partner Server has been created`) 97 | .setDescription(`${res.data.attributes.identifier} \n https://panel.luxxy.cloud/server/${res.data.attributes.identifier}`) 98 | .setColor(Discord.Colors.DarkAqua) 99 | .setTimestamp() 100 | logchannel.send({ embeds: [embed] }) 101 | }) 102 | }) 103 | } 104 | -------------------------------------------------------------------------------- /commands/staff/dmintol.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../../config.json'); 3 | const fs = require('fs'); 4 | module.exports = async (client, message, args) => { 5 | if (!message.member.roles.cache.has(config.roleID.support)) return message.channel.send('You do not have the required permissions to use this command.'); 6 | 7 | const user = client.users.cache.get('836963172513480723') 8 | 9 | const sirmes = args[1] 10 | 11 | user.send(sirmes).then(eg => { message.reply('i have dm intol') }).catch(e => { console.log(e) }) 12 | } -------------------------------------------------------------------------------- /commands/staff/finduser.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../../config.json'); 3 | const axios = require('axios'); 4 | const userData = require('../../models/userData'); 5 | module.exports = async (client, message, args) => { 6 | if (!message.member.roles.cache.has(config.roleID.support)) return message.channel.send('You do not have the required permissions to use this command.'); 7 | if (!args[1]) return message.reply({ 8 | embeds: [ 9 | new Discord.EmbedBuilder() 10 | .setTitle(`:x: | Please provide an email`) 11 | .setColor(Discord.Colors.Red) 12 | ] 13 | }) 14 | const email1 = await args[1] 15 | const userDB = await userData.findOne({ email: email1 }); 16 | const servercount = serverCount.get(userDB.ID); 17 | if (!userDB) return message.reply({ 18 | embeds: [ 19 | new Discord.EmbedBuilder() 20 | .setTitle(`:x: | doesn't have an account yet`) 21 | .setColor(Discord.Colors.Red) 22 | ] 23 | }) 24 | if (!servercount) return message.reply({ 25 | embeds: [ 26 | new Discord.EmbedBuilder() 27 | .setTitle(`user don't have server count`) 28 | ]}) 29 | axios({ 30 | url: config.pterodactyl.host + "/api/application/users/" + userDB.consoleID + "?include=servers", 31 | method: 'GET', 32 | followRedirect: true, 33 | maxRedirects: 5, 34 | headers: { 35 | 36 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 37 | 'Content-Type': 'application/json', 38 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 39 | }, 40 | }).then(async response => { 41 | responce = response.data.attributes.relationships.servers.data; 42 | let id = 1; 43 | let id2 = 1; 44 | axios({ 45 | url: config.pterodactyl.host + "/api/application/users/" + userDB.consoleID, 46 | method: 'GET', 47 | followRedirect: true, 48 | maxRedirects: 5, 49 | headers: { 50 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 51 | 'Content-Type': 'application/json', 52 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 53 | }, 54 | }).then(async res => { 55 | message.reply({ 56 | embeds: [ 57 | new Discord.EmbedBuilder() 58 | .addFields({ name: 'Console ID', value: `\`\`\`\n${userDB.consoleID}\`\`\``, inline: true }) 59 | .addFields({ name: 'Email', value: `\`\`\`\n${res.data.attributes.email}\`\`\``, inline: true }) 60 | .addFields({ name: 'Discord ID', value: `\`\`\`\n${userDB.ID}\`\`\` <@!${userDB.ID}>`, inline: true }) 61 | .addFields({ name: 'Username', value: `\`\`\`\n${res.data.attributes.username}\`\`\``, inline: true }) 62 | .addFields({ name: 'Link Date', value: `\`\`\`\n${userDB.linkDate}\`\`\``, inline: true}) 63 | .addFields({ name:'Link Time', value: `\`\`\`\n${userDB.linkTime}\`\`\``, inline: true}) 64 | .addFields({ name: 'Servers', value: `\`\`\`\n${responce.map(x => `${id++}. ${x.attributes.identifier}`).join('\n')}\`\`\``, inline: true}) 65 | .addFields({ name: 'Servers Name', value: `\`\`\`\n${responce.map(x => `${id2++}. ${x.attributes.name}`).join('\n')}\`\`\``, inline: true}) 66 | .addFields({ name: 'Server Count', value: `\`\`\`\n${serverCount.get(userDB.ID).mineused} / ${serverCount.get(userDB.ID).minehave} \n${serverCount.get(userDB.ID).botused} / ${serverCount.get(userDB.ID).bothave}\`\`\``, inline: true}) 67 | .setColor(Discord.Colors.Green) 68 | ] 69 | }) 70 | }).catch(err => { 71 | console.log(err); 72 | }); 73 | }).catch(err => { 74 | console.log(err); 75 | }) 76 | } -------------------------------------------------------------------------------- /commands/staff/gencode.js: -------------------------------------------------------------------------------- 1 | const gencode = function () { 2 | const CAPSNUM = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; 3 | var password = ""; 4 | while (password.length < 16) { 5 | password += CAPSNUM[Math.floor(Math.random() * CAPSNUM.length)]; 6 | } 7 | return password; 8 | } 9 | const Discord = require('discord.js'); 10 | const config = require('../../config.json'); 11 | const moment = require('moment'); 12 | 13 | module.exports = async(client, message, args) => { 14 | return message.reply('This command is currently disabled.'); 15 | if (!message.member.roles.cache.has(config.roleID.admin)) return message.channel.send('You do not have the required permissions to use this command.'); 16 | 17 | if (!args[1]) { 18 | return message.reply(`Usage: \`${config.bot.prefix}gencode \``) 19 | } 20 | 21 | const code = gencode() 22 | const name = args[1] 23 | const number = args[2] 24 | const embed = new Discord.EmbedBuilder() 25 | .addField(`Code`, `${code}`) 26 | .addField(`Name`, `${name}`) 27 | .addField(`Number of servers`, `${number}`) 28 | .setColor(`#0099ff`) 29 | .setTimestamp() 30 | message.reply({ embeds: [embed] }).then(msg => { 31 | codes.set(code, { 32 | code: code, 33 | createdBy: message.author.id, 34 | balance: number, 35 | createdAt: Date.now() 36 | }); 37 | const logs = new Discord.EmbedBuilder() 38 | .setTitle(`Code Created`) 39 | .addField(`Code`, `${code}`) 40 | .addField(`Name`, `${name}`) 41 | .addField(`Number of servers`, `${number}`) 42 | .addField(`Message Author`, `${message.author.tag}`) 43 | .setColor(`#0099ff`) 44 | .setTimestamp() 45 | client.channels.cache.get('971131533131915264').send({ embeds: [logs] }) 46 | }) 47 | 48 | } -------------------------------------------------------------------------------- /commands/staff/help.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../../config.json'); 3 | const fs = require('fs'); 4 | module.exports = async (client, message, args) => { 5 | if (!message.member.roles.cache.has(config.roleID.support)) return message.channel.send('You do not have the required permissions to use this command.'); 6 | const commands = fs.readdirSync('./commands/staff/'); 7 | const commandNames = commands.map(file => file.split('.')[0]); 8 | message.reply({ 9 | embeds: [ 10 | new Discord.EmbedBuilder() 11 | .setDescription(`**__Staff Commands__**\n\n${commandNames.join(', \n')}`) 12 | .setColor(Discord.Colors.Green) 13 | ] 14 | }) 15 | } -------------------------------------------------------------------------------- /commands/staff/info.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../../config.json'); 3 | const axios = require('axios'); 4 | const userData = require('../../models/userData'); 5 | module.exports = async (client, message, args) => { 6 | if (!message.member.roles.cache.has(config.roleID.support)) return message.channel.send('You do not have the required permissions to use this command.'); 7 | const user = await message.mentions.users.first() || message.author; 8 | const userDB = await userData.findOne({ ID: user.id }); 9 | const servercount = serverCount.get(user.id); 10 | if (!userDB) return message.reply({ 11 | embeds: [ 12 | new Discord.EmbedBuilder() 13 | .setTitle(`:x: | ${user.username} doesn't have an account yet`) 14 | .setColor(Discord.Colors.Red) 15 | ] 16 | }) 17 | if (!servercount) return message.reply({ 18 | embeds: [ 19 | new Discord.EmbedBuilder() 20 | .setTitle(`user don't have server count`) 21 | ]}) 22 | axios({ 23 | url: config.pterodactyl.host + "/api/application/users/" + userDB.consoleID + "?include=servers", 24 | method: 'GET', 25 | followRedirect: true, 26 | maxRedirects: 5, 27 | headers: { 28 | 29 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 30 | 'Content-Type': 'application/json', 31 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 32 | }, 33 | }).then(async response => { 34 | responce = response.data.attributes.relationships.servers.data; 35 | let id = 1; 36 | let id2 = 1; 37 | axios({ 38 | url: config.pterodactyl.host + "/api/application/users/" + userDB.consoleID, 39 | method: 'GET', 40 | followRedirect: true, 41 | maxRedirects: 5, 42 | headers: { 43 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 44 | 'Content-Type': 'application/json', 45 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 46 | }, 47 | }).then(async res => { 48 | message.reply({ 49 | embeds: [ 50 | new Discord.EmbedBuilder() 51 | .setTitle(`${user.username}'s Info`) 52 | .addFields({ name: 'Console ID', value: `\`\`\`\n${userDB.consoleID}\`\`\``, inline: true }) 53 | .addFields({ name: 'Email', value: `\`\`\`\n${res.data.attributes.email}\`\`\``, inline: true }) 54 | .addFields({ name: 'Username', value: `\`\`\`\n${res.data.attributes.username}\`\`\``, inline: true }) 55 | .addFields({ name: 'Link Date', value: `\`\`\`\n${userDB.linkDate}\`\`\``, inline: true}) 56 | .addFields({ name:'Link Time', value: `\`\`\`\n${userDB.linkTime}\`\`\``, inline: true}) 57 | .addFields({ name: 'Servers', value: `\`\`\`\n${responce.map(x => `${id++}. ${x.attributes.identifier}`).join('\n')}\`\`\``, inline: true}) 58 | .addFields({ name: 'Servers Name', value: `\`\`\`\n${responce.map(x => `${id2++}. ${x.attributes.name}`).join('\n')}\`\`\``, inline: true}) 59 | .addFields({ name: 'Server Count', value: `\`\`\`\n${serverCount.get(user.id).gameused} / ${serverCount.get(user.id).gamehave} \n${serverCount.get(user.id).botused} / ${serverCount.get(user.id).bothave}\`\`\``, inline: true}) 60 | .setColor(Discord.Colors.Green) 61 | ] 62 | }) 63 | }).catch(err => { 64 | console.log(err); 65 | }); 66 | }).catch(err => { 67 | console.log(err); 68 | }) 69 | } -------------------------------------------------------------------------------- /commands/staff/kick.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../../config.json'); 3 | const { 4 | EmbedBuilder, 5 | Permissions 6 | } = require(`discord.js`); 7 | 8 | module.exports = async (client, message, args) => { 9 | if (!message.member.roles.cache.has(config.roleID.admin)) return message.channel.send('You do not have the required permissions to use this command.'); 10 | const user = message.mentions.members.filter(member=>member.guild.id==message.guild.id).first() || message.guild.members.cache.get(args[0] ? args[0] : ``) || await message.guild.members.fetch(args[0] ? args[0] : ``).catch(() => {}) || false; 11 | if (!user) return message.reply({ 12 | embeds: [ 13 | new Discord.EmbedBuilder() 14 | .setTitle(`:x: | You need to mention a user`) 15 | .setColor(Discord.Colors.Red) 16 | ] 17 | }) 18 | if (!message.guild.members.cache.get(user.id)) return message.reply({ 19 | embeds: [ 20 | new Discord.EmbedBuilder() 21 | .setTitle(`:x: | ${user.user.tag} is not in this server`) 22 | .setColor(Discord.Colors.Red) 23 | ] 24 | }) 25 | const memberPosition = user.roles.highest.position; 26 | const moderationPosition = message.member.roles.highest.position; 27 | if (moderationPosition <= memberPosition) 28 | return message.reply({embeds : [new EmbedBuilder() 29 | .setColor(Discord.Colors.Red) 30 | .setTitle(`:x: | I cannot kick someone, who is above/equal you`) 31 | ]}); 32 | let reason = args.slice(2).join(` `); 33 | if (!reason) { 34 | reason = `NO REASON`; 35 | } 36 | 37 | message.guild.members.cache.get(user.id).kick({ reason: reason }).then(e => { 38 | message.channel.send({ 39 | embeds: [ 40 | new Discord.EmbedBuilder() 41 | .setTitle(`:white_check_mark: | ${user.user.tag} has been kicked for: ` + reason) 42 | .setColor(Discord.Colors.Green) 43 | ] 44 | }) 45 | }).catch(err => { 46 | message.channel.send({ 47 | embeds: [ 48 | new Discord.EmbedBuilder() 49 | .setTitle(`:x: | ${user.user.tag} could not be kicked`) 50 | .setDescription(`${err}`) 51 | .setColor(Discord.Colors.Red) 52 | ] 53 | }) 54 | }) 55 | } 56 | -------------------------------------------------------------------------------- /commands/staff/link.js: -------------------------------------------------------------------------------- 1 | const { default: axios } = require('axios') 2 | const Discord = require('discord.js') 3 | const moment = require('moment') 4 | const config = require('../../config.json') 5 | const userData = require('../../models/userData'); 6 | module.exports = async (client, message, args) => { 7 | if(!message.member.roles.cache.has(config.roleID.administrator)) return message.reply({ 8 | embeds: [ 9 | new Discord.EmbedBuilder() 10 | .setColor(0xff0000) 11 | .setTitle('Error') 12 | .setDescription('You do not have the required permissions to use this command!') 13 | ] 14 | }) 15 | if (!args[1]) return message.reply({ 16 | embeds: [ 17 | new Discord.EmbedBuilder() 18 | .setColor(0xff0000) 19 | .setTitle('Error') 20 | .setDescription(`usage: \`${config.bot.prefix}staff link @luxxy \``) 21 | ] 22 | }) 23 | const user1 = message.mentions.users.first() 24 | if(!user1) return message.reply({ 25 | embeds: [ 26 | new Discord.EmbedBuilder() 27 | .setColor(0xff0000) 28 | .setTitle('Error') 29 | .setDescription('You need to specify a user to link!') 30 | ] 31 | }) 32 | const consoleid = args[2] 33 | if(!consoleid) return message.reply({ 34 | embeds: [ 35 | new Discord.EmbedBuilder() 36 | .setColor(0xff0000) 37 | .setTitle('Error') 38 | .setDescription('You need to specify a console ID!') 39 | ] 40 | }) 41 | if (args[2] == 1 && message.author.id !== '517107022399799331') { 42 | message.reply({ 43 | embeds: [ 44 | new Discord.EmbedBuilder() 45 | .setColor(0xff0000) 46 | .setTitle('Error') 47 | .setDescription(`${error} You cannot link this user to this consoleID!`) 48 | ] 49 | }) 50 | return; 51 | } 52 | axios({ 53 | url: config.pterodactyl.host + "/api/application/users/" + consoleid, 54 | method: 'get', 55 | followRedirect: true, 56 | maxRedirects: 5, 57 | headers: { 58 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 59 | 'Content-Type': 'application/json', 60 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 61 | }, 62 | }).then(async user => { 63 | userData({ 64 | ID: user1.id, 65 | consoleID: consoleid, 66 | email: user.data.attributes.email, 67 | username: user.data.attributes.username, 68 | linkTime: moment().format("HH:mm:ss"), 69 | linkDate: moment().format("YYYY-MM-DD"), 70 | }).save() 71 | message.reply({ 72 | embeds: [ 73 | new Discord.EmbedBuilder() 74 | .setColor(0x00ff00) 75 | .setTitle('Success') 76 | .setDescription('User linked successfully! \n Username: ' + user.data.attributes.username + '\n Email: ' + user.data.attributes.email + '\n Console ID: ' + consoleid) 77 | ] 78 | }) 79 | }) 80 | } -------------------------------------------------------------------------------- /commands/staff/list.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const axios = require('axios'); 3 | const config = require('../../config.json'); 4 | const userData = require('../../models/userData'); 5 | 6 | module.exports = async (client, message, args) => { 7 | if (!message.member.roles.cache.has(config.roleID.support)) return message.channel.send('You do not have the required permissions to use this command.'); 8 | const user = await message.mentions.users.first() 9 | if (!user) return message.reply({ 10 | embeds: [ 11 | new Discord.EmbedBuilder() 12 | .setTitle(`:x: | You need to mention a user`) 13 | .setColor(Discord.Colors.Red) 14 | ] 15 | }) 16 | const userDB = await userData.findOne({ ID: user.id }); 17 | if (!userDB) return message.reply({ 18 | embeds: [ 19 | new Discord.EmbedBuilder() 20 | .setTitle(`:x: | ${user.username} doesn't have an account yet`) 21 | .setColor(Discord.Colors.Red) 22 | ] 23 | }) 24 | axios({ 25 | url: config.pterodactyl.host + "/api/application/users/" + userDB.consoleID + "?include=servers", 26 | method: 'GET', 27 | followRedirect: true, 28 | maxRedirects: 5, 29 | headers: { 30 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 31 | 'Content-Type': 'application/json', 32 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 33 | } 34 | }).then(async response => { 35 | responce = response.data.attributes.relationships.servers.data 36 | let id = 1 37 | let id2 = 1 38 | if (responce.length <= 35) { 39 | message.reply({ 40 | embeds: [ 41 | new Discord.EmbedBuilder() 42 | .setTitle(`${user.username}'s servers`) 43 | .addFields({ name: 'Server Id:', value: `\`\`\`\n${responce.map(x => `${id++}. ${x.attributes.identifier}`).join('\n') || 'no Servers'}\`\`\``, inline: true}) 44 | .addFields({ name: 'Server Name:', value: `\`\`\`\n${responce.map(x => `${id2++}. ${x.attributes.name}`).join('\n') || 'no Servers'}\`\`\``, inline: true }) 45 | .setColor(Discord.Colors.Green) 46 | ] 47 | }).catch(err => { 48 | message.reply({ 49 | embeds: [ 50 | new Discord.EmbedBuilder() 51 | .setTitle(`:x: | HOW MANY SERVERS DO U HAVE???`) 52 | .setDescription(`${err}`) 53 | .setColor(Discord.Colors.Red) 54 | ] 55 | }) 56 | } 57 | ) 58 | } 59 | }) 60 | } -------------------------------------------------------------------------------- /commands/staff/proxyfix.js: -------------------------------------------------------------------------------- 1 | const { findProxy, deleteProxy } = require(`../../nginxPM/index`) 2 | module.exports = async (client, message, args) => { 3 | if(!args[1]) return message.reply(`:x: What domain should i unproxy? command usage: \`!staff proxyfix \``) 4 | 5 | let data = domains.all().find(x=> JSON.parse(x.data).find(y => y.domain === args[1])) 6 | if(data){ 7 | domains.set(data.ID, domains.get(data.ID)?.filter(x => x.domain !== args[1].toLowerCase())) 8 | message.reply(`Domain \`${args[1].toLowerCase()}\` deleted from someone's database`) 9 | } 10 | 11 | let proxytodelete = await findProxy(args[1].toLowerCase()) 12 | if(proxytodelete){ 13 | await deleteProxy(proxytodelete.id) 14 | message.reply(`Domain \`${args[1].toLowerCase()}\` deleted from Proxy Manages`) 15 | } 16 | } -------------------------------------------------------------------------------- /commands/staff/resetcount.js: -------------------------------------------------------------------------------- 1 | const Discord = require("discord.js"); 2 | 3 | module.exports = async (client, message, args) => { 4 | const user = message.mentions.users.first() || message.guild.members.cache.get(args[1]); 5 | 6 | if (!user) { 7 | return message.channel.send("Please mention a user or provide a user ID. "); 8 | } 9 | 10 | const count = serverCount.get(user.id); 11 | 12 | if (!count) { 13 | return message.channel.send("This user has never been counted. "); 14 | } 15 | 16 | const number = args[2] 17 | 18 | if (!number) { 19 | return message.channel.send("Please provide a number. "); 20 | } 21 | 22 | const msg = await message.channel.send({ content: `Are you sure you want to reset ${user.tag}'s count to ${number}? `, components: [ 23 | new Discord.ActionRowBuilder() 24 | .addComponents( 25 | new Discord.ButtonBuilder() 26 | .setCustomId('AcceptDelete') 27 | .setLabel('Yes') 28 | .setStyle('Success'), 29 | ) 30 | .addComponents( 31 | new Discord.ButtonBuilder() 32 | .setCustomId('RejectDelete') 33 | .setLabel('No') 34 | .setStyle('Danger'), 35 | ) 36 | ]}); 37 | 38 | const filter = i => i.user.id === message.author.id; 39 | const Collector = msg.createMessageComponentCollector({ filter, time: 300000 }); 40 | 41 | Collector.on('collect', async i => { 42 | i.deferUpdate() 43 | Collector.stop() 44 | if(i.customId === "AcceptDelete") { 45 | msg.edit({ 46 | content: `Resetting ${user.tag}'s count to ${number}... `, 47 | }) 48 | serverCount.set(user.id, { 49 | gameused: 0, 50 | botused: 0, 51 | gamehave: 1, 52 | bothave: 2 53 | }) 54 | msg.edit(`${success} ${user.tag} Count reset!`) 55 | } 56 | if(i.customId === "RejectDelete") { 57 | msg.edit({ 58 | content: `${success} Count reset canceled `, 59 | }) 60 | } 61 | }) 62 | Collector.on('end',() => { 63 | msg.edit({components:[]}) 64 | }) 65 | } -------------------------------------------------------------------------------- /commands/staff/setcount.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../../config.json'); 3 | const userData = require('../../models/userData'); 4 | 5 | module.exports = async (client, message, args) => { 6 | if (!message.member.roles.cache.has(config.roleID.admin)) return message.channel.send ('You do not have the required permissions to use this command.'); 7 | const user = await message.mentions.users.first(); 8 | 9 | if (!user) return message.reply({ 10 | embeds: [ 11 | new Discord.EmbedBuilder() 12 | .setTitle(`:x: | You need to mention a user`) 13 | .setColor(Discord.Colors.Red) 14 | ] 15 | }) 16 | const userDB = await userData.findOne({ ID: user.id }); 17 | if (!userDB) return message.reply({ 18 | embeds: [ 19 | new Discord.EmbedBuilder() 20 | .setTitle(`:x: | ${user.username} doesn't have an account yet`) 21 | .setColor(Discord.Colors.Red) 22 | ] 23 | }) 24 | if (!serverCount.get(user.id)) return message.reply({ 25 | embeds: [ 26 | new Discord.EmbedBuilder() 27 | .setTitle(`:x: | ${user.username} doesn't have a count yet`) 28 | .setColor(Discord.Colors.Red) 29 | ] 30 | }) 31 | const used1 = serverCount.get(user.id).used; 32 | const number = args [2]; 33 | 34 | if (!number) return message.reply({ 35 | embeds: [ 36 | new Discord.EmbedBuilder() 37 | .setTitle(`:x: | You need to specify a number`) 38 | .setColor(Discord.Colors.Red) 39 | ] 40 | }) 41 | 42 | serverCount.set(user.id, { 43 | used: used1, 44 | have: number 45 | }) 46 | message.reply({ 47 | embeds: [ 48 | new Discord.EmbedBuilder() 49 | .setAuthor(`${user.username}'s count has been set.` , user.displayAvatarURL({ format: 'png', dynamic: true, size: 1024 })) 50 | .setColor(Discord.Colors.Green) 51 | .setDescription(`${user.username}'s count has been set to ${serverCount.get(user.id).used} / ${number}`) 52 | ] 53 | }) 54 | } 55 | -------------------------------------------------------------------------------- /commands/staff/transfer.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Luxxy-Hosting/host-bot/d7c0eff04c648446a1abadb28cc50d76bfc72474/commands/staff/transfer.js -------------------------------------------------------------------------------- /commands/user/help.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../../config.json') 3 | module.exports = (client, message, args) => { 4 | message.channel.send({ 5 | embeds:[ 6 | new Discord.EmbedBuilder() 7 | .setTitle(`❓ | Need help?`) 8 | .setColor(Discord.Colors.Red) 9 | .setDescription(`\`${config.bot.prefix}user new\` - create an account\n\`${config.bot.prefix}user delete\` - unlink an account\n\`${config.bot.prefix}user link\` - shows info about your account\n\`${config.bot.prefix}user password\` - reset your password\n\``) 10 | ] 11 | }) 12 | } -------------------------------------------------------------------------------- /commands/user/link.js: -------------------------------------------------------------------------------- 1 | 2 | const Discord = require('discord.js'); 3 | const userData = require('../../models/userData'); 4 | const config = require('../../config.json') 5 | module.exports = async (client, message, args) => { 6 | const userDataDB = await userData.findOne({ ID: message.author.id }); 7 | if(!userDataDB) return message.reply(`:x: You dont have an account created. type \`${config.bot.prefix}user new\` to create one`) 8 | 9 | message.channel.send({embeds:[ 10 | new Discord.EmbedBuilder() 11 | .setColor(0x00ff00) 12 | .addFields({ name: `Username:`, value: `${userDataDB.username}`, inline: true }) 13 | .addFields({ name: `Link Date:`, value: `${userDataDB.linkDate}`, inline: true }) 14 | .addFields({ name: `Link Date:`, value: `${userDataDB.linkTime}`, inline: true }) 15 | .setTimestamp() 16 | ]}) 17 | } -------------------------------------------------------------------------------- /commands/user/password.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const axios = require('axios'); 3 | const config = require('../../config.json'); 4 | const userData = require('../../models/userData'); 5 | module.exports = async (client, message, args) => { 6 | const userDB = await userData.findOne({ ID: message.author.id }); 7 | if(!userDB) return message.reply(`:x: You dont have an account created. type \`${config.bot.prefix}user new\` to create one`) 8 | 9 | const CAPSNUM = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; 10 | var getPassword = () => { 11 | 12 | var password = ""; 13 | while (password.length < 10) { 14 | password += CAPSNUM[Math.floor(Math.random() * CAPSNUM.length)]; 15 | } 16 | return password; 17 | }; 18 | 19 | let password = await getPassword(); 20 | axios({ 21 | url: config.pterodactyl.host + "/api/application/users/" + userDB.consoleID, 22 | method: 'GET', 23 | followRedirect: true, 24 | maxRedirects: 5, 25 | headers: { 26 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 27 | 'Content-Type': 'application/json', 28 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 29 | }, 30 | }).then(fetch => { 31 | const data = { 32 | "email": fetch.data.attributes.email, 33 | "username": fetch.data.attributes.username, 34 | "first_name": fetch.data.attributes.first_name, 35 | "last_name": fetch.data.attributes.last_name, 36 | "password": password 37 | } 38 | axios({ 39 | url: config.pterodactyl.host + "/api/application/users/" + userDB.consoleID, 40 | method: 'PATCH', 41 | followRedirect: true, 42 | maxRedirects: 5, 43 | headers: { 44 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 45 | 'Content-Type': 'application/json', 46 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 47 | }, 48 | data: data, 49 | }).then(user => { 50 | client.users.cache.get(message.author.id).send({embeds:[ 51 | new Discord.EmbedBuilder() 52 | .setColor(Discord.Colors.Blue) 53 | .addFields({ name: 'Reset Password', value: `New password for Luxxy Hosting: ||**${data.password}**||` }) 54 | .setFooter({text:`This message will autodestruct in 10 minutes`}) 55 | ]}).then(x => { 56 | message.channel.send({embeds:[ 57 | new Discord.EmbedBuilder() 58 | .setTitle(`✅ | Password Changed Succesufuly`) 59 | .setColor(Discord.Colors.Green) 60 | .addFields({ name: 'Done', value: 'Check your [dms](https://discord.com/channels/@me/${x.channelId}) for your new password!'}) 61 | ]}).catch(err => { 62 | message.channel.send(`${err}`) 63 | }) 64 | setInterval(() => { 65 | x.delete().catch(err => {}) 66 | },600000) 67 | }).catch(err => { 68 | message.channel.send(`${err}`) 69 | }) 70 | }).catch(err => { 71 | message.channel.send(`${err}`) 72 | }) 73 | }).catch(err => { 74 | message.channel.send(`${err}`) 75 | }) 76 | } 77 | -------------------------------------------------------------------------------- /config.template.json: -------------------------------------------------------------------------------- 1 | { 2 | "settings": { 3 | "maintenance": false, 4 | "nodeStatus": false, 5 | "McScript": false, 6 | "autoLeave": true, 7 | "consoleSave": false, 8 | "updateFromGithub": false, 9 | "anticrash": false, 10 | "lavalinkStatus": false, 11 | "joinvoicechannelonready": false, 12 | "serverchecker": false, 13 | "mongoDB": "", 14 | 15 | "nodeStatusDelay": 15, 16 | "vcUpdateInterval": 60, 17 | 18 | "guildID": "941026456396509244", 19 | "admin": ["517107022399799331"], 20 | "owner": "517107022399799331", 21 | 22 | "statusOnMaintenance": "Luxxy Hosting | 🟠 On Maintenance mode", 23 | "avoidServerPorts": [], 24 | 25 | "webhook": { 26 | "id": "1164315342114390076", 27 | "token": "B" 28 | }, 29 | "statusembeds": { 30 | "node1": "a18823fe" 31 | } 32 | }, 33 | 34 | "logs":{ 35 | "dms": "1028046810209583156", 36 | "createlog": "1028046978204061716" 37 | }, 38 | 39 | "channelID": { 40 | "legal":"947234663771029624", 41 | "errorLog":"1028046701413552186", 42 | "welcome":"1028046701413552186", 43 | "bye":"1028046701413552186", 44 | "abuse": "1028046701413552186", 45 | "ticketChannel": "1164315851562958848", 46 | "nodeStatus": "1164315768767394012", 47 | "suggestions": "1164315622344245291", 48 | "analyse": "947234663771029624", 49 | "github": "957403118797197402", 50 | "leavedeletelogs": "1028046978204061716" 51 | }, 52 | 53 | "voiceID": { 54 | "members": "1164316079565320223", 55 | "clients": "1164316100088049685", 56 | "servers": "1164316120212328458" 57 | }, 58 | "parentID": { 59 | "createAccount": "1164316285530812416", 60 | "ticketParent": "1028047184379269251" 61 | }, 62 | "roleID": { 63 | "staff": "941756285286776853", 64 | "support": "941756285286776853", 65 | "member": "941026456434270284", 66 | "admin": "941026456446828567", 67 | "administrator": "980035372505505862", 68 | "client": "941068776554774649", 69 | "betatester": "980035372505505862" 70 | }, 71 | 72 | "fastify": { 73 | "port": 8069 74 | }, 75 | 76 | "bot":{ 77 | "token": "", 78 | "prefix": "!" 79 | }, 80 | 81 | "pterodactyl": { 82 | "myIp": "1.1.1.1", 83 | "host": "https://panel.luxxy.host", 84 | "adminApiKey": "", 85 | "clientAPI":"", 86 | "depolymentlocations": [ 2 ] 87 | }, 88 | "locations": [ 89 | { 90 | "id": 1, 91 | "label": "🇬🇧 United Kingdom", 92 | "code": "gb" 93 | }, 94 | { 95 | "id": 2, 96 | "label": "🇺🇸 United States", 97 | "code": "us" 98 | } 99 | ], 100 | "nginxPM": { 101 | "host": "", 102 | "email": "", 103 | "pass": "" 104 | }, 105 | "lavalink": { 106 | "channelID": "", 107 | "nodes": [ 108 | { 109 | "host": "n1.luxxy.host", 110 | "port": 9000, 111 | "password": "", 112 | "retryDelay": 3000, 113 | "secure": false 114 | } 115 | ] 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /ecosystem.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | apps : [{ 3 | name : "Luxxy Hosting Bot", 4 | script : "./index.js" 5 | }] 6 | } 7 | -------------------------------------------------------------------------------- /events/Lavalink/nodeConnect.js: -------------------------------------------------------------------------------- 1 | module.exports = async (client, node) => { 2 | 3 | console.log(`Node "${node.options.identifier}" connected.`); 4 | 5 | } -------------------------------------------------------------------------------- /events/Lavalink/nodeCreate.js: -------------------------------------------------------------------------------- 1 | module.exports = async (client, node) => { 2 | 3 | console.log(`Node "${node.options.identifier}" created.`); 4 | 5 | } -------------------------------------------------------------------------------- /events/Lavalink/nodeDisconnect.js: -------------------------------------------------------------------------------- 1 | module.exports = async (client, node, reason) => { 2 | 3 | console.log(`Node "${node.options.identifier}" disconnect because ${reason}.`); 4 | 5 | } -------------------------------------------------------------------------------- /events/Lavalink/nodeError.js: -------------------------------------------------------------------------------- 1 | module.exports = async (client, node, error) => { 2 | 3 | console.log(`Node "${node.options.identifier}" encountered an error: ${error.message}.`); 4 | 5 | } -------------------------------------------------------------------------------- /events/Lavalink/nodeReconnect.js: -------------------------------------------------------------------------------- 1 | module.exports = async (client, node) => { 2 | 3 | console.log(`Node "${node.options.identifier}" reconnected.`); 4 | 5 | } -------------------------------------------------------------------------------- /events/Lavalink/playerCreate.js: -------------------------------------------------------------------------------- 1 | module.exports = async (client, player) => { 2 | 3 | console.log(`Player has been created in ${player.guild}`); 4 | 5 | } -------------------------------------------------------------------------------- /events/Lavalink/playerDestroy.js: -------------------------------------------------------------------------------- 1 | module.exports = async (client, player) => { 2 | 3 | console.log(`Player has been destroyed in ${player.guild}`); 4 | 5 | } -------------------------------------------------------------------------------- /events/Lavalink/playerMove.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder } = require("discord.js"); 2 | const { Player } = require("erela.js"); 3 | /** 4 | * 5 | * @param {Player} player 6 | * @param {String} oldChannel 7 | * @param {String} newChannel 8 | */ 9 | module.exports = async (client, player, oldChannel, newChannel) => { 10 | const guild = client.guilds.cache.get(player.guild) 11 | if(!guild) return; 12 | const channel = guild.channels.cache.get(player.textChannel); 13 | if(oldChannel === newChannel) return; 14 | if(newChannel === null || !newChannel) { 15 | if(!player) return; 16 | if(channel) await channel.send({ embeds: [new EmbedBuilder().setDescription(`I've been disconnected from <#${oldChannel}>`)]}) 17 | return player.destroy(); 18 | } else { 19 | player.voiceChannel = newChannel; 20 | 21 | if(channel) await channel.send({embeds: [new EmbedBuilder().setDescription(`Player voice channel moved to <#${player.voiceChannel}>`)]}); 22 | if(player.paused) player.pause(false); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /events/Lavalink/queueEnd.js: -------------------------------------------------------------------------------- 1 | const delay = require("delay"); 2 | const { EmbedBuilder } = require("discord.js"); 3 | const ms = require('ms'); 4 | 5 | module.exports = async (client, player) => { 6 | 7 | const channel = client.channels.cache.get(player.textChannel); 8 | const emojiwarn = '⚠'; 9 | let thing = new EmbedBuilder() 10 | .setDescription(`${emojiwarn} **Music queue ended**`) 11 | .setFooter({text: client.user.username, iconURL: client.user.displayAvatarURL()}); 12 | channel.send({embeds: [thing] }); 13 | } -------------------------------------------------------------------------------- /events/Lavalink/trackEnd.js: -------------------------------------------------------------------------------- 1 | module.exports = async (client, player, track, playload) => { 2 | 3 | const autoplay = player.get("autoplay") 4 | if (autoplay === true) { 5 | const requester = player.get("requester"); 6 | const oldidentifier = player.get("identifier"); 7 | const identifier = player.queue.current.identifier; 8 | const search = `https://www.youtube.com/watch?v=${identifier}&list=RD${identifier}`; 9 | res = await player.search(search, requester); 10 | player.queue.add(res.tracks[2]); 11 | } 12 | 13 | } -------------------------------------------------------------------------------- /events/Lavalink/trackError.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder } = require("discord.js"); 2 | 3 | module.exports = async (client, player, track, payload) => { 4 | 5 | console.error(payload.error); 6 | 7 | const channel = client.channels.cache.get(player.textChannel); 8 | const thing = new EmbedBuilder() 9 | .setColor("RED") 10 | .setDescription("❌ Error when loading song! Track is error"); 11 | channel.send({embeds: [thing]}); 12 | client.logger.log(`Error when loading song! Track is error in [${player.guild}]`, "error"); 13 | if (!player.voiceChannel) player.destroy(); 14 | 15 | } -------------------------------------------------------------------------------- /events/Lavalink/trackStart.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder, MessageActionRow, MessageButton } = require("discord.js"); 2 | const { convertTime } = require('../../handlers/convert'); 3 | 4 | 5 | module.exports = async (client, player, track, payload) => { 6 | 7 | const emojiplay = '▶'; 8 | const volumeEmoji = '🔊'; 9 | const emojistop = '⏹'; 10 | const emojipause = '⏸'; 11 | const emojiresume = '▶'; 12 | const emojiskip = '⏭'; 13 | 14 | const thing = new EmbedBuilder() 15 | .setDescription(`${emojiplay} **Started Playing**\n [${track.title}](${track.uri}) - \`[${convertTime(track.duration)}]\``) 16 | .setThumbnail(`https://img.youtube.com/vi/${track.identifier}/mqdefault.jpg`) 17 | .setColor(client.embedColor) 18 | .setTimestamp() 19 | const But1 = new MessageButton().setCustomId("vdown").setEmoji("🔉").setStyle("SECONDARY"); 20 | 21 | const But2 = new MessageButton().setCustomId("stop").setEmoji("⏹️").setStyle("SECONDARY"); 22 | 23 | const But3 = new MessageButton().setCustomId("pause").setEmoji("⏸️").setStyle("SECONDARY"); 24 | 25 | const But4 = new MessageButton().setCustomId("skip").setEmoji("⏭️").setStyle("SECONDARY"); 26 | 27 | const But5 = new MessageButton().setCustomId("vup").setEmoji("🔊").setStyle("SECONDARY"); 28 | 29 | const row = new MessageActionRow().addComponents(But1, But2, But3, But4, But5); 30 | 31 | let NowPlaying = await client.channels.cache.get(player.textChannel).send({ embeds: [thing], components: [row] }); 32 | //player.setNowplayingMessage(NowPlaying); 33 | 34 | const embed = new EmbedBuilder() 35 | .setColor(client.embedColor) 36 | .setTimestamp(); 37 | const collector = NowPlaying.createMessageComponentCollector({ 38 | filter: (b) => { 39 | if (b.guild.me.voice.channel && b.guild.me.voice.channelId === b.member.voice.channelId) return true; 40 | else { 41 | b.reply({ content: `You are not connected to ${b.guild.me.voice.channel} to use this buttons.`, ephemeral: true }); return false; 42 | }; 43 | }, 44 | time: track.duration, 45 | }); 46 | collector.on("collect", async (i) => { 47 | await i.deferReply({ 48 | ephemeral: false 49 | }); 50 | if (i.customId === "vdown") { 51 | if (!player) { 52 | return collector.stop(); 53 | } 54 | let amount = Number(player.volume) - 10; 55 | await player.setVolume(amount); 56 | i.editReply({ embeds: [embed.setAuthor({ name: i.member.user.tag, iconURL: i.member.user.displayAvatarURL({ dynamic: true }) }).setDescription(`${volumeEmoji} The current volume is: **${amount}**`)] }).then(msg => { setTimeout(() => { msg.delete() }, 10000) }); 57 | } else if (i.customId === "stop") { 58 | if (!player) { 59 | return collector.stop(); 60 | } 61 | await player.stop(); 62 | await player.queue.clear(); 63 | i.editReply({ embeds: [embed.setAuthor({ name: i.member.user.tag, iconURL: i.member.user.displayAvatarURL({ dynamic: true }) }).setDescription(`${emojistop} Stopped the music`)] }).then(msg => { setTimeout(() => { msg.delete() }, 10000) }); 64 | return collector.stop(); 65 | } else if (i.customId === "pause") { 66 | if (!player) { 67 | return collector.stop(); 68 | } 69 | player.pause(!player.paused); 70 | const Text = player.paused ? `${emojipause} **Paused**` : `${emojiresume} **Resume**`; 71 | i.editReply({ embeds: [embed.setAuthor({ name: i.member.user.tag, iconURL: i.member.user.displayAvatarURL({ dynamic: true }) }).setDescription(`${Text} \n[${player.queue.current.title}](${player.queue.current.uri})`)] }).then(msg => { setTimeout(() => { msg.delete() }, 10000) }); 72 | } else if (i.customId === "skip") { 73 | if (!player) { 74 | return collector.stop(); 75 | } 76 | await player.stop(); 77 | i.editReply({ embeds: [embed.setAuthor({ name: i.member.user.tag, iconURL: i.member.user.displayAvatarURL({ dynamic: true }) }).setDescription(`${emojiskip} **Skipped**\n[${player.queue.current.title}](${player.queue.current.uri})`)] }).then(msg => { setTimeout(() => { msg.delete() }, 10000) }); 78 | if (track.length === 1) { 79 | return collector.stop(); 80 | } 81 | } else if (i.customId === "vup") { 82 | if (!player) { 83 | return collector.stop(); 84 | } 85 | let amount = Number(player.volume) + 10; 86 | if (amount >= 150) return i.editReply({ embeds: [embed.setAuthor({ name: i.member.user.tag, iconURL: i.member.user.displayAvatarURL({ dynamic: true }) }).setDescription(`Cannot higher the player volume further more.`)] }).then(msg => { setTimeout(() => { msg.delete() }, 10000) }); 87 | await player.setVolume(amount); 88 | i.editReply({ embeds: [embed.setAuthor({ name: i.member.user.tag, iconURL: i.member.user.displayAvatarURL({ dynamic: true }) }).setDescription(`${volumeEmoji} The current volume is: **${amount}**`)] }).then(msg => { setTimeout(() => { msg.delete() }, 10000) }); 89 | return; 90 | } 91 | }); 92 | }; -------------------------------------------------------------------------------- /events/Lavalink/trackStuck.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder } = require("discord.js"); 2 | 3 | module.exports = async (client, player, track, payload) => { 4 | 5 | const channel = client.channels.cache.get(player.textChannel); 6 | const thing = new EmbedBuilder() 7 | .setColor("RED") 8 | .setDescription("❌ Error when loading song! Track is stuck"); 9 | channel.send({embeds: [thing]}); 10 | client.logger.log(`Error when loading song! Track is stuck in [${player.guild}]`, "error"); 11 | if (!player.voiceChannel) player.destroy(); 12 | 13 | } -------------------------------------------------------------------------------- /events/error.js: -------------------------------------------------------------------------------- 1 | const config = require('../config.json') 2 | 3 | module.exports = async (client, error) => { 4 | console.log("Error happend: "+error) 5 | client.channels.cache.get(config.channelID.errorLog).send(''+error+'.') 6 | } -------------------------------------------------------------------------------- /events/guildMemberAdd.js: -------------------------------------------------------------------------------- 1 | const config = require('../config.json') 2 | module.exports = async (client, member, guild) => { 3 | console.log('1') 4 | if (member.user.bot === false) { 5 | console.log('2') 6 | const role = client.guilds.cache.get(config.settings.guildID).roles.cache.find(role => role.name === 'Verified Member'); 7 | member.roles.add(role.id).then(i => { 8 | const channel = client.channels.cache.get('1028046733780983848'); 9 | if (channel) { 10 | channel.send(`<@!${member.user.id}> has joined the server. \n > Added role ${role.name}`); 11 | } 12 | }) 13 | 14 | } 15 | } -------------------------------------------------------------------------------- /events/guildMemberRemove.js: -------------------------------------------------------------------------------- 1 | const Discord = require("discord.js") 2 | const config = require("../config.json") 3 | const axios = require("axios") 4 | 5 | module.exports = async (client, member, guild) => { 6 | console.log(`${member.user.tag} has left.`) 7 | const userdb = userData.get(member.id) 8 | const count = serverCount.get(member.id) 9 | if (!userdb) { 10 | console.log('User is not in the database.') 11 | client.channels.cache.get('942502078172000266').send('🤵 User is not in the database. (quick.db)') 12 | } 13 | if(userdb) { 14 | await axios({ 15 | url: config.pterodactyl.host + "/api/application/users/" + userData.get(member.id).consoleID + "?include=servers", 16 | method: 'GET', 17 | followRedirect: true, 18 | maxRedirects: 5, 19 | headers: { 20 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 21 | 'Content-Type': 'application/json', 22 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 23 | } 24 | }).then(async res => { 25 | const servers1 = res.data.attributes.relationships.servers.data.map(x => x.attributes.id) 26 | client.channels.cache.get('942502078172000266').send({ 27 | embeds: [ 28 | new Discord.EmbedBuilder() 29 | .setColor(Discord.Colors.Red) 30 | .setDescription(` 🦺 ${member.user.tag} has left with consoleid ${userdb.consoleID} with ${servers1.length} servers.`) 31 | ] 32 | }) 33 | client.channels.cache.get('942502078172000266').send('deleting.....') 34 | if (servers1.length > 0) { 35 | await client.channels.cache.get('942502078172000266').send({ 36 | embeds: [ 37 | new Discord.EmbedBuilder() 38 | .setColor(Discord.Colors.Red) 39 | .setTitle('🦺 Deleting servers...') 40 | ] 41 | }) 42 | await Promise.all(servers1.map(async server => { 43 | // await server1.filter(x => x.consolid).map(async server => {}) 44 | client.channels.cache.get('942502078172000266').send({ embeds: [ 45 | new Discord.EmbedBuilder() 46 | .setColor(Discord.Colors.Red) 47 | .setTitle(`🦺 Deleting server ${server}...`) 48 | ]}) 49 | await axios({ 50 | url: config.pterodactyl.host + "/api/application/servers/" + server + "/force", 51 | method: 'DELETE', 52 | followRedirect: true, 53 | maxRedirects: 5, 54 | headers: { 55 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 56 | 'Content-Type': 'application/json', 57 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 58 | } 59 | }).then(() => { 60 | console.log('Server deleted.') 61 | }) 62 | } 63 | )) 64 | } 65 | await axios({ 66 | url: config.pterodactyl.host + "/api/application/users/" + userData.get(member.id).consoleID, 67 | method: 'DELETE', 68 | followRedirect: true, 69 | maxRedirects: 5, 70 | headers: { 71 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 72 | 'Content-Type': 'application/json', 73 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 74 | } 75 | }).then(() => { 76 | userData.delete(member.user.id) 77 | serverCount.delete(member.user.id) 78 | client.channels.cache.get('942502078172000266').send({ 79 | embeds: [ 80 | new Discord.EmbedBuilder() 81 | .setTitle('🦺 Deleted user.') 82 | .setColor(Discord.Colors.Green) 83 | ] 84 | }) 85 | } 86 | ) 87 | }) 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /events/messageDelete.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | module.exports = (client, message) => { 4 | const webhook = new Discord.WebhookClient({ id: config.settings.webhook.id, token: config.settings.webhook.token}); 5 | 6 | // const deleteembed = new Discord.EmbedBuilder() 7 | // .setColor('#ff0000') 8 | // .setTitle('Message Deleted') 9 | // .setDescription(`${message.author.username} deleted a message in ${message.channel.name}`) 10 | // .addField('Message', `${message.content}`) 11 | // .setTimestamp() 12 | // .setFooter(`ID: ${message.id}`); 13 | // webhook.send({ embeds: [deleteembed] }); 14 | const deletembed = new Discord.EmbedBuilder() 15 | .setDescription(`${message.author.username} deleted a message in ${message.channel.name}`) 16 | .addFields({ name: 'Deleted Message', value: message.content }) 17 | .setTimestamp() 18 | .setFooter({ text: message.id }) 19 | webhook.send({ embeds: [deletembed] }) 20 | 21 | let data = { 22 | message: message.content, 23 | member: message.member, 24 | timestamp: Date.now(), 25 | action: "delete", 26 | image: message.attachments.first() ? message.attachments.first().proxyURL : null 27 | }; 28 | 29 | if (client.snipes.get(message.channel.id) == null) client.snipes.set(message.channel.id, [data]) 30 | else client.snipes.set(message.channel.id, [...client.snipes.get(message.channel.id), data]); 31 | 32 | client.snipes.set(message.channel.id, client.snipes.get(message.channel.id).filter(x => (Date.now() - x.timestamp) < 300000 && x != null)); 33 | 34 | } -------------------------------------------------------------------------------- /events/messageReactionAdd.js: -------------------------------------------------------------------------------- 1 | module.exports = async (reaction, user) => { 2 | if (reaction.emoji === '💀') { 3 | console.log('yes'); 4 | } 5 | } -------------------------------------------------------------------------------- /events/messageUpdate.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | 4 | module.exports = (client, oldMessage, newMessage) => { 5 | if (oldMessage.author == null || oldMessage.author.bot == true || !oldMessage.content || newMessage == null) return; 6 | 7 | let data = { 8 | message: oldMessage.content, 9 | member: oldMessage.member, 10 | timestamp: Date.now(), 11 | action: "edit" 12 | }; 13 | 14 | if (client.snipes.get(oldMessage.channel.id) == null) client.snipes.set(oldMessage.channel.id, [data]) 15 | else client.snipes.set(oldMessage.channel.id, [...client.snipes.get(oldMessage.channel.id), data]); 16 | 17 | client.snipes.set(oldMessage.channel.id, client.snipes.get(oldMessage.channel.id).filter(x => (Date.now() - x.timestamp) < 300000 && x != null)); 18 | 19 | } 20 | -------------------------------------------------------------------------------- /handlers/anti_crash.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk'); 2 | const config = require('../config.json') 3 | module.exports = async (process) => { 4 | if (config.settings.anticrash) { 5 | console.log(chalk.red('[Anti-Crash]') + ' is active ') 6 | 7 | process.on('unhandledRejection', (reason, p) => { 8 | console.log(chalk.red(`\n\n\n\n\n[Anti-Crash] unhandled Rejection:`)); 9 | console.log(reason.stack ? String(reason.stack) : String(reason)); 10 | console.log('=== unhandled Rejection ===\n\n\n\n\n'); 11 | }); 12 | process.on('uncaughtExceptionMonitor', (err, origin) => { 13 | console.log(chalk.red('[Anti-Crash] uncaught Exception Monitor')) 14 | }); 15 | process.on('exit', (code) => { 16 | console.log(chalk.red('\n\n\n\n\n[Anti-Crash] exit')); 17 | console.log(code); 18 | console.log(chalk.red('=== exit ===\n\n\n\n\n')); 19 | }); 20 | process.on('multipleResolves', (type, promise, reason) => { 21 | console.log(chalk.red('\n\n\n\n\n[Anti-Crash] multiple Resolves')); 22 | console.log(type, promise, reason); 23 | console.log(chalk.red('=== multiple Resolves ===\n\n\n\n\n')); 24 | }); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /handlers/autodelete.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk'); 2 | const axios = require('axios'); 3 | const serverData = require('../models/serverData'); 4 | const config = require('../config.json'); 5 | const { WebhookClient, EmbedBuilder } = require('discord.js'); 6 | const cron = require('node-cron'); 7 | 8 | const logWebhook = new WebhookClient({ url: config.logs?.webhook }); 9 | 10 | module.exports = async (client) => { 11 | cron.schedule('0 * * * *', async () => { 12 | try { 13 | 14 | console.log(chalk.blue('[Auto-Delete Handler]') + ' Started expiration check'); 15 | 16 | const now = new Date(); 17 | const servers = await serverData.find({}); 18 | 19 | for (const server of servers) { 20 | const timeLeft = server.expiresAt - now; 21 | 22 | if (timeLeft <= 0) { 23 | try { 24 | await axios.delete(`${config.pterodactyl.host}/api/application/servers/${server.serverAdminID}`, { 25 | headers: { 26 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 27 | 'Accept': 'Application/vnd.pterodactyl.v1+json' 28 | } 29 | }); 30 | 31 | const user = await client.users.fetch(server.ownerID); 32 | if (user) { 33 | await user.send(`🗑️ Your server **${server.serverName}** has expired and was deleted.`); 34 | } 35 | 36 | if (server.type === 'gameserver') { 37 | serverCount.subtract(server.ownerID + '.gameused', 1); 38 | console.log('subtract game'); 39 | } else { 40 | serverCount.subtract(server.ownerID + '.botused', 1); 41 | console.log('subtract bot'); 42 | } 43 | 44 | await serverData.deleteOne({ serverID: server.serverID }); 45 | 46 | logWebhook.send({ 47 | embeds: [ 48 | new EmbedBuilder() 49 | .setTitle('🔴 Server Deleted') 50 | .addFields( 51 | { name: 'Server Name', value: server.serverName }, 52 | { name: 'Server ID', value: server.serverID }, 53 | { name: 'Owner', value: `<@${server.ownerID}> (${server.ownerID})` } 54 | ) 55 | .setTimestamp() 56 | .setColor('Red') 57 | ] 58 | }); 59 | } catch (err) { 60 | console.error(`[AutoDelete] Failed to delete server ${server.serverID}:`, err.message); 61 | } 62 | 63 | } else if (timeLeft <= 24 * 60 * 60 * 1000 && !server.warned) { 64 | try { 65 | const user = await client.users.fetch(server.ownerID); 66 | if (user) { 67 | await user.send(`⚠️ Your server **${server.serverName}** will expire in less than 24 hours and be deleted automatically.`); 68 | server.warned = true; 69 | await server.save(); 70 | 71 | logWebhook.send({ 72 | embeds: [ 73 | new EmbedBuilder() 74 | .setTitle('⚠️ Server Expiry Warning') 75 | .addFields( 76 | { name: 'Server Name', value: server.serverName }, 77 | { name: 'Server ID', value: server.serverID }, 78 | { name: 'Owner', value: `<@${server.ownerID}> (${server.ownerID})` } 79 | ) 80 | .setTimestamp() 81 | .setColor('Yellow') 82 | ] 83 | }); 84 | } 85 | } catch (err) { 86 | console.warn(`[DM Warning] Failed to warn user ${server.ownerID}:`, err.message); 87 | } 88 | } 89 | } 90 | } catch (err) { 91 | console.error(chalk.red('[Auto-Delete Handler]') + ' Error in auto-delete handler:', err.message); 92 | } 93 | }); 94 | }; -------------------------------------------------------------------------------- /handlers/command_handler.js: -------------------------------------------------------------------------------- 1 | const fs = require ('fs'); 2 | module.exports = async (client) =>{ 3 | const load_dir = (dirs) =>{ 4 | const command_files = fs.readdirSync(`./commands/${dirs}`).filter(file => file.endsWith('.js')); 5 | for(const file of command_files){ 6 | const command = require (`../commands/${dirs}/${file}`) 7 | if(command.name){ 8 | client.commands.set(command.name, command); 9 | } else { 10 | continue; 11 | } 12 | } 13 | } 14 | ['info', 'admin'].forEach(e => load_dir(e)); 15 | } -------------------------------------------------------------------------------- /handlers/convert.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | convertTime: function (duration) { 3 | 4 | var milliseconds = parseInt((duration % 1000) / 100), 5 | seconds = parseInt((duration / 1000) % 60), 6 | minutes = parseInt((duration / (1000 * 60)) % 60), 7 | hours = parseInt((duration / (1000 * 60 * 60)) % 24); 8 | 9 | hours = (hours < 10) ? "0" + hours : hours; 10 | minutes = (minutes < 10) ? "0" + minutes : minutes; 11 | seconds = (seconds < 10) ? "0" + seconds : seconds; 12 | 13 | if (duration < 3600000) { 14 | return minutes + ":" + seconds ; 15 | } else { 16 | return hours + ":" + minutes + ":" + seconds ; 17 | } 18 | }, 19 | convertNumber: function (number, decPlaces) { 20 | 21 | decPlaces = Math.pow(10,decPlaces); 22 | 23 | var abbrev = [ "K", "M", "B", "T" ]; 24 | 25 | 26 | for (var i=abbrev.length-1; i>=0; i--) { 27 | 28 | var size = Math.pow(10,(i+1)*3); 29 | 30 | if(size <= number) { 31 | 32 | number = Math.round(number*decPlaces/size)/decPlaces; 33 | 34 | 35 | if((number == 1000) && (i < abbrev.length - 1)) { 36 | number = 1; 37 | i++; 38 | } 39 | 40 | number += abbrev[i]; 41 | 42 | break; 43 | } 44 | } 45 | 46 | return number; 47 | }, 48 | convertHmsToMs: function (hms) { 49 | if (hms.length < 3) { 50 | return hms = ((+a[0]) * 1000) 51 | } else if (hms.length < 6) { 52 | const a = hms.split(':') 53 | return hms = (((+a[0]) * 60 + (+a[1])) * 1000) 54 | } else { 55 | const a = hms.split(':') 56 | return hms = (((+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2])) * 1000) 57 | } 58 | } 59 | } -------------------------------------------------------------------------------- /handlers/event_handler.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | module.exports = (client) => { 3 | const event_files = fs.readdirSync(`./events/`).filter(file => file.endsWith('.js')); 4 | for(const file of event_files){ 5 | const event = require(`../events/${file}`); 6 | const event_name = file.split('.')[0]; 7 | client.on(event_name, event.bind(null, client)) 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /handlers/loadslash.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const config = require('../config.json') 3 | 4 | /** 5 | * Load SlashCommands 6 | */ 7 | const loadSlashCommands = async function (client) { 8 | let slash = [] 9 | 10 | const commandFolders = fs.readdirSync("./slashCommands"); 11 | for (const folder of commandFolders) { 12 | const commandFiles = fs 13 | .readdirSync(`./slashCommands/${folder}`) 14 | .filter((file) => file.endsWith(".js")); 15 | 16 | for (const file of commandFiles) { 17 | const command = require(`../slashCommands/${folder}/${file}`); 18 | 19 | if (command.name) { 20 | client.slash.set(command.name, command); 21 | slash.push(command) 22 | console.log(`SlashCommand ${file} is being loaded `); 23 | } else { 24 | console.log(`❌ SlashCommand ${file} missing a help.name or help.name is not in string `); 25 | continue; 26 | } 27 | } 28 | } 29 | 30 | client.on("ready", async() => { 31 | // Register Slash Commands for a single guild 32 | await client.guilds.cache 33 | .get(config.settings.guildID) 34 | .commands.set(slash); 35 | 36 | // Register Slash Commands for all the guilds 37 | //await client.application.commands.set(slash) 38 | }) 39 | } 40 | 41 | module.exports = { 42 | loadSlashCommands 43 | } -------------------------------------------------------------------------------- /handlers/mongoose.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | const config = require('../config.json'); 3 | 4 | module.exports = async () => { 5 | mongoose.set('strictQuery', true); 6 | mongoose.connect(config.settings.mongoDB, { 7 | useNewUrlParser: true, 8 | keepAlive: true, 9 | useUnifiedTopology: true 10 | }).then(()=>{ 11 | console.log(`🏆 Loaded MONGO database`) 12 | }).catch((err) =>{ 13 | console.log(err) 14 | }); 15 | } -------------------------------------------------------------------------------- /handlers/music.js: -------------------------------------------------------------------------------- 1 | const config = require('../config.json') 2 | const { Manager } = require("erela.js"); 3 | const { readdirSync } = require("fs"); 4 | 5 | module.exports = async (client) => { 6 | client.manager = new Manager({ 7 | nodes: config.lavalink.nodes, 8 | send: (id, payload) => { 9 | const guild = client.guilds.cache.get(id); 10 | if (guild) guild.shard.send(payload); 11 | }, 12 | autoPlay: true, 13 | plugins: [], 14 | }); 15 | 16 | client.on("raw", (d) => client.manager.updateVoiceState(d)); 17 | readdirSync("./events/Lavalink/").forEach(file => { 18 | const event = require(`../events/Lavalink/${file}`); 19 | let eventName = file.split(".")[0]; 20 | client.manager.on(eventName, event.bind(null, client)); 21 | }); 22 | } -------------------------------------------------------------------------------- /handlers/progressbar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | progressbar: function (total, current, size, line, slider) { 3 | if (current > total) { 4 | const bar = line.repeat(size + 2); 5 | return bar; 6 | } else { 7 | const percentage = current / total; 8 | const progress = Math.round((size * percentage)); 9 | const emptyProgress = size - progress; 10 | const progressText = line.repeat(progress).replace(/.$/, slider); 11 | const emptyProgressText = line.repeat(emptyProgress); 12 | const bar = progressText + emptyProgressText; 13 | return bar; 14 | } 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /logs/console.log.js: -------------------------------------------------------------------------------- 1 | const consolelog = console.log 2 | const fs = require('fs') 3 | const chalk = require('chalk') 4 | const moment = require('moment') 5 | const util = require('util') 6 | const name = moment().format("YYYY-MM-DD") + "_" + moment().format("HH:mm:ss") 7 | module.exports=() =>{ 8 | global.console.log = async function(string) { 9 | consolelog(string ? typeof string === 'object' ? string : `${chalk.blueBright(`[ ${new Date().toLocaleTimeString('en', { timeZone: 'Europe/London' })} ] `)} ${string}` : "") 10 | await fs.appendFileSync(`./logs/console/${name}.txt`, `${string ? string : ""}\n`); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /logs/console/placeholder.txt: -------------------------------------------------------------------------------- 1 | This file is a placeholder 2 | -------------------------------------------------------------------------------- /models/ServerCount.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | 3 | const ServerCount = new mongoose.Schema({ 4 | ID: { 5 | type: String, 6 | require: true, 7 | unique: false 8 | }, 9 | used: { 10 | type: String, 11 | require: true, 12 | unique: false 13 | }, 14 | have: { 15 | type: String, 16 | require: true, 17 | unique: false 18 | } 19 | }) 20 | 21 | module.exports = mongoose.model('FreeServerCount', ServerCount); -------------------------------------------------------------------------------- /models/serverData.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | 3 | const serverDataSchema = new mongoose.Schema({ 4 | ownerID: { 5 | type: String, 6 | required: true 7 | }, 8 | serverID: { 9 | type: String, 10 | required: true, 11 | unique: true 12 | }, 13 | serverAdminID: { 14 | type: String, 15 | required: true 16 | }, 17 | serverName: { 18 | type: String, 19 | required: true 20 | }, 21 | type: { 22 | type: String, 23 | enum: ['gameserver', 'botserver'], 24 | required: true 25 | }, 26 | createdAt: { 27 | type: Date, 28 | default: Date.now 29 | }, 30 | expiresAt: { 31 | type: Date, 32 | default: () => new Date(Date.now() + 7 * 24 * 60 * 60 * 1000) 33 | }, 34 | warned: { 35 | type: Boolean, 36 | default: false 37 | } 38 | }); 39 | 40 | module.exports = mongoose.model('ServerData', serverDataSchema); -------------------------------------------------------------------------------- /models/userData.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | 3 | const userData = new mongoose.Schema({ 4 | ID: String, 5 | consoleID: String, 6 | email: String, 7 | username: String, 8 | linkTime: String, 9 | linkDate: String 10 | }) 11 | 12 | module.exports = mongoose.model('userData', userData); -------------------------------------------------------------------------------- /nginxPM/deleteProxy.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios'); 2 | const config = require('../config.json') 3 | const { getKey } = require("./getKey") 4 | 5 | const deleteProxy = async (id) => { 6 | let data 7 | if(!id) return data 8 | 9 | await axios({ 10 | url: config.nginxPM.host + "/api/nginx/proxy-hosts/" + id, 11 | method: 'DELETE', 12 | followRedirect: true, 13 | maxRedirects: 5, 14 | headers: { 15 | 'Authorization': await getKey(), 16 | 'Content-Type': 'application/json', 17 | } 18 | }).then(res => { 19 | data = true 20 | }).catch(err => data = null) 21 | 22 | return data 23 | } 24 | 25 | module.exports = { 26 | deleteProxy 27 | } -------------------------------------------------------------------------------- /nginxPM/findProxy.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios'); 2 | const config = require('../config.json') 3 | const { getKey } = require("./getKey") 4 | 5 | const findProxy = async (domain) => { 6 | let data 7 | await axios({ 8 | url: config.nginxPM.host + "/api/nginx/proxy-hosts", 9 | method: 'GET', 10 | followRedirect: true, 11 | maxRedirects: 5, 12 | headers: { 13 | 'Authorization': await getKey(), 14 | 'Content-Type': 'application/json', 15 | } 16 | }).then(res => { 17 | data = res.data.find(element => element.domain_names[0] == domain.toLowerCase()) 18 | }).catch(err => data = null) 19 | return data 20 | } 21 | 22 | module.exports = { 23 | findProxy 24 | } -------------------------------------------------------------------------------- /nginxPM/getDomainIp.js: -------------------------------------------------------------------------------- 1 | const dns = require('dns') 2 | 3 | const getDomainIP = async (domain) => { 4 | let ip; 5 | 6 | const options = { 7 | family: 4, 8 | hints: dns.ADDRCONFIG | dns.V4MAPPED, 9 | }; 10 | 11 | return await new Promise((res, rej) => { 12 | dns.lookup(domain, options, (err, address, family) => 13 | res(address) 14 | ); 15 | }) 16 | } 17 | 18 | module.exports = { 19 | getDomainIP 20 | } -------------------------------------------------------------------------------- /nginxPM/getKey.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios'); 2 | const config = require('../config.json') 3 | 4 | const getKey = async () => { 5 | 6 | const res = await axios({ 7 | url: `${config.nginxPM.host}/api/tokens`, 8 | method: 'POST', 9 | headers: { 10 | 'Content-Type': 'application/json', 11 | }, 12 | data: { 13 | "identity": config.nginxPM.email, 14 | "secret": config.nginxPM.pass 15 | } 16 | }); 17 | 18 | return `Bearer ${res.data.token}`; 19 | }; 20 | 21 | module.exports = { 22 | getKey 23 | }; -------------------------------------------------------------------------------- /nginxPM/index.js: -------------------------------------------------------------------------------- 1 | const { getKey } = require('./getKey') 2 | const { getDomainIP } = require('./getDomainIp') 3 | const { proxyDomain } = require('./proxy') 4 | const { findProxy } = require('./findProxy') 5 | const { deleteProxy } = require('./deleteProxy') 6 | 7 | module.exports = { 8 | getKey, 9 | getDomainIP, 10 | proxyDomain, 11 | findProxy, 12 | deleteProxy 13 | } -------------------------------------------------------------------------------- /nginxPM/proxy.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios'); 2 | const { getKey } = require("./getKey") 3 | const config = require('../config.json') 4 | 5 | const proxyDomain = async (domain, ip, port) => { 6 | try { 7 | let {data} = await axios({ 8 | url: `${config.nginxPM.host}/api/nginx/proxy-hosts`, 9 | method: 'POST', 10 | headers: { 11 | 'Authorization': await getKey(), 12 | 'Content-Type': 'application/json', 13 | }, 14 | data: { 15 | "domain_names": [ 16 | domain 17 | ], 18 | "forward_scheme": "http", 19 | "forward_host": ip, 20 | "forward_port": port, 21 | "access_list_id": "0", 22 | "certificate_id": "new", 23 | "meta": { 24 | "letsencrypt_email": "certs@luxxy.xyz", 25 | "letsencrypt_agree": true, 26 | "dns_challenge": false 27 | }, 28 | "advanced_config": "", 29 | "locations": [], 30 | "block_exploits": true, 31 | "caching_enabled": false, 32 | "allow_websocket_upgrade": true, 33 | "http2_support": false, 34 | "hsts_enabled": false, 35 | "hsts_subdomains": false, 36 | "ssl_forced": true 37 | } 38 | }); 39 | 40 | return {error: false, message: "Successfully proxied domain.", data: data}; 41 | } catch (err) { 42 | console.log("proxyDomain: " + err.message) 43 | return {error: true, message: err.message, data: null}; 44 | } 45 | } 46 | 47 | module.exports = { 48 | proxyDomain 49 | } 50 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "host-bot", 3 | "version": "1.2.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index.js", 8 | "dev": "nodemon index.js" 9 | }, 10 | "dependencies": { 11 | "@androz2091/discord-invites-tracker": "^1.2.3", 12 | "@discordjs/opus": "^0.10.0", 13 | "@discordjs/voice": "^0.16.1", 14 | "axios": "^0.26.1", 15 | "chalk": "^2.4.2", 16 | "chartjs-node-canvas": "^5.0.0", 17 | "delay": "^5.0.0", 18 | "discord.js": "^14.14.1", 19 | "dns": "^0.1.2", 20 | "erela.js": "^2.4.0", 21 | "erela.js-spotify": "^1.2.0", 22 | "format-duration": "^2.0.0", 23 | "fs": "^0.0.1-security", 24 | "lavalink-client": "^2.5.1", 25 | "mathjs": "^11.12.0", 26 | "minecraft-pinger": "^1.0.5", 27 | "moment": "^2.29.4", 28 | "moment-duration-format": "^2.3.2", 29 | "mongoose": "^6.12.3", 30 | "ms": "^2.1.3", 31 | "nekobot-api": "^2.1.0", 32 | "node-cron": "^3.0.3", 33 | "node-superfetch": "^0.2.3", 34 | "os": "^0.1.2", 35 | "path": "^0.12.7", 36 | "ping": "^0.4.4", 37 | "prettysize": "^2.0.0", 38 | "quick.db": "^7.1.3", 39 | "string-table": "^0.1.5", 40 | "systeminformation": "^5.21.20", 41 | "util": "^0.12.5", 42 | "validator": "^13.11.0", 43 | "ws": "^8.18.2" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /paid_creation/paper.js: -------------------------------------------------------------------------------- 1 | module.exports = (userID, serverName, location, memory) => { 2 | return { 3 | "name": serverName, 4 | "user": userID, 5 | "nest": 1, 6 | "egg": 3, 7 | "docker_image": "ghcr.io/pterodactyl/yolks:java_17", 8 | "startup": "java -Xms128M -Xmx{{SERVER_MEMORY}}M -Dterminal.jline=false -Dterminal.ansi=true -jar {{SERVER_JARFILE}}", 9 | "limits": { 10 | "memory": memory, 11 | "swap": 0, 12 | "disk": 32240, 13 | "io": 500, 14 | "cpu": 0 15 | }, 16 | "environment": { 17 | "MINECRAFT_VERSION": "latest", 18 | "SERVER_JARFILE": "server.jar", 19 | "DL_PATH": "https://papermc.io/api/v2/projects/paper/versions/1.18.1/builds/214/downloads/paper-1.18.1-214.jar", 20 | "BUILD_NUMBER": "latest" 21 | }, 22 | "feature_limits": { 23 | "databases": 2, 24 | "allocations": 1, 25 | "backups": 10 26 | }, 27 | "deploy": { 28 | "locations": location, 29 | "dedicated_ip": false, 30 | "port_range": [] 31 | }, 32 | "start_on_completion": false 33 | } 34 | } -------------------------------------------------------------------------------- /server_creation/aio.js: -------------------------------------------------------------------------------- 1 | module.exports = (userID, serverName, location) => { 2 | return { 3 | serverType: "botserver", 4 | data: { 5 | "name": `[Free] ${userID} ${serverName}`, 6 | "user": userID, 7 | "nest": 7, 8 | "egg": 23, 9 | "docker_image": "danbothosting/aio", 10 | "startup": "{{STARTUP_CMD}}", 11 | "limits": { 12 | "memory": 512, 13 | "swap": 0, 14 | "disk": 2048, 15 | "io": 500, 16 | "cpu": 100 17 | }, 18 | "environment": { 19 | "STARTUP_CMD": "bash" 20 | }, 21 | "feature_limits": { 22 | "databases": 0, 23 | "allocations": 1, 24 | "backups": 0 25 | }, 26 | "deploy": { 27 | "locations": [ location ], 28 | "dedicated_ip": false, 29 | "port_range": [] 30 | }, 31 | "start_on_completion": false 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /server_creation/bedrock.js: -------------------------------------------------------------------------------- 1 | module.exports = (userID, serverName, location) => { 2 | return { 3 | serverType: "gameserver", 4 | data: { 5 | "name": `[Free] ${userID} ${serverName}`, 6 | "user": userID, 7 | "nest": 1, 8 | "egg": 21, 9 | "docker_image": "ghcr.io/parkervcp/yolks:debian", 10 | "startup": "./bedrock_server", 11 | "limits": { 12 | "memory": 1024, 13 | "swap": 0, 14 | "disk": 10240, 15 | "io": 500, 16 | "cpu": 350 17 | }, 18 | "environment": { 19 | "BEDROCK_VERSION": "latest", 20 | "LD_LIBRARY_PATH": ".", 21 | "SERVERNAME": "Bedrock Dedicated Server", 22 | "GAMEMODE": "survival", 23 | "DIFFICULTY": "easy", 24 | "CHEATS": "false", 25 | "WORLDNAME": "world" 26 | }, 27 | "feature_limits": { 28 | "databases": 0, 29 | "allocations": 1, 30 | "backups": 0 31 | }, 32 | "deploy": { 33 | "locations": [ location ], 34 | "dedicated_ip": false, 35 | "port_range": [] 36 | }, 37 | "start_on_completion": false 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /server_creation/fabric.js: -------------------------------------------------------------------------------- 1 | module.exports = (userID, serverName, location) => { 2 | return { 3 | serverType: "gameserver", 4 | data: { 5 | "name": `[Free] ${userID} ${serverName}`, 6 | "user": userID, 7 | "nest": 1, 8 | "egg": 19, 9 | "docker_image": "ghcr.io/pterodactyl/yolks:java_21", 10 | "startup": "java -Xms128M -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}}", 11 | "limits": { 12 | "memory": 3072, 13 | "swap": 0, 14 | "disk": 15360, 15 | "io": 500, 16 | "cpu": 350 17 | }, 18 | "environment": { 19 | "SERVER_JARFILE": "server.jar", 20 | "MC_VERSION": "latest", 21 | "FABRIC_VERSION": "latest", 22 | "LOADER_VERSION": "latest" 23 | }, 24 | "feature_limits": { 25 | "databases": 1, 26 | "allocations": 1, 27 | "backups": 0 28 | }, 29 | "deploy": { 30 | "locations": [ location ], 31 | "dedicated_ip": false, 32 | "port_range": [] 33 | }, 34 | "start_on_completion": false 35 | } 36 | 37 | } 38 | } -------------------------------------------------------------------------------- /server_creation/fivem.js: -------------------------------------------------------------------------------- 1 | module.exports = (userID, serverName, location) => { 2 | return { 3 | serverType: "gameserver", 4 | data: { 5 | "name": `[Free] ${userID} ${serverName}`, 6 | "user": userID, 7 | "nest": 6, 8 | "egg": 18, 9 | "docker_image": "ghcr.io/luxxy-gf/pterodactyl-fivem", 10 | "startup": "./start.sh", 11 | "limits": { 12 | "memory": 2048, 13 | "swap": 0, 14 | "disk": 25600, 15 | "io": 500, 16 | "cpu": 200 17 | }, 18 | "environment": { 19 | "TXADMIN_PORT": "40120", 20 | "AUTO_UPDATE": "1", 21 | "TXADMIN_PROFILE": "defualt", 22 | "SERVER_HOSTNAME": serverName, 23 | "STEAM_WEBAPIKEY": "none", 24 | "FIVEM_LICENSE": "replace_with_your_license", 25 | "TXADMIN_ENABLE": "1", 26 | "MAX_PLAYERS": "48", 27 | "FIVEM_VERSION": "latest", 28 | "PROVIDER_NAME": "LuxxySystems", 29 | "PROVIDER_LOGO": "https://avatars.githubusercontent.com/u/100530350?s=400&u=a73c13a41552c9d5d9c7f6d4bf3b656eb839f9e0&v=4" 30 | }, 31 | "feature_limits": { 32 | "databases": 1, 33 | "allocations": 2, 34 | "backups": 0 35 | }, 36 | "deploy": { 37 | "locations": [ location ], 38 | "dedicated_ip": false, 39 | "port_range": [] 40 | }, 41 | "start_on_completion": false 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /server_creation/nginx.js: -------------------------------------------------------------------------------- 1 | module.exports = (userID, serverName, location) => { 2 | return { 3 | serverType: "botserver", 4 | data: { 5 | "name": `[Free] ${userID} ${serverName}`, 6 | "user": userID, 7 | "nest": 7, 8 | "egg": 30, 9 | "docker_image": "ghcr.io/sigma-production/nginx-ptero:8.4", 10 | "startup": "{{STARTUP_CMD}}", 11 | "limits": { 12 | "memory": 512, 13 | "swap": 0, 14 | "disk": 2048, 15 | "io": 500, 16 | "cpu": 100 17 | }, 18 | "environment": { 19 | "STARTUP_CMD": "./start.sh", 20 | "WORDPRESS": "0", 21 | "COMPOSER_MODULES": null, 22 | "GIT_ADDRESS": null, 23 | "BRANCH": null, 24 | "AUTO_UPDATE": "0", 25 | "USER_UPLOAD": "0", 26 | "USERNAME": null, 27 | "ACCESS_TOKEN": null, 28 | "NAMELESSMC": "0", 29 | 30 | }, 31 | "feature_limits": { 32 | "databases": 1, 33 | "allocations": 1, 34 | "backups": 0 35 | }, 36 | "deploy": { 37 | "locations": [location], 38 | "dedicated_ip": false, 39 | "port_range": [] 40 | }, 41 | "start_on_completion": false 42 | } 43 | } 44 | } -------------------------------------------------------------------------------- /server_creation/nodejs.js: -------------------------------------------------------------------------------- 1 | module.exports = (userID, serverName, location) => { 2 | return { 3 | serverType: "botserver", 4 | data: { 5 | "name": `[Free] ${userID} ${serverName}`, 6 | "user": userID, 7 | "nest": 7, 8 | "egg": 26, 9 | "docker_image": "ghcr.io/luxxy-gf/nodejs_22", 10 | "startup": "/start.sh", 11 | "limits": { 12 | "memory": 512, 13 | "swap": 0, 14 | "disk": 2048, 15 | "io": 500, 16 | "cpu": 50 17 | }, 18 | "environment": { 19 | "start_command1": "npm install --save --production", 20 | "start_command2": "node ." 21 | }, 22 | "feature_limits": { 23 | "databases": 0, 24 | "allocations": 1, 25 | "backups": 0 26 | }, 27 | "deploy": { 28 | "locations": [ location ], 29 | "dedicated_ip": false, 30 | "port_range": [] 31 | }, 32 | "start_on_completion": false, 33 | "oom_disabled": false 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /server_creation/paper.js: -------------------------------------------------------------------------------- 1 | module.exports = (userID, serverName, location) => { 2 | return { 3 | serverType: "gameserver", 4 | data: { 5 | "name": `[Free] ${userID} ${serverName}`, 6 | "user": userID, 7 | "nest": 1, 8 | "egg": 4, 9 | "docker_image": "ghcr.io/pterodactyl/yolks:java_21", 10 | "startup": "java -Xms128M -XX:MaxRAMPercentage=95.0 -Dterminal.jline=false -Dterminal.ansi=true -jar {{SERVER_JARFILE}}", 11 | "limits": { 12 | "memory": 3072, 13 | "swap": 0, 14 | "disk": 15360, 15 | "io": 500, 16 | "cpu": 200 17 | }, 18 | "environment": { 19 | "MINECRAFT_VERSION": "latest", 20 | "SERVER_JARFILE": "server.jar", 21 | "DL_PATH": null, 22 | "BUILD_NUMBER": "latest" 23 | }, 24 | "feature_limits": { 25 | "databases": 1, 26 | "allocations": 1, 27 | "backups": 0 28 | }, 29 | "deploy": { 30 | "locations": [ location ], 31 | "dedicated_ip": false, 32 | "port_range": [] 33 | }, 34 | "start_on_completion": false 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /server_creation/pocketminemp.js: -------------------------------------------------------------------------------- 1 | module.exports = (userID, serverName, location) => { 2 | return { 3 | serverType: "gameserver", 4 | data: { 5 | "name": `[Free] ${userID} ${serverName}`, 6 | "user": userID, 7 | "nest": 1, 8 | "egg": 22, 9 | "docker_image": "ghcr.io/parkervcp/yolks:debian", 10 | "startup": "./bin/php7/bin/php ./PocketMine-MP.phar --no-wizard --disable-ansi", 11 | "limits": { 12 | "memory": 1024, 13 | "swap": 0, 14 | "disk": 10240, 15 | "io": 500, 16 | "cpu": 350 17 | }, 18 | "environment": { 19 | "VERSION": "PM5" 20 | }, 21 | "feature_limits": { 22 | "databases": 0, 23 | "allocations": 1, 24 | "backups": 0 25 | }, 26 | "deploy": { 27 | "locations": [ location ], 28 | "dedicated_ip": false, 29 | "port_range": [] 30 | }, 31 | "start_on_completion": false 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /server_creation/purpur.js: -------------------------------------------------------------------------------- 1 | module.exports = (userID, serverName, location) => { 2 | return { 3 | serverType: "gameserver", 4 | data: { 5 | "name": `[Free] ${userID} ${serverName}`, 6 | "user": userID, 7 | "nest": 1, 8 | "egg": 20, 9 | "docker_image": "ghcr.io/pterodactyl/yolks:java_21", 10 | "startup": "java --add-modules=jdk.incubator.vector -Xms128M -XX:MaxRAMPercentage=95.0 -Dterminal.jline=false -Dterminal.ansi=true -jar {{SERVER_JARFILE}}", 11 | "limits": { 12 | "memory": 3072, 13 | "swap": 0, 14 | "disk": 15360, 15 | "io": 500, 16 | "cpu": 200 17 | }, 18 | "environment": { 19 | "MINECRAFT_VERSION": "latest", 20 | "SERVER_JARFILE": "server.jar", 21 | "BUILD_NUMBER": "latest" 22 | }, 23 | "feature_limits": { 24 | "databases": 1, 25 | "allocations": 1, 26 | "backups": 0 27 | }, 28 | "deploy": { 29 | "locations": [ location ], 30 | "dedicated_ip": false, 31 | "port_range": [] 32 | }, 33 | "start_on_completion": false 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /server_creation/python.js: -------------------------------------------------------------------------------- 1 | module.exports = (userID, serverName, location) => { 2 | return { 3 | serverType: "botserver", 4 | data: { 5 | "name": `[Free] ${userID} ${serverName}`, 6 | "user": userID, 7 | "nest": 7, 8 | "egg": 27, 9 | "docker_image": "ghcr.io/luxxy-gf/python_3.12", 10 | "startup": "/start.sh", 11 | "limits": { 12 | "memory": 512, 13 | "swap": 0, 14 | "disk": 2048, 15 | "io": 500, 16 | "cpu": 50 17 | }, 18 | "environment": { 19 | "start_command1": "pip install -r requirements.txt", 20 | "start_command2": "python bot.py" 21 | }, 22 | "feature_limits": { 23 | "databases": 0, 24 | "allocations": 1, 25 | "backups": 0 26 | }, 27 | "deploy": { 28 | "locations": [ location ], 29 | "dedicated_ip": false, 30 | "port_range": [] 31 | }, 32 | "start_on_completion": false, 33 | "oom_disabled": false 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /server_creation/uptimekuma.js: -------------------------------------------------------------------------------- 1 | module.exports = (userID, serverName, location) => { 2 | return { 3 | serverType: "botserver", 4 | data: { 5 | "name": `[Free] ${userID} ${serverName}`, 6 | "user": userID, 7 | "nest": 7, 8 | "egg": 24, 9 | "docker_image": "ghcr.io/parkervcp/yolks:nodejs_20", 10 | "startup": "/usr/local/bin/node /home/container/server/server.js --port={{SERVER_PORT}}", 11 | "limits": { 12 | "memory": 512, 13 | "swap": 0, 14 | "disk": 2048, 15 | "io": 500, 16 | "cpu": 100 17 | }, 18 | "environment": {}, 19 | "feature_limits": { 20 | "databases": 0, 21 | "allocations": 1, 22 | "backups": 0 23 | }, 24 | "deploy": { 25 | "locations": [ location ], 26 | "dedicated_ip": false, 27 | "port_range": [] 28 | }, 29 | "start_on_completion": false 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /server_creation/vanillamc.js: -------------------------------------------------------------------------------- 1 | module.exports = (userID, serverName, location) => { 2 | return { 3 | serverType: "gameserver", 4 | data: { 5 | "name": `[Free] ${userID} ${serverName}`, 6 | "user": userID, 7 | "nest": 1, 8 | "egg": 5, 9 | "docker_image": "ghcr.io/pterodactyl/yolks:java_17", 10 | "startup": "java -Xms128M -XX:MaxRAMPercentage=95.0 -jar {{SERVER_JARFILE}}", 11 | "limits": { 12 | "memory": 3072, 13 | "swap": 0, 14 | "disk": 15360, 15 | "io": 500, 16 | "cpu": 350 17 | }, 18 | "environment": { 19 | "SERVER_JARFILE": "server.jar", 20 | "VANILLA_VERSION": "latest" 21 | }, 22 | "feature_limits": { 23 | "databases": 1, 24 | "allocations": 1, 25 | "backups": 0 26 | }, 27 | "deploy": { 28 | "locations": [ location ], 29 | "dedicated_ip": false, 30 | "port_range": [] 31 | }, 32 | "start_on_completion": false 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /slashCommands/info/myinfo.js: -------------------------------------------------------------------------------- 1 | const Discord = require("discord.js"); 2 | const axios = require("axios"); 3 | const config = require("../../config.json"); 4 | const userdata = require("../../models/userData"); 5 | 6 | module.exports = { 7 | name: "myinfo", 8 | category: "info", 9 | description: "Shows your Hosting Account Info", 10 | type: Discord.ApplicationCommandType.ChatInput, 11 | ownerOnly: false, 12 | run: async (client, interaction, args) => { 13 | const userDB = await userdata.findOne({ ID: interaction.user.id }); 14 | 15 | if (!userDB) { 16 | interaction.reply({ content: 'You Don\'t have an account created. type `!user new` to create one', ephemeral: true }); 17 | return; 18 | } 19 | 20 | axios({ 21 | url: config.pterodactyl.host + "/api/application/users/" + userDB.consoleID + "?include=servers", 22 | headers: { 23 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 24 | 'Content-Type': 'application/json', 25 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 26 | } 27 | }).then(async res => { 28 | responce = res.data.attributes.relationships.servers.data 29 | let id = 1 30 | let id2 = 1 31 | const embed = new Discord.EmbedBuilder() 32 | .setColor(0x0099ff) 33 | .setTitle("Your Account Info") 34 | .setDescription(`Your Account Name: ${userDB.username}`) 35 | .addFields({ name: 'Email:', value: `${userDB.email}`}) 36 | .addFields({ name: 'Console ID:', value: `${userDB.consoleID}`}) 37 | .addFields({ name: 'Link Time:', value: `${userDB.linkTime}`}) 38 | .addFields({ name: 'Link Date:', value: `${userDB.linkDate}`}) 39 | .addFields({ name: 'Server Id:', value: `\`\`\`\n${responce.map(x => `${id++}. ${x.attributes.identifier}`).join('\n') || 'no Servers'}\`\`\``, inline: true}) 40 | .addFields({ name: 'Server Name:', value: `\`\`\`\n${responce.map(x => `${id2++}. ${x.attributes.name}`).join('\n') || 'no Servers'}\`\`\``, inline: true }) 41 | .setTimestamp() 42 | .setFooter({ text: 'Hello', iconURL: 'https://i.imgur.com/wSTFkRM.png' }); 43 | await interaction.reply({ embeds: [embed], ephemeral: true }); 44 | }).catch(async err => { 45 | await interaction.reply({ content: `${err}`, ephemeral: true }); 46 | }) 47 | } 48 | } -------------------------------------------------------------------------------- /slashCommands/info/ping.js: -------------------------------------------------------------------------------- 1 | const Discord = require("discord.js"); 2 | 3 | module.exports = { 4 | name: "ping", 5 | category: "info", 6 | description: "Shows the bot's latency", 7 | type: Discord.ApplicationCommandType.ChatInput, 8 | ownerOnly: false, 9 | run: async (client, interaction, args) => { 10 | var ping = Date.now() - interaction.createdTimestamp; 11 | const embed = new Discord.EmbedBuilder() 12 | .setColor(0x0099ff) 13 | .setDescription(`Latency: **${ping}**ms \nAPI Latency: **${Math.round(client.ws.ping)}**ms`) 14 | .setTimestamp(); 15 | interaction.reply({ embeds: [embed] }); 16 | } 17 | } -------------------------------------------------------------------------------- /slashCommands/server/count.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | 3 | module.exports = { 4 | name: 'count', 5 | description: 'sends how many servers you used', 6 | type: Discord.ApplicationCommandType.ChatInput, 7 | category: "server", 8 | 9 | run: async (client, interaction, args) => { 10 | const user = interaction.user 11 | if(!serverCount.get(user.id)) { 12 | await serverCount.set(user.id, { 13 | mineused: 0, 14 | botused: 0, 15 | minehave: 1, 16 | bothave: 2 17 | }) 18 | } 19 | 20 | interaction.reply({ 21 | embeds:[ 22 | new Discord.EmbedBuilder() 23 | .setTitle(`${success} ${user.username}'s Server Count`) 24 | .setColor(0x677bf9) 25 | .setDescription(`**${user.username}** have used \`${serverCount.get(user.id).used}/${serverCount.get(user.id).have}\` servers`) 26 | ] 27 | }) 28 | } 29 | } -------------------------------------------------------------------------------- /slashCommands/server/create.js: -------------------------------------------------------------------------------- 1 | const Discord = require("discord.js"); 2 | const config = require("../../config.json"); 3 | const axios = require("axios"); 4 | const UserDatadata = require("../../models/userData"); 5 | 6 | module.exports = { 7 | name: "create", 8 | category: "server", 9 | description: "Creates a new server", 10 | options: [ 11 | { 12 | name: "type", 13 | description: "The type of server to create", 14 | type: Discord.ApplicationCommandOptionType.String, 15 | required: true, 16 | choices: [ 17 | { name: "Paper", value: "paper" }, 18 | ], 19 | }, 20 | { 21 | name: "name", 22 | description: "The name of the server", 23 | type: Discord.ApplicationCommandOptionType.String, 24 | required: true, 25 | } 26 | ], 27 | ownerOnly: false, 28 | run: async (client, interaction) => { 29 | // return interaction.reply(`:x: This command is not available yet. Please check back later.`); 30 | const type = interaction.options.getString('type'); 31 | const name = interaction.options.getString('name'); 32 | 33 | const userData = await UserDatadata.findOne({ ID: interaction.user.id }); 34 | 35 | if (!userData) { 36 | return interaction.reply(":x: You don't have an account. Type `!user new` to create one."); 37 | } 38 | 39 | if (!serverCount.get(interaction.user.id)) { 40 | serverCount.set(interaction.user.id, { 41 | used: 0, 42 | have: 2 43 | }); 44 | } 45 | 46 | const userServers = serverCount.get(interaction.user.id); 47 | 48 | if (userServers.used >= userServers.have) { 49 | return interaction.reply(`:x: All server slots used. Run \`!server count\` for more info.`); 50 | } 51 | 52 | let ServerData; 53 | 54 | try { 55 | const generateData = require(`../../server_creation/${type.toLowerCase()}.js`); 56 | ServerData = generateData(userData.consoleID, name, config.pterodactyl.depolymentlocations); 57 | } catch (err) { 58 | return interaction.reply(`❌ No server type found: \`${type.toLowerCase()}\`. Use \`!server create list\` to see available types.`); 59 | } 60 | 61 | try { 62 | const response = await axios({ 63 | url: config.pterodactyl.host + "/api/application/servers", 64 | method: 'POST', 65 | headers: { 66 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 67 | 'Content-Type': 'application/json', 68 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 69 | }, 70 | data: ServerData, 71 | }); 72 | 73 | const server = response.data.attributes; 74 | 75 | const serverButton = new Discord.ButtonBuilder() 76 | .setStyle('Link') 77 | .setURL(`${config.pterodactyl.host}/server/${server.identifier}`) 78 | .setLabel(server.name.length < 25 ? `[${server.name}] Server Link` : `Server Link`); 79 | 80 | const row = new Discord.ActionRowBuilder().addComponents(serverButton); 81 | 82 | await interaction.reply({ 83 | embeds: [ 84 | new Discord.EmbedBuilder() 85 | .setColor(Discord.Colors.Green) 86 | .setTitle(`✅ Server Created Successfully`) 87 | .setDescription(` 88 | > **Status:** \`${response.statusText}\` 89 | > **User ID:** \`${userData.consoleID}\` 90 | > **Server ID:** \`${server.identifier}\` 91 | > **Server Name:** \`${server.name}\` 92 | > **Server Type:** \`${type.toLowerCase()}\` 93 | `) 94 | ], 95 | components: [row] 96 | }); 97 | 98 | userServers.used += 1; 99 | serverCount.set(interaction.user.id, userServers); 100 | 101 | } catch (error) { 102 | let errorMsg = `idk the error 💀.`; 103 | 104 | if (error.message.includes("400")) { 105 | errorMsg = `The node ran out of allocations/ports!`; 106 | } else if (error.message.includes("504")) { 107 | errorMsg = `The node is currently offline or having issues.`; 108 | } else if (error.message.includes("429")) { 109 | errorMsg = `Rate limit hit. Try again in a minute.`; 110 | } 111 | 112 | await interaction.reply({ 113 | embeds: [ 114 | new Discord.EmbedBuilder() 115 | .setColor(Discord.Colors.Red) 116 | .addFields({ name: `❌ Server creation failed`, value: errorMsg }) 117 | ] 118 | }); 119 | } 120 | } 121 | }; 122 | -------------------------------------------------------------------------------- /slashCommands/server/serverlist.js: -------------------------------------------------------------------------------- 1 | const Discord = require("discord.js"); 2 | const axios = require("axios"); 3 | const config = require("../../config.json"); 4 | const userdata = require("../../models/userData"); 5 | 6 | module.exports = { 7 | name: "serverlist", 8 | category: "info", 9 | description: "lists the servers you got in your account", 10 | type: Discord.ApplicationCommandType.ChatInput, 11 | ownerOnly: false, 12 | run: async (client, interaction, args) => { 13 | const userDB = await userdata.findOne({ ID: interaction.user.id }); 14 | if (!userDB) { 15 | interaction.reply({ content: 'You Don\'t have an account created. type `!user new` to create one' }); 16 | return; 17 | } 18 | 19 | axios({ 20 | url: config.pterodactyl.host + "/api/application/users/" + userDB.consoleID + "?include=servers", 21 | method: 'GET', 22 | followRedirect: true, 23 | maxRedirects: 5, 24 | headers: { 25 | 'Authorization': 'Bearer ' + config.pterodactyl.adminApiKey, 26 | 'Content-Type': 'application/json', 27 | 'Accept': 'Application/vnd.pterodactyl.v1+json', 28 | } 29 | }).then(async res => { 30 | responce = res.data.attributes.relationships.servers.data 31 | let id = 1 32 | let id2 = 1 33 | if(responce.length <= 35){ 34 | interaction.reply({ 35 | embeds:[ 36 | new Discord.EmbedBuilder() 37 | .setTitle(`${interaction.user.username}'s servers`) 38 | .addFields({ name: 'Server Id:', value: `\`\`\`\n${responce.map(x => `${id++}. ${x.attributes.identifier}`).join('\n') || 'no Servers'}\`\`\``, inline: true}) 39 | .addFields({ name: 'Server Name:', value: `\`\`\`\n${responce.map(x => `${id2++}. ${x.attributes.name}`).join('\n') || 'no Servers'}\`\`\``, inline: true }) 40 | .setColor(Discord.Colors.Green) 41 | ] 42 | }).catch(err => { 43 | interaction.reply({ 44 | embeds:[ 45 | new Discord.EmbedBuilder() 46 | .setTitle(`:x: | HOW MANY SERVERS DO U HAVE???`) 47 | .setDescription(`${err}`) 48 | .setColor(Discord.Colors.Red) 49 | ] 50 | }) 51 | }) 52 | } else { 53 | let id = 1 54 | let servers = responce.map(x => `${id++}. ${x.attributes.identifier} ➜ ${x.attributes.name}`).join('\n') 55 | interaction.reply({ 56 | files:[ 57 | { 58 | attachment: Buffer.from(servers), 59 | name: "servers.js" 60 | } 61 | ] 62 | }) 63 | } 64 | }) 65 | } 66 | } -------------------------------------------------------------------------------- /start.sh: -------------------------------------------------------------------------------- 1 | pnpm run start 2 | --------------------------------------------------------------------------------