Skip to content

Instantly share code, notes, and snippets.

@simonmeusel
Last active June 23, 2023 09:44
Show Gist options
  • Save simonmeusel/1de7166288b12c04518c59158a85f5ef to your computer and use it in GitHub Desktop.
Save simonmeusel/1de7166288b12c04518c59158a85f5ef to your computer and use it in GitHub Desktop.
Start minecraft server via discord bot
var spawn = require('child_process').spawn;
var discord = require("discord.js");
var bot = new discord.Client();
var mcserver;
// The start.bat has to include a 'cd "C:/Users/_____/Desktop/Server/"' command (See start.bat for more details)
var MC_SERVER_START_SCRIPT = "C:/Users/_____/Desktop/Server/start.bat";
bot.on("message", function(message){
if (message.content == "start") {
// Only start if not running
if (mcserver == null) {
bot.sendMessage(message, "Starting server...");
// Start the server
mcserver = spawn(MC_SERVER_START_SCRIPT);
mcserver.stdout.on('data', (data) => {
console.log("stdout: " + data);
// Not everything is send (because i think there is a send limit per time)
// bot.sendMessage(message, "stdout: " + data);
});
mcserver.stderr.on('data', (data) => {
console.log("stderr: " + data);
bot.sendMessage(message, "stdout: " + data);
});
mcserver.on('close', (code) => {
console.log("child process exited with code " + code);
bot.sendMessage(message, "child process exited with code " + code);
});
}
} else if (message.content == "stop") {
// Only stop if running
if (message.content == "start") {
bot.sendMessage(message, "Stopping server...");
// Stop the server
mcserver.kill();
mcserver = null;
}
}
});
bot.login("email", "pass")
cd C:\Users\_____\Desktop\Server
java -jar spigot.jar
@JonnyKartofa
Copy link

i really dont know what im doing wrong i get the same error here is the code
var MC_SERVER_START_SCRIPT = "C:Users/Jon7n/Desktop/server.bat";

and the error>>

events.js:292
throw er; // Unhandled 'error' event
^

Error: spawn C:Users/Jon7n/Desktop/server.bat ENOENT
at Process.ChildProcess._handle.onexit (internal/child_process.js:269:19)
at onErrorNT (internal/child_process.js:465:16)
at processTicksAndRejections (internal/process/task_queues.js:80:21)
Emitted 'error' event on ChildProcess instance at:
at Process.ChildProcess._handle.onexit (internal/child_process.js:275:12)
at onErrorNT (internal/child_process.js:465:16)
at processTicksAndRejections (internal/process/task_queues.js:80:21) {
errno: -4058,
code: 'ENOENT',
syscall: 'spawn C:Users/Jon7n/Desktop/server.bat',
path: 'C:Users/Jon7n/Desktop/server.bat',
spawnargs: []
}

@Whitelisted1
Copy link

@JonnyKartofa I know this is late, but show me your code and I might be able to help

sorry I can't help any more than that

@Whitelisted1
Copy link

Made a GitHub repository that showed how to do this

https://github.com/Whitelisted1/startProgram/tree/main

@BogTheMudWing
Copy link

Changed some things to make it (hopefully) better! Some stuff was out-of-date but should work correctly now.

var kill  = require('tree-kill');
var spawn = require('child_process').spawn;
var discord = require("discord.js");

var bot = new discord.Client({ intents: ["GUILDS","GUILD_MESSAGES"]});
var mcserver;
var lastMsgTime = 0;

// IMPORTANT: Change the path below to the start.sh file.
// After that, you're done editing this script.
var MC_SERVER_START_SCRIPT = "C:/path/to/start.bat";

bot.on("ready", () =>{
  console.log('Bot online!');
});

bot.on("messageCreate", function(message){

  var msgContent = message.content.toLowerCase();

  if (msgContent == "start") {

    console.log('Attempting to start server.');
    // Only start if not running
    if (mcserver == null) {
      
      if ((bot.uptime - lastMsgTime) < 0)
      {
        console.log("Potential command spamming by " + message.author.username);
        message.channel.send("Last command was less than 60 seconds ago. Try again in a minute, " + message.author.username + ".");
      }
      else
      {
        lastMsgTime = bot.uptime;

        message.channel.send("Starting Minecraft server. This will take a minute or so.");

        // Start the server
        mcserver = spawn(MC_SERVER_START_SCRIPT);

        mcserver.stdout.on('data', function (data) {
            console.log("stdout: " + data);
            
            message.channel.send("stdout: " + data);

            if (data.includes("Closing Server")) {
              kill(mcserver.pid);
              mcserver = null;
            }
          });
        

        mcserver.on('close', function (code) {
            console.log("child process exited with code " + code);
            message.channel.send("Minecraft server has been closed. (Code: " + code + ")");

            // Stop the server
            if (mcserver != null) {
              kill(mcserver.pid);
            }

            mcserver = null;
          });
      }
    }
    else
    {
      message.channel.send("Minecraft server is already running.");
    }

  } else if (msgContent == "stop") {

    
    if ((bot.uptime - lastMsgTime) < 0)
    {
      console.log("Potential command spamming by " + message.author.username);
      message.channel.send("Last command was less than 60 seconds ago. Try again in a minute, " + message.author.username + ".");
    }
    else
    {
      lastMsgTime = bot.uptime;

      // Only stop if running
      if (mcserver != null) {
        message.channel.send("Force-stopping Minecraft server...");

        // Stop the server
        kill(mcserver.pid);

        mcserver = null;
      }
    }
  }
});

bot.login("BOT_TOKEN");

@TeddySenpai
Copy link

TeddySenpai commented Jul 7, 2022

@Stonley890 I tried your code and got the following error

Bot online!
Attempting to start server.
node:events:368
throw er; // Unhandled 'error' event
^

Error: spawn C:UsersHasnain JavedDocumentsMCServerDiscordBot-masterServersServerBStart.bat ENOENT
at Process.ChildProcess._handle.onexit (node:internal/child_process:282:19)
at onErrorNT (node:internal/child_process:477:16)
Emitted 'error' event on ChildProcess instance at:
at Process.ChildProcess._handle.onexit (node:internal/child_process:288:12)
at onErrorNT (node:internal/child_process:477:16) {
errno: -2,
code: 'ENOENT',
syscall: 'spawn C:UsersHasnain JavedDocumentsMCServerDiscordBot-masterServersServerBStart.bat',
path: 'C:UsersHasnain JavedDocumentsMCServerDiscordBot-masterServersServerBStart.bat',
spawnargs: []
}

I used your code but put in the .bat location ("C:\Users\Hasnain Javed\Documents\MCServerDiscordBot-master\Servers\ServerB\Start.bat") and the Bot Token.

Can you help?

(I'm on Windows if that means anything)

@BogTheMudWing
Copy link

@TeddySenpai I've reworked the script in this repository: Stonley890/mc-console-bot
Try using this one.

@Skywalker8510
Copy link

Skywalker8510 commented Dec 1, 2022

@Stonley890 or @Whitelisted1 is the code currently up to date because i tried it a few months back and couldn't get it to work

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment