server start point
This commit is contained in:
174
server/server.py
Normal file
174
server/server.py
Normal file
@@ -0,0 +1,174 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import os, sys, shutil, requests, tempfile, glob, subprocess
|
||||
from termcolor import cprint
|
||||
from typing import Any
|
||||
|
||||
OS = sys.platform
|
||||
|
||||
MOD_DOWNLOADER_URL = "https://github.com/Joshyx/ModpackDownloader/releases/download/v1.3/ModpackDownloader-1.3.jar"
|
||||
FORGE_URL = (
|
||||
"https://maven.minecraftforge.net/net/minecraftforge/forge/1.16.5-36.2.34/forge-1.16.5-36.2.34-installer.jar"
|
||||
)
|
||||
MODPACK_RELEASES_URL = "https://git.233hfd.com/api/v1/repos/joey/FishPogPixelmon/releases?limit=1"
|
||||
|
||||
INSTANCE_DIR = os.path.join(str(os.getenv("HOME")), "pixelmon")
|
||||
|
||||
|
||||
# main
|
||||
def __main__():
|
||||
header()
|
||||
forge()
|
||||
needs_mods = instance()
|
||||
if needs_mods:
|
||||
mods()
|
||||
|
||||
|
||||
# forge
|
||||
def forge():
|
||||
os.chdir(INSTANCE_DIR)
|
||||
|
||||
if not os.path.exists(os.path.join(INSTANCE_DIR, "forge.jar")):
|
||||
cprint("forge.jar not found - downloading", "yellow")
|
||||
r = requests.get(FORGE_URL, allow_redirects=True)
|
||||
open("forge.jar", "wb").write(r.content)
|
||||
|
||||
cprint("installing forge", "green")
|
||||
|
||||
subprocess.run(["java", "-jar", "forge.jar", "--installServer"])
|
||||
|
||||
|
||||
# mods
|
||||
def mods():
|
||||
os.chdir(INSTANCE_DIR)
|
||||
|
||||
if not os.path.exists(os.path.join(INSTANCE_DIR, "downloader.zip")):
|
||||
cprint("downloader.jar not found - downloading", "yellow")
|
||||
r = requests.get(MOD_DOWNLOADER_URL, allow_redirects=True)
|
||||
open("downloader.jar", "wb").write(r.content)
|
||||
|
||||
cprint("downloading mods. this may take a while, please wait.", "green")
|
||||
|
||||
my_env = os.environ.copy()
|
||||
my_env["CURSEFORGE_API_KEY"] = "$2a$10$QbCxI6f4KxEs50QKwE2piu1t6oOA8ayOw27H9N/eaH3Sdp5NTWwvO"
|
||||
|
||||
os.makedirs(os.path.join(INSTANCE_DIR, "mods"))
|
||||
subprocess.run(["java", "-jar", "downloader.jar", ".", "mods"], env=my_env)
|
||||
|
||||
for file in glob.glob(os.path.join(INSTANCE_DIR, ".minecraft", "mods", "*")):
|
||||
os.remove(file)
|
||||
|
||||
for file in glob.glob(os.path.join(INSTANCE_DIR, "mods", "mods", "*")):
|
||||
shutil.move(file, os.path.join(INSTANCE_DIR, ".minecraft", "mods", os.path.basename(file)))
|
||||
|
||||
shutil.rmtree(os.path.join(INSTANCE_DIR, "mods"))
|
||||
|
||||
cprint("mods downloaded successfully", "green")
|
||||
|
||||
|
||||
# multimc
|
||||
def instance():
|
||||
unclean = False
|
||||
release = most_recent_release()
|
||||
|
||||
if not os.path.exists(INSTANCE_DIR):
|
||||
unclean = True
|
||||
cprint("instance not found - downloading", "yellow")
|
||||
download_instance(release)
|
||||
|
||||
version = ""
|
||||
if os.path.exists(f"{INSTANCE_DIR}/.version"):
|
||||
f = open(f"{INSTANCE_DIR}/.version", "r")
|
||||
version = f.read()
|
||||
|
||||
if version != release["tag_name"]:
|
||||
unclean = True
|
||||
cprint("new update available! - downloading", "green")
|
||||
download_instance(release)
|
||||
|
||||
cprint("instance is up to date", "green")
|
||||
return unclean
|
||||
|
||||
|
||||
def download_instance(release: dict[str, Any]):
|
||||
os.makedirs(os.path.join(INSTANCE_DIR, ".minecraft"), exist_ok=True)
|
||||
|
||||
TMP = tempfile.mkdtemp()
|
||||
os.chdir(TMP)
|
||||
|
||||
download_url = get_release_asset(release)
|
||||
r = requests.get(download_url, allow_redirects=True)
|
||||
open("instance.zip", "wb").write(r.content)
|
||||
shutil.unpack_archive("instance.zip", ".")
|
||||
os.remove("instance.zip")
|
||||
|
||||
for file in glob.glob(os.path.join(TMP, "overrides", "*")):
|
||||
if file == os.path.join(TMP, "overrides", "options.txt") and os.path.exists(
|
||||
os.path.join(INSTANCE_DIR, ".minecraft", "options.txt")
|
||||
):
|
||||
continue
|
||||
if os.path.exists(os.path.join(INSTANCE_DIR, ".minecraft", os.path.basename(file))):
|
||||
if os.path.isdir(os.path.join(INSTANCE_DIR, ".minecraft", os.path.basename(file))):
|
||||
shutil.rmtree(os.path.join(INSTANCE_DIR, ".minecraft", os.path.basename(file)))
|
||||
else:
|
||||
os.remove(os.path.join(INSTANCE_DIR, ".minecraft", os.path.basename(file)))
|
||||
shutil.move(file, os.path.join(INSTANCE_DIR, ".minecraft", os.path.basename(file)))
|
||||
|
||||
shutil.rmtree(os.path.join(TMP, "overrides"))
|
||||
|
||||
for file in glob.glob(os.path.join(TMP, "*")):
|
||||
if os.path.exists(os.path.join(INSTANCE_DIR, os.path.basename(file))):
|
||||
if os.path.isdir(os.path.join(INSTANCE_DIR, os.path.basename(file))):
|
||||
shutil.rmtree(os.path.join(INSTANCE_DIR, os.path.basename(file)))
|
||||
else:
|
||||
os.remove(os.path.join(INSTANCE_DIR, os.path.basename(file)))
|
||||
shutil.move(file, os.path.join(INSTANCE_DIR, os.path.basename(file)))
|
||||
|
||||
os.chdir(INSTANCE_DIR)
|
||||
|
||||
f = open(".version", "w")
|
||||
f.write(release["tag_name"])
|
||||
f.close()
|
||||
|
||||
|
||||
# releases
|
||||
def most_recent_release() -> dict[str, Any]:
|
||||
r = requests.get(MODPACK_RELEASES_URL)
|
||||
releases: list[dict[str, Any]] = r.json()
|
||||
return releases[0]
|
||||
|
||||
|
||||
def most_recent_version(release: dict[str, Any]) -> str:
|
||||
return release["tag_name"]
|
||||
|
||||
|
||||
def get_release_asset(release: dict[str, Any]):
|
||||
return release["assets"][0]["browser_download_url"]
|
||||
|
||||
|
||||
# ascii art lol
|
||||
def header():
|
||||
cprint(
|
||||
"""
|
||||
_______ __ __ _______
|
||||
| _ ||__|.-----.| |--.| _ |.-----..-----.
|
||||
|. 1___|| ||__ --|| ||. 1 || _ || _ |
|
||||
|. __) |__||_____||__|__||. ____||_____||___ |
|
||||
|: | |: | |_____|
|
||||
|::.| |::.|
|
||||
`---' `---'
|
||||
|
||||
_______ __ __
|
||||
| _ ||__|.--.--..-----.| |.--------..-----..-----.
|
||||
|. 1 || ||_ _|| -__|| || || _ || |
|
||||
|. ____||__||__.__||_____||__||__|__|__||_____||__|__|
|
||||
|: |
|
||||
|::.|
|
||||
`---'
|
||||
""",
|
||||
"green",
|
||||
)
|
||||
|
||||
|
||||
# run app
|
||||
__main__()
|
||||
22
server/server.sh
Normal file
22
server/server.sh
Normal file
@@ -0,0 +1,22 @@
|
||||
#!/bin/bash
|
||||
|
||||
# check that python is installed
|
||||
if ! [ -x "$(command -v python)" ]; then
|
||||
echo 'Error: python is not installed. Please install it to continue.' >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# check that java is installed
|
||||
if ! [ -x "$(command -v java)" ]; then
|
||||
echo 'Error: java is not installed. Please install it to continue.' >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! [ -d .venv ]; then python -m venv .venv; fi
|
||||
|
||||
source .venv/bin/activate &>/dev/null
|
||||
|
||||
python -m pip install --upgrade pip &>/dev/null
|
||||
python -m pip install -r ../client/requirements.txt &>/dev/null
|
||||
|
||||
python ./server.py
|
||||
Reference in New Issue
Block a user