Initial commit
This commit is contained in:
commit
933a5a06c9
17
README.md
Normal file
17
README.md
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
# Minecraft server automatic startup and shutdown
|
||||||
|
|
||||||
|
Install the .php file on a webserver and configure the variables as desired.
|
||||||
|
|
||||||
|
Place the remaining files on a server with CRON (could be the same server, just
|
||||||
|
not inside the web folder) and run the shell script every 5 minutes:
|
||||||
|
|
||||||
|
`*/5 * * * * * /your/path/here/minecraftautoshutdown.sh`
|
||||||
|
|
||||||
|
Ensure the same password is present in the php script and the shutdown script.
|
||||||
|
|
||||||
|
Call the php script via HTTP using the correct password when players want to play:
|
||||||
|
|
||||||
|
`curl http://your.webserver.here/minecraft.php?action=on&password=your_password_here`
|
||||||
|
|
||||||
|
If the CRON job runs properly and has all the right variables/permissions/dependencies,
|
||||||
|
it will shut down the DO droplet about 30-40 minutes after no players are detected in the game.
|
25
mineautoshutdown.sh
Executable file
25
mineautoshutdown.sh
Executable file
|
@ -0,0 +1,25 @@
|
||||||
|
DO_STATUS_URL="http://example.com/minecraft.php"
|
||||||
|
status=$(curl -s "$DO_STATUS_URL?action=status")
|
||||||
|
|
||||||
|
if [[ $status == "active" ]]; then
|
||||||
|
players=$(python3 minestatus.py | jq ".players")
|
||||||
|
|
||||||
|
if [[ $players == 0 ]]; then
|
||||||
|
|
||||||
|
count=$(cat /tmp/minecount)
|
||||||
|
|
||||||
|
if [[ $count -gt 6 ]]; then
|
||||||
|
echo "players $players count $count, killing"
|
||||||
|
curl -s "$DO_STATUS_URL?action=off"
|
||||||
|
echo "0" > /tmp/minecount
|
||||||
|
else
|
||||||
|
echo $(($count+1)) > /tmp/minecount
|
||||||
|
echo "players $players count $count, waiting"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "players $players, resetting"
|
||||||
|
echo "0" > /tmp/minecount
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "not active"
|
||||||
|
fi
|
47
minecraft.php
Normal file
47
minecraft.php
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$DIGITALOCEAN_TOKEN="dop_your_digitalocean_token_here";
|
||||||
|
$DROPLET_ID="your_droplet_id_here";
|
||||||
|
$PASSWORD="your_password_here";
|
||||||
|
|
||||||
|
if ($_GET['password'] !== $PASSWORD) {
|
||||||
|
usleep(rand(0,999999));
|
||||||
|
exit("Invalid password.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($_GET['action'] == "on") {
|
||||||
|
|
||||||
|
$out = `curl -X POST \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "Authorization: Bearer $DIGITALOCEAN_TOKEN" \
|
||||||
|
-d '{"type":"power_on"}' \
|
||||||
|
"https://api.digitalocean.com/v2/droplets/$DROPLET_ID/actions"`;
|
||||||
|
|
||||||
|
} elseif ($_GET['action'] == "off") {
|
||||||
|
|
||||||
|
$out = `curl -X POST \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "Authorization: Bearer $DIGITALOCEAN_TOKEN" \
|
||||||
|
-d '{"type":"power_off"}' \
|
||||||
|
"https://api.digitalocean.com/v2/droplets/$DROPLET_ID/actions"`;
|
||||||
|
|
||||||
|
} elseif ($_GET['action'] == "status") {
|
||||||
|
|
||||||
|
$out = `curl -X GET \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "Authorization: Bearer $DIGITALOCEAN_TOKEN" \
|
||||||
|
"https://api.digitalocean.com/v2/droplets/$DROPLET_ID"`;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
echo "Invalid action.";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$json = json_decode($out, true);
|
||||||
|
|
||||||
|
if ($json['action']) {
|
||||||
|
echo $json['action']['status'];
|
||||||
|
} elseif ($json['droplet']) {
|
||||||
|
echo $json['droplet']['status'];
|
||||||
|
}
|
24
minestatus.py
Normal file
24
minestatus.py
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
from mcstatus import JavaServer
|
||||||
|
import json
|
||||||
|
|
||||||
|
# You can pass the same address you'd enter into the address field in minecraft into the 'lookup' function
|
||||||
|
# If you know the host and port, you may skip this and use JavaServer("example.org", 1234)
|
||||||
|
server = JavaServer.lookup("your.minecraft.server.hostname.here")
|
||||||
|
|
||||||
|
# 'status' is supported by all Minecraft servers that are version 1.7 or higher.
|
||||||
|
# Don't expect the player list to always be complete, because many servers run
|
||||||
|
# plugins that hide this information or limit the number of players returned or even
|
||||||
|
# alter this list to contain fake players for purposes of having a custom message here.
|
||||||
|
status = server.status()
|
||||||
|
print(json.dumps({'players': status.players.online, 'ms': status.latency}))
|
||||||
|
#print(f"{{""players"": {status.players.online}, ""ms"": {status.latency} }}")
|
||||||
|
|
||||||
|
# 'ping' is supported by all Minecraft servers that are version 1.7 or higher.
|
||||||
|
# It is included in a 'status' call, but is also exposed separate if you do not require the additional info.
|
||||||
|
#latency = server.ping()
|
||||||
|
#print(f"The server replied in {latency} ms")
|
||||||
|
|
||||||
|
# 'query' has to be enabled in a server's server.properties file!
|
||||||
|
# It may give more information than a ping, such as a full player list or mod information.
|
||||||
|
#query = server.query()
|
||||||
|
#print(f"The server has the following players online: {', '.join(query.players.names)}")
|
Loading…
Reference in New Issue
Block a user