├── .gitignore ├── commands ├── help.js ├── newcreate.js ├── reload.js ├── plugins.js ├── eval.js ├── premium.js └── create.js ├── .gitattributes ├── package.json └── index.js /.gitignore: -------------------------------------------------------------------------------- 1 | config.json 2 | json.sqlite 3 | node_modules/ 4 | storage/ 5 | servers/ -------------------------------------------------------------------------------- /commands/help.js: -------------------------------------------------------------------------------- 1 | exports.run = async (client, message, args) => { 2 | 3 | }; -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /commands/newcreate.js: -------------------------------------------------------------------------------- 1 | exports.run = async (client, message, args) => { 2 | 3 | //Message embed for help of the command and also missing args 4 | const embed = new Discord.MessageEmbed() 5 | .addField('**Types:**', '**Spigot:** \nCreative \nSurvival \n') 6 | .addField('**Versions:**', '1.16.1 \n1.16.2 \n1.16.3 \n1.16.4') 7 | .setFooter(settings.get(message.guild.id).prefix + 'create type version') 8 | } -------------------------------------------------------------------------------- /commands/reload.js: -------------------------------------------------------------------------------- 1 | exports.run = (client, message, args) => { 2 | if (message.author.id !== config.ownerID) return message.channel.send("Sorry, No permission :O"); 3 | try { 4 | fs.readdir("./commands/", (err, files) => { 5 | if (err) return console.error(err); 6 | message.channel.send(`Refreshed \`${files.length}\` commands successfully!`) 7 | files.forEach(file => { 8 | delete require.cache[require.resolve(`./${file}`)]; 9 | }); 10 | }); 11 | } catch (err) { 12 | return; 13 | } 14 | }; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "discordbotmc", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "dependencies": { 7 | "child_process": "^1.0.2", 8 | "danbot-hosting": "^0.1.6", 9 | "discord.js": "^12.3.1", 10 | "ejs": "^3.1.5", 11 | "express": "^4.17.1", 12 | "node-fs-extra": "^0.8.2", 13 | "quick.db": "^7.1.2", 14 | "socket.io": "^2.3.0", 15 | "websocket": "^1.0.32", 16 | "ws": "^7.3.1" 17 | }, 18 | "devDependencies": {}, 19 | "scripts": { 20 | "test": "echo \"Error: no test specified\" && exit 1" 21 | }, 22 | "author": "", 23 | "license": "ISC" 24 | } 25 | -------------------------------------------------------------------------------- /commands/plugins.js: -------------------------------------------------------------------------------- 1 | const embed = new Discord.MessageEmbed() 2 | .addField('**Supported plugins:**', 'WorldEdit \nEssentials') 3 | .setFooter('MCS^plugins enable/disable pluginname creative/survival') 4 | 5 | exports.run = async (client, message, args) => { 6 | if (!args[0]) { 7 | message.channel.send(embed) 8 | } else if (args[0].toLowerCase() == "enable") { 9 | if (args[1].toLowerCase() == "essentials") { 10 | if (args[2].toLowerCase() == "creative") { 11 | fs.copyFile('./storage/plugins/EssentialsX-2.17.1.11.jar', './servers/' + message.author.id + "-creative/plugins/EssentialsX-2.17.1.11.jar", function (err) { 12 | if (err) { 13 | console.error(err); 14 | message.channel.send(err) 15 | } else { 16 | message.channel.send('Enabled `Essentials` for your `' + args[2] + "` server!") 17 | }; 18 | }); 19 | } else if (args[2].toLowerCase() == "survival") { 20 | fs.copy('./storage/plugins/EssentialsX-2.17.1.11.jar', './servers/' + message.author.id + "-survival/plugins/EssentialsX-2.17.1.11.jar", function (err) { 21 | if (err) { 22 | console.error(err); 23 | message.channel.send(err) 24 | } else { 25 | message.channel.send('Enabled `Essentials` for your `' + args[2] + "` server!") 26 | }; 27 | }); 28 | } else { 29 | //else options 30 | message.channel.send('Options are `creative/survival`. Sorry!') 31 | } 32 | } else if (args[1].toLowerCase() == "worldedit") { 33 | if (args[2].toLowerCase() == "creative") { 34 | fs.copyFile('./storage/plugins/worldedit-bukkit-7.2.0-beta-05.jar', './servers/' + message.author.id + "-creative/plugins/worldedit-bukkit-7.2.0-beta-05.jar", function (err) { 35 | if (err) { 36 | console.error(err); 37 | message.channel.send(err) 38 | } else { 39 | message.channel.send('Enabled `WorldEdit` for your `' + args[2] + "` server!") 40 | }; 41 | }); 42 | } else if (args[2].toLowerCase() == "survival") { 43 | fs.copy('./storage/plugins/worldedit-bukkit-7.2.0-beta-05.jar', './servers/' + message.author.id + "-survival/plugins/worldedit-bukkit-7.2.0-beta-05.jar", function (err) { 44 | if (err) { 45 | console.error(err); 46 | message.channel.send(err) 47 | } else { 48 | message.channel.send('Enabled `WorldEdit` for your `' + args[2] + "` server!") 49 | }; 50 | }); 51 | } else { 52 | //else options 53 | message.channel.send('Options are `creative/survival`. Sorry!') 54 | } 55 | } else { 56 | //Not supported plugin 57 | message.channel.send(embed) 58 | } 59 | } else { 60 | //Other than enable 61 | message.channel.send('Not finished') 62 | } 63 | }; -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | //Global Defined 2 | global.Discord = require("discord.js"); 3 | global.fs = require("node-fs-extra"); 4 | global.spawn = require('child_process').spawn; 5 | global.client = new Discord.Client({disableEveryone: true}); 6 | global.config = require("./config.json"); 7 | global.exec = require('child_process').exec; 8 | global.child_children = []; 9 | 10 | //Database - Quick.DB 11 | const db = require('quick.db'); 12 | global.settings = new db.table("settings"); //Guild settings, Stored: Prefix, GuildID, Admins only 13 | global.userSettings = new db.table("userSettings"); //User settings, Stored: Premium User, Dedicated Port, Premium Ram, Server 14 | global.servers = new db.table("servers"); //Running servers, Stopped servers and also a console link 15 | 16 | //Post stats to websites 17 | const DanBotHosting = require("danbot-hosting"); 18 | 19 | //Client event ready 20 | client.on("ready", async () => { 21 | console.log(client.user.username + " is online with " + client.guilds.cache.size + " servers!"); 22 | await client.user.setActivity('Minecraft | Free Minecraft Servers!') 23 | 24 | settings.set('476731541167407106', { 25 | "prefix": config.DiscordBot.defaultprefix, 26 | "adminonly": "false" 27 | }); 28 | 29 | //Start posting stats (DanBotHosting) 30 | const API = new DanBotHosting.Client(config.DanBotHosting.apikey, client); 31 | 32 | // Start posting 33 | let initalPost = await API.autopost(); 34 | 35 | if (initalPost) { 36 | console.error(initalPost); // console the error 37 | }; 38 | 39 | //Automatic 30second git pull. 40 | setInterval(() => { 41 | exec(`git pull`, (error, stdout) => { 42 | let response = (error || stdout); 43 | if (!error) { 44 | if (response.includes("Already up to date.")) { 45 | //console.log('Bot already up to date. No changes since last pull') 46 | } else { 47 | client.channels.cache.get('783799656722595842').send('**[AUTOMATIC]** \nNew update on GitHub. Pulling. \n\nLogs: \n```' + response + "```" + "\n\n\n**Restarting bot**") 48 | setTimeout(() => { 49 | process.exit(); 50 | }, 1000) 51 | }; 52 | } 53 | }) 54 | }, 30000) 55 | }); 56 | 57 | //Client event guild join 58 | client.on("guildCreate", (guild) => { 59 | //set guild settings 60 | settings.set(guild.id, { 61 | "prefix": config.DiscordBot.defaultprefix, 62 | "adminonly": "false" 63 | }); 64 | 65 | //Log new guild join in console 66 | client.channels.cache.get('783799548395913246').send('Joined: ' + guild.name + "(ID: " + guild.id + ") \nGuild owner: " + guild.owner + " \n\nTotal: " + client.guilds.cache.size) 67 | }); 68 | 69 | //Command handler 70 | client.on('message', message => { 71 | if (message.channel.type === 'dm') { 72 | minecraftServerProcess.stdin.write(message.content); 73 | } 74 | if (message.author.bot) return; 75 | if (message.author.id === "229367793479319553") { 76 | 77 | const prefix = settings.get(message.guild.id).prefix; 78 | if (message.content.indexOf(prefix) !== 0) return; 79 | const args = message.content.slice(prefix.length).trim().split(/ +/g); 80 | const commandargs = message.content.split(' ').slice(1).join(' '); 81 | const command = args.shift().toLowerCase(); 82 | console.log(`[${message.author.username}] [${message.author.id}] >> ${prefix}${command} ${commandargs}`); 83 | try { 84 | let commandFile = require(`./commands/${command}.js`); 85 | commandFile.run(client, message, args); 86 | } catch (err) { 87 | if (err instanceof Error && err.code === "MODULE_NOT_FOUND") { 88 | return; 89 | } 90 | } 91 | 92 | } 93 | }) 94 | 95 | //Stop all servers on bot shutdown 96 | process.on('exit', function() { 97 | console.log('killing', child_children.length, 'child processes'); 98 | child_children.forEach(function(child) { 99 | child.kill(); 100 | }); 101 | servers.set('totalstats', { 102 | running: "0", 103 | stopped: "0" 104 | }) 105 | }); 106 | 107 | client.login(config.DiscordBot.token); -------------------------------------------------------------------------------- /commands/eval.js: -------------------------------------------------------------------------------- 1 | const execSync = require('child_process').execSync; 2 | const ms = require('ms'); 3 | exports.run = async(client, message) => { 4 | let ids = [ "338192747754160138", "137624084572798976", "293841631583535106"]; 5 | if (!ids.includes(message.author.id)) { 6 | return message.channel.send(`Only my master can use this command`); 7 | } 8 | 9 | function clean(text) { 10 | if (typeof (text) === 'string') { 11 | return text.replace(/`/g, '`' + String.fromCharCode(8203)).replace(/@/g, '@' + String.fromCharCode(8203)); 12 | } 13 | return text; 14 | } 15 | 16 | function clean(text) { 17 | if (typeof text !== 'string') 18 | text = require('util').inspect(text, { depth: 0 }) 19 | let rege = new RegExp(client.token, "gi"); 20 | text = text 21 | .replace(/`/g, '`' + String.fromCharCode(8203)) 22 | .replace(/@/g, '@' + String.fromCharCode(8203)) 23 | .replace(rege, '403') 24 | return text; 25 | }; 26 | let args = message.content.split(' ').slice(1); 27 | let cont = message.content.split(' ').slice(1).join(' '); 28 | message.channel.send('Evaluating...').then(msg => { 29 | try { 30 | let code = args.join(' '); 31 | let evaled = eval(code); 32 | 33 | if (typeof evaled !== 'string') { 34 | evaled = require('util').inspect(evaled); 35 | } 36 | if (evaled.length > 2000) { 37 | try { 38 | let evalcode1 = new Discord.MessageEmbed() 39 | .setAuthor(`Eval by ${message.author.tag}`, `https://cdn.discordapp.com/emojis/314405560701419520.png`) 40 | .setDescription(`**Input:**\n\n\`\`\`js\n${cont}\`\`\``, true) 41 | .addField(`\u200b`, `**Output:**\n\n\`\`\`Output too long, logged to eval.txt`, true) 42 | .setColor(0x00FF00) 43 | .setFooter(`Node.js - Time taken: ${Date.now() - message.createdTimestamp} ms`); 44 | msg.edit({ 45 | embed: evalcode1 46 | }), fs.writeFile(`eval.txt`, `${clean(evaled)}`), message.channel.send("Eval output", { files: ["eval.txt"] }); 47 | return fs.writeFile(`eval.txt`, `${clean(evaled)}`); 48 | } catch (err) { 49 | let errorcode1 = new Discord.MessageEmbed() 50 | .setAuthor(`Eval by ${message.author.tag}`, `https://cdn.discordapp.com/emojis/314405560701419520.png`) 51 | .setDescription(`**Input:**\n\n\`\`\`js\n${cont}\`\`\``, true) 52 | .addField(`\u200b`, `**Output:**\n\n\`\`\`js\nOutput too long, logged to ${__dirname}\\eval.txt\`\`\``, true) 53 | .setColor(0xFF0000) 54 | .setFooter(`Node.js - Time taken: ${Date.now() - message.createdTimestamp} ms `, `https://images-ext-2.discordapp.net/eyJ1cmwiOiJodHRwczovL2Euc2FmZS5tb2UvVUJFVWwucG5nIn0.LbWCXwiUul3udoS7s20IJYW8xus`); 55 | msg.edit({ 56 | embed: errorcode1 57 | }); 58 | return fs.writeFile(`eval.txt`, `${clean(err)}`); 59 | } 60 | } 61 | let evalcode = new Discord.MessageEmbed() 62 | .setAuthor(`Eval by ${message.author.tag}`, `https://cdn.discordapp.com/emojis/314405560701419520.png`) 63 | .setDescription(`**:inbox_tray: Input:**\n\n\`\`\`js\n${cont}\`\`\``, true) 64 | .addField(`\u200b`, `**:outbox_tray: Output:**\n\n\`\`\`js\n${clean(evaled)}\`\`\``, true) 65 | .setColor(0x00FF00) 66 | .setFooter(`Node.js - Time taken: ${Date.now() - message.createdTimestamp} ms`); 67 | msg.edit({ 68 | embed: evalcode 69 | }).catch(e => logger.error(e)); 70 | } catch (err) { 71 | let errorcode = new Discord.MessageEmbed() 72 | .setAuthor(`Eval by ${message.author.tag}`, `https://cdn.discordapp.com/emojis/314405560701419520.png`) 73 | .setDescription(`**:inbox_tray: Input:**\n\n\`\`\`js\n${cont}\`\`\``, true) 74 | .addField(`\u200b`, `**:outbox_tray: Output:**\`\`\`js\n${clean(err)}\`\`\``, true) 75 | .setColor(0xFF0000) 76 | .setFooter(`Node.js - Time taken: ${Date.now() - message.createdTimestamp} `); 77 | msg.edit({ 78 | embed: errorcode 79 | }).catch(e => logger.error(e)); 80 | } 81 | }); 82 | }; -------------------------------------------------------------------------------- /commands/premium.js: -------------------------------------------------------------------------------- 1 | exports.run = async (client, message, args) => { 2 | //Enables premium for a user 3 | //Will work like: MCS^premium enable userid creative/survival 4 | if (args[0] == "enable") { 5 | if (!args[1]) { 6 | message.channel.send("Command format: `" + settings.get(message.guild.id).prefix + "premium enable userid creative/survival`") 7 | 8 | } else { 9 | //Make sure settings are pre-set to ignore any errors 10 | if (userSettings.get(args[1]) == null) { 11 | userSettings.set(args[1], { 12 | "premiumport": true, 13 | "creativeenabled": false, 14 | "survivalenabled": false, 15 | "creativedport": "0", 16 | "survivaldport": "0", 17 | "premiumram": false 18 | }); 19 | } 20 | 21 | if (args[2] == "survival") { 22 | function serverport(length) { 23 | var result = ''; 24 | var characters = '234562345623456'; 25 | var charactersLength = characters.length; 26 | for ( var i = 0; i < length; i++ ) { 27 | result += characters.charAt(Math.floor(Math.random() * charactersLength)); 28 | } 29 | return result; 30 | } 31 | 32 | userSettings.set(args[1], { 33 | "premiumport": true, 34 | "creativeenabled": userSettings.get(args[1]).creativeenabled, 35 | "survivalenabled": true, 36 | "creativedport": userSettings.get(args[1]).creativedport, 37 | "survivaldport": serverport(5), 38 | "premiumram": userSettings.get(args[1]).premiumram 39 | }); 40 | message.channel.send("Enabled dedicated port for user: `" + args[1] + "` for the server: `" + args[2] + "`!") 41 | } else if (args[2] == "creative") { 42 | function serverport(length) { 43 | var result = ''; 44 | var characters = '234562345623456'; 45 | var charactersLength = characters.length; 46 | for ( var i = 0; i < length; i++ ) { 47 | result += characters.charAt(Math.floor(Math.random() * charactersLength)); 48 | } 49 | return result; 50 | } 51 | 52 | userSettings.set(args[1], { 53 | "premiumport": true, 54 | "creativeenabled": true, 55 | "survivalenabled": userSettings.get(args[1]).survivalenabled, 56 | "creativedport": serverport(5), 57 | "survivaldport": userSettings.get(args[1]).survivaldport, 58 | "premiumram": userSettings.get(args[1]).premiumram 59 | }); 60 | message.channel.send("Enabled dedicated port for user: `" + args[1] + "` for the server: `" + args[2] + "`!") 61 | } 62 | } 63 | } else if (args[0] == "disable") { 64 | if (!args[1]) { 65 | message.channel.send("Command format: `" + settings.get(message.guild.id).prefix + "premium disable userid creative/survival`") 66 | } else { 67 | if (args[2] == "creative") { 68 | userSettings.set(args[1], { 69 | "premiumport": true, 70 | "creativeenabled": false, 71 | "survivalenabled": userSettings.get(args[1]).survivalenabled, 72 | "creativedport": userSettings.get(args[1]).creativedport, 73 | "survivaldport": userSettings.get(args[1]).survivaldport, 74 | "premiumram": userSettings.get(args[1]).premiumram 75 | }); 76 | message.channel.send("Disabled dedicated port for user: `" + args[1] + "` for the server: `" + args[2] + "`!") 77 | } else if (args[2] == "survival") { 78 | userSettings.set(args[1], { 79 | "premiumport": true, 80 | "creativeenabled": userSettings.get(args[1]).creativeenabled, 81 | "survivalenabled": false, 82 | "creativedport": userSettings.get(args[1]).creativedport, 83 | "survivaldport": userSettings.get(args[1]).survivaldport, 84 | "premiumram": userSettings.get(args[1]).premiumram 85 | }); 86 | message.channel.send("Disabled dedicated port for user: `" + args[1] + "` for the server: `" + args[2] + "`!") 87 | } 88 | } 89 | } 90 | }; -------------------------------------------------------------------------------- /commands/create.js: -------------------------------------------------------------------------------- 1 | exports.run = async (client, message, args, socket) => { 2 | 3 | const embed = new Discord.MessageEmbed() 4 | .addField('**Types:**', '**Spigot:** \nCreative \nSurvival \n') 5 | .addField('**Versions:**', '1.16.1 \n1.16.2 \n1.16.3') 6 | .setFooter(settings.get(message.guild.id).prefix + 'create type version') 7 | 8 | function log(data) { 9 | process.stdout.write(data.toString()); 10 | //client.users.cache.get(message.author.id).send(data.toString()) 11 | } 12 | 13 | //Server IP generation 14 | function serverport(length) { 15 | if (userSettings.get(message.author.id) == null) { 16 | let result = ''; 17 | let characters = '23456789'; 18 | let charactersLength = characters.length; 19 | for ( let i = 0; i < length; i++ ) { 20 | result += characters.charAt(Math.floor(Math.random() * charactersLength)); 21 | } 22 | return result; 23 | } else if (userSettings.get(message.author.id).premiumport === true) { 24 | if (args[0] === "survival") { 25 | if (userSettings.get(message.author.id).survivalenabled === false) { 26 | let result = ''; 27 | let characters = '23456789'; 28 | let charactersLength = characters.length; 29 | for ( let i = 0; i < length; i++ ) { 30 | result += characters.charAt(Math.floor(Math.random() * charactersLength)); 31 | } 32 | return result; 33 | } else { 34 | var result = userSettings.get(message.author.id).survivaldport; 35 | return result; 36 | } 37 | } else if (args[0] === "creative") { 38 | if (userSettings.get(message.author.id).creativeenabled === false) { 39 | let result = ''; 40 | let characters = '23456789'; 41 | let charactersLength = characters.length; 42 | for ( let i = 0; i < length; i++ ) { 43 | result += characters.charAt(Math.floor(Math.random() * charactersLength)); 44 | } 45 | return result; 46 | } else { 47 | var result = userSettings.get(message.author.id).creativedport; 48 | return result; 49 | } 50 | } 51 | } 52 | } 53 | 54 | let versions = [ "1.16.1", "1.16.2", "1.16.3"]; 55 | if (!args[0]) { 56 | message.channel.send(embed) 57 | } else if (args[0].toLowerCase() == "survival") { 58 | if (versions.includes(args[1])) { 59 | const sport = serverport(4); 60 | fs.copy('./storage/survival/', './servers/' + message.author.id + "-survival/", function (err) { 61 | if (err) { 62 | message.channel.send('The server you created already running!') 63 | } else { 64 | const embed = new Discord.MessageEmbed() 65 | .addField('__**Server Started!**__', '**Server IP:** `161.97.138.124:' + sport + '` \n**Gamemode:** `Survival` \n**Version:** ' + args[1] + ' \n **Player Slots:** 50') 66 | .setFooter('To manage the server. Please see DMs for info') 67 | message.channel.send(embed) 68 | client.channels.cache.get('783799548395913246').send('Minecraft server started for <@' + message.author.id + '> (ID: ' + message.author.id + ') \nIP: `161.97.138.124:' + sport + '` \nGamemode: Survival \nVersion: ' + args[1] + '\n\nTotal: \nRUNNING: ' + servers.get('totalstats.running') + '\nSTOPPED: ' + servers.get('totalstats.stopped')) 69 | servers.set('totalstats', { 70 | running: `${servers.get('totalstats.running') + 1}`, 71 | stopped: `${servers.get('totalstats.stopped')}` 72 | }) 73 | fs.copy('./storage/serverjars/spigot-' + args[1] + ".jar", './servers/' + message.author.id + "-survival/spigot-" + args[1] + ".jar") 74 | setTimeout(() => { 75 | const minecraftServerProcess = child_children.push(spawn('java', [ 76 | '-Xmx1024M', 77 | '-Xms1024M', 78 | '-DIReallyKnowWhatIAmDoingISwear', 79 | '-XX:ParallelGCThreads=1', 80 | '-jar', 81 | 'spigot-' + args[1] + '.jar', 82 | '-p' + sport, 83 | '-s50', 84 | 'nogui' ], { cwd: './servers/' + message.author.id + '-survival/' })); 85 | minecraftServerProcess.stdout.on('data', log); 86 | minecraftServerProcess.stderr.on('data', log); 87 | 88 | setInterval(() => { 89 | minecraftServerProcess.stdin.write("save-all \n"); 90 | }, 297000) 91 | 92 | setTimeout(() => { 93 | //3hours timeout 94 | minecraftServerProcess.stdin.write('say You have 1hour left before the server will shutdown \n') 95 | setTimeout(() => { 96 | //30mins timeout 97 | minecraftServerProcess.stdin.write('say You have 30mins left before the server will shutdown \n') 98 | setTimeout(() => { 99 | //15mins timeout 100 | minecraftServerProcess.stdin.write('say You have 15mins left before the server will shutdown \n') 101 | setTimeout(() => { 102 | //5mins timeout 103 | minecraftServerProcess.stdin.write('say You have 5mins left before the server will shutdown \n') 104 | setTimeout(() => { 105 | //30seconds timeout 106 | minecraftServerProcess.stdin.write('say The 4hour timeslot is up! Please re-run the command to start the server again for another 4hours! Shutting down server in 30seconds.') 107 | client.users.cache.get(message.author.id).send("The `" + args[0] + "` server you created has just expired! \nYou can run `MCS^create " + args[0] + "` to start your server again in any discord server. (No files or data will be lost)") 108 | minecraftServerProcess.stdin.write("kick @a Free server hosted by MinecraftServers discord bot. 4hour timeslot is up!\n"); 109 | minecraftServerProcess.stdin.write('save-all \n') 110 | setTimeout(() => { 111 | //5seconds timeout 112 | minecraftServerProcess.stdin.write("stop \n"); 113 | servers.set('totalstats', { 114 | running: `${servers.get('totalstats.running') - 1}`, 115 | stopped: `${servers.get('totalstats.stopped') + 1}` 116 | }) 117 | //5seconds timeout - Shutdown warning 118 | }, 5000) 119 | //30seconds timeout - Shutdown warning 120 | }, 30000) 121 | //5mins timeout - Shutdown warning 122 | }, 300000) 123 | //15mins timeout - Shutdown warning 124 | }, 900000) 125 | //30mins timeout - Shutdown warning 126 | }, 1800000) 127 | //3hours timeout - Shutdown warning 128 | }, 10800000) 129 | //2seconds timeout - server creation 130 | }, 2000) 131 | } 132 | }); 133 | } else { 134 | message.channel.send(embed) 135 | } 136 | 137 | } else if (args[0].toLowerCase() == "creative") { 138 | //Check if server version is supported 139 | if (versions.includes(args[1])) { 140 | //Generat random port 141 | const sport = serverport(4); 142 | //Copy basic server files 143 | fs.copy('./storage/creative/', './servers/' + message.author.id + "-creative/", function (err) { 144 | if (err) { 145 | message.channel.send('The server you created already running!') 146 | } else { 147 | //Server created message 148 | const embed = new Discord.MessageEmbed() 149 | .addField('__**Server Started!**__', '**Server IP:** `161.97.138.124:' + sport + '` \n**Gamemode:** `Creative` \n**Version:** `' + args[1] + '` \n **Player Slots:** 50') 150 | .setFooter('To manage the server. Please see DMs for info') 151 | message.channel.send(embed) 152 | client.channels.cache.get('783799548395913246').send('Minecraft server started for <@' + message.author.id + '> (ID: ' + message.author.id + ') \nIP: `161.97.138.124:' + sport + '` \nGamemode: Creative \nVersion: ' + args[1] + '\n\nTotal: \nRUNNING: ' + servers.get('totalstats.running') + '\nSTOPPED: ' + servers.get('totalstats.stopped')) 153 | servers.set('totalstats', { 154 | running: `${servers.get('totalstats.running') + 1}`, 155 | stopped: `${servers.get('totalstats.stopped')}` 156 | }) 157 | //Copy server jar files over 158 | fs.copy('./storage/serverjars/spigot-' + args[1] + ".jar", './servers/' + message.author.id + "-creative/spigot-" + args[1] + ".jar") 159 | //Launch the server 160 | setTimeout(() => { 161 | const minecraftServerProcess = child_children.push(spawn('java', [ 162 | '-Xmx2048M', 163 | '-Xms1024M', 164 | '-DIReallyKnowWhatIAmDoingISwear', 165 | '-XX:ParallelGCThreads=1', 166 | '-jar', 167 | 'spigot-' + args[1] + '.jar', 168 | '-p' + sport, 169 | '-s25', 170 | 'nogui' ], { cwd: './servers/' + message.author.id + '-creative/' })); 171 | //minecraftServerProcess.stdout.on('data', log); 172 | //minecraftServerProcess.stderr.on('data', log); 173 | setInterval(() => { 174 | minecraftServerProcess.stdin.write("save-all \n"); 175 | }, 297000) 176 | 177 | setTimeout(() => { 178 | //3hours timeout 179 | minecraftServerProcess.stdin.write('say You have 1hour left before the server will shutdown \n') 180 | setTimeout(() => { 181 | //30mins timeout 182 | minecraftServerProcess.stdin.write('say You have 30mins left before the server will shutdown \n') 183 | setTimeout(() => { 184 | //15mins timeout 185 | minecraftServerProcess.stdin.write('say You have 15mins left before the server will shutdown \n') 186 | setTimeout(() => { 187 | //5mins timeout 188 | minecraftServerProcess.stdin.write('say You have 5mins left before the server will shutdown \n') 189 | setTimeout(() => { 190 | //30seconds timeout 191 | minecraftServerProcess.stdin.write('say The 4hour timeslot is up! Please re-run the command to start the server again for another 4hours! Shutting down server in 30seconds.') 192 | client.users.cache.get(message.author.id).send("The `" + args[0] + "` server you created has just expired! \nYou can run `MCS^create " + args[0] + "` to start your server again in any discord server. (No files or data will be lost)") 193 | minecraftServerProcess.stdin.write("kick @a Free server hosted by MinecraftServers discord bot. 4hour timeslot is up!\n"); 194 | minecraftServerProcess.stdin.write('save-all \n') 195 | setTimeout(() => { 196 | //5seconds timeout 197 | minecraftServerProcess.stdin.write("stop \n"); 198 | servers.set('totalstats', { 199 | running: `${servers.get('totalstats.running') - 1}`, 200 | stopped: `${servers.get('totalstats.stopped') + 1}` 201 | }) 202 | //5seconds timeout - Shutdown warning 203 | }, 5000) 204 | //30seconds timeout - Shutdown warning 205 | }, 30000) 206 | //5mins timeout - Shutdown warning 207 | }, 300000) 208 | //15mins timeout - Shutdown warning 209 | }, 900000) 210 | //30mins timeout - Shutdown warning 211 | }, 1800000) 212 | //3hours timeout - Shutdown warning 213 | }, 10800000) 214 | //2seconds timeout - server creation 215 | }, 2000) 216 | } 217 | }); 218 | } else { 219 | message.channel.send(embed) 220 | } 221 | } else { 222 | message.channel.send(embed) 223 | } 224 | }; --------------------------------------------------------------------------------