From 8373c48de837ba39615f51ec275d23992a6f7488 Mon Sep 17 00:00:00 2001 From: Joey Eamigh <55670930+JoeyEamigh@users.noreply.github.com> Date: Wed, 21 Jun 2023 22:06:33 -0400 Subject: [PATCH] server start point --- server/server.py | 174 +++++++++++++++++++++++++++++++++++++++++++++++ server/server.sh | 22 ++++++ 2 files changed, 196 insertions(+) create mode 100644 server/server.py create mode 100644 server/server.sh diff --git a/server/server.py b/server/server.py new file mode 100644 index 0000000..8f9c5fb --- /dev/null +++ b/server/server.py @@ -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__() diff --git a/server/server.sh b/server/server.sh new file mode 100644 index 0000000..58e4e28 --- /dev/null +++ b/server/server.sh @@ -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