diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f0699ec..b49acad8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## --- [4.3.3] - 2024/TBD ### Refactor - Refactor API keys "super user" to "full access" ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/731)) +- Refactor SBuilder to use Big Bucket Svc ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/755)) ### New features TBD ### Bug fixes diff --git a/app/classes/minecraft/bigbucket.py b/app/classes/minecraft/bigbucket.py new file mode 100644 index 00000000..591aa6d8 --- /dev/null +++ b/app/classes/minecraft/bigbucket.py @@ -0,0 +1,236 @@ +import os +import json +import threading +import time +import logging +from datetime import datetime +import requests + +from app.classes.controllers.servers_controller import ServersController +from app.classes.models.server_permissions import PermissionsServers +from app.classes.shared.file_helpers import FileHelpers +from app.classes.shared.websocket_manager import WebSocketManager + +logger = logging.getLogger(__name__) +# Temp type var until sjars restores generic fetchTypes0 + + +class BigBucket: + def __init__(self, helper): + self.helper = helper + # remove any trailing slash from config.json + # url since we add it on all the calls + self.base_url = str( + self.helper.get_setting("big_bucket_repo", "https://jars.arcadiatech.org") + ).rstrip("/") + + def _read_cache(self) -> dict: + cache_file = self.helper.big_bucket_cache + cache = {} + try: + with open(cache_file, "r", encoding="utf-8") as f: + cache = json.load(f) + + except Exception as e: + logger.error(f"Unable to read big_bucket cache file: {e}") + + return cache + + def get_bucket_data(self): + data = self._read_cache() + return data.get("categories") + + def _check_bucket_alive(self) -> bool: + logger.info("Checking Big Bucket status") + + check_url = f"{self.base_url}/healthcheck" + try: + response = requests.get(check_url, timeout=2) + response_json = response.json() + if ( + response.status_code in [200, 201] + and response_json.get("status") == "ok" + ): + logger.info("Big bucket is alive and responding as expected") + return True + except Exception as e: + logger.error(f"Unable to connect to big bucket due to error: {e}") + return False + + logger.error( + "Big bucket manifest is not available as expected or unable to contact" + ) + return False + + def _get_big_bucket(self) -> dict: + logger.debug("Calling for big bucket manifest.") + try: + response = requests.get(f"{self.base_url}/manifest.json", timeout=5) + if response.status_code in [200, 201]: + data = response.json() + del data["manifest_version"] + return data + return {} + except TimeoutError as e: + logger.error(f"Unable to get jars from remote with error {e}") + return {} + + def _refresh_cache(self): + """ + Contains the shared logic for refreshing the cache. + This method is called by both manual_refresh_cache and refresh_cache methods. + """ + if not self._check_bucket_alive(): + logger.error("big bucket API is not available.") + return False + + cache_data = { + "last_refreshed": datetime.now().strftime("%m/%d/%Y, %H:%M:%S"), + "categories": self._get_big_bucket(), + } + try: + with open( + self.helper.big_bucket_cache, "w", encoding="utf-8" + ) as cache_file: + json.dump(cache_data, cache_file, indent=4) + logger.info("Cache file successfully refreshed manually.") + except Exception as e: + logger.error(f"Failed to update cache file manually: {e}") + + def manual_refresh_cache(self): + """ + Manually triggers the cache refresh process. + """ + logger.info("Manual bucket cache refresh initiated.") + self._refresh_cache() + logger.info("Manual refresh completed.") + + def refresh_cache(self): + """ + Automatically trigger cache refresh process based age. + + This method checks if the cache file is older than a specified number of days + before deciding to refresh. + """ + cache_file_path = self.helper.big_bucket_cache + + # Determine if the cache is old and needs refreshing + cache_old = self.helper.is_file_older_than_x_days(cache_file_path) + + # debug override + # cache_old = True + + if not self._check_bucket_alive(): + logger.error("big bucket API is not available.") + return False + + if not cache_old: + logger.info("Cache file is not old enough to require automatic refresh.") + return False + + logger.info("Automatic cache refresh initiated due to old cache.") + self._refresh_cache() + + def get_fetch_url(self, jar, server, version) -> str: + """ + Constructs the URL for downloading a server JAR file based on the server type. + Parameters: + jar (str): The category of the JAR file to download. + server (str): Server software name (e.g., "paper"). + version (str): Server version. + + Returns: + str or None: URL for downloading the JAR file, or None if URL cannot be + constructed or an error occurs. + """ + try: + # Read cache file for URL that is in a list of one item + return self.get_bucket_data()[jar]["types"][server]["versions"][version][ + "url" + ][0] + except Exception as e: + logger.error(f"An error occurred while constructing fetch URL: {e}") + return None + + def download_jar(self, jar, server, version, path, server_id): + update_thread = threading.Thread( + name=f"server_download-{server_id}-{server}-{version}", + target=self.a_download_jar, + daemon=True, + args=(jar, server, version, path, server_id), + ) + update_thread.start() + + def a_download_jar(self, jar, server, version, path, server_id): + """ + Downloads a server JAR file and performs post-download actions including + notifying users and setting import status. + + This method waits for the server registration to complete, retrieves the + download URL for the specified server JAR file. + + Upon successful download, it either runs the installer for + Forge servers or simply finishes the import process for other types. It + notifies server users about the completion of the download. + + Parameters: + - jar (str): The category of the JAR file to download. + - server (str): The type of server software (e.g., 'forge', 'paper'). + - version (str): The version of the server software. + - path (str): The local filesystem path where the JAR file will be saved. + - server_id (str): The unique identifier for the server being updated or + imported, used for notifying users and setting the import status. + + Returns: + - bool: True if the JAR file was successfully downloaded and saved; + False otherwise. + + The method ensures that the server is properly registered before proceeding + with the download and handles exceptions by logging errors and reverting + the import status if necessary. + """ + # delaying download for server register to finish + time.sleep(3) + + fetch_url = self.get_fetch_url(jar, server, version) + if not fetch_url: + return False + + server_users = PermissionsServers.get_server_user_list(server_id) + + # Make sure the server is registered before updating its stats + while True: + try: + ServersController.set_import(server_id) + for user in server_users: + WebSocketManager().broadcast_user(user, "send_start_reload", {}) + break + except Exception as ex: + logger.debug(f"Server not registered yet. Delaying download - {ex}") + + # Initiate Download + jar_dir = os.path.dirname(path) + jar_name = os.path.basename(path) + logger.info(fetch_url) + success = FileHelpers.ssl_get_file(fetch_url, jar_dir, jar_name) + + # Post-download actions + if success: + if server == "forge-installer": + # If this is the newer Forge version, run the installer + ServersController.finish_import(server_id, True) + else: + ServersController.finish_import(server_id) + + # Notify users + for user in server_users: + WebSocketManager().broadcast_user( + user, "notification", "Executable download finished" + ) + time.sleep(3) # Delay for user notification + WebSocketManager().broadcast_user(user, "send_start_reload", {}) + else: + logger.error(f"Unable to save jar to {path} due to download failure.") + ServersController.finish_import(server_id) + + return success diff --git a/app/classes/minecraft/serverjars.py b/app/classes/minecraft/serverjars.py deleted file mode 100644 index 944ec382..00000000 --- a/app/classes/minecraft/serverjars.py +++ /dev/null @@ -1,395 +0,0 @@ -import os -import json -import threading -import time -import logging -from datetime import datetime -import requests - -from app.classes.controllers.servers_controller import ServersController -from app.classes.models.server_permissions import PermissionsServers -from app.classes.shared.file_helpers import FileHelpers -from app.classes.shared.websocket_manager import WebSocketManager - -logger = logging.getLogger(__name__) -# Temp type var until sjars restores generic fetchTypes0 -SERVERJARS_TYPES = ["modded", "proxies", "servers", "vanilla"] -PAPERJARS = ["paper", "folia"] - - -class ServerJars: - def __init__(self, helper): - self.helper = helper - self.base_url = "https://api.serverjars.com" - self.paper_base = "https://api.papermc.io" - - @staticmethod - def get_paper_jars(): - return PAPERJARS - - def get_paper_versions(self, project): - """ - Retrieves a list of versions for a specified project from the PaperMC API. - - Parameters: - project (str): The project name to query for available versions. - - Returns: - list: A list of version strings available for the project. Returns an empty - list if the API call fails or if no versions are found. - - This function makes a GET request to the PaperMC API to fetch available project - versions, The versions are returned in reverse order, with the most recent - version first. - """ - try: - response = requests.get( - f"{self.paper_base}/v2/projects/{project}/", timeout=2 - ) - response.raise_for_status() - api_data = response.json() - except Exception as e: - logger.error(f"Error loading project versions for {project}: {e}") - return [] - - versions = api_data.get("versions", []) - versions.reverse() # Ensure the most recent version comes first - return versions - - def get_paper_build(self, project, version): - """ - Fetches the latest build for a specified project and version from PaperMC API. - - Parameters: - project (str): Project name, typically a server software like 'paper'. - version (str): Project version to fetch the build number for. - - Returns: - int or None: Latest build number if successful, None if not or on error. - - This method attempts to query the PaperMC API for the latest build and - handles exceptions by logging errors and returning None. - """ - try: - response = requests.get( - f"{self.paper_base}/v2/projects/{project}/versions/{version}/builds/", - timeout=2, - ) - response.raise_for_status() - api_data = response.json() - except Exception as e: - logger.error(f"Error fetching build for {project} {version}: {e}") - return None - - builds = api_data.get("builds", []) - return builds[-1] if builds else None - - def _read_cache(self): - cache_file = self.helper.serverjar_cache - cache = {} - try: - with open(cache_file, "r", encoding="utf-8") as f: - cache = json.load(f) - - except Exception as e: - logger.error(f"Unable to read serverjars.com cache file: {e}") - - return cache - - def get_serverjar_data(self): - data = self._read_cache() - return data.get("types") - - def _check_sjars_api_alive(self): - logger.info("Checking serverjars.com API status") - - check_url = f"{self.base_url}" - try: - response = requests.get(check_url, timeout=2) - response_json = response.json() - - if ( - response.status_code in [200, 201] - and response_json.get("status") == "success" - and response_json.get("response", {}).get("status") == "ok" - ): - logger.info("Serverjars.com API is alive and responding as expected") - return True - except Exception as e: - logger.error(f"Unable to connect to serverjar.com API due to error: {e}") - return False - - logger.error( - "Serverjars.com API is not responding as expected or unable to contact" - ) - return False - - def _fetch_projects_for_type(self, server_type): - """ - Fetches projects for a given server type from the ServerJars API. - """ - try: - response = requests.get( - f"{self.base_url}/api/fetchTypes/{server_type}", timeout=5 - ) - response.raise_for_status() # Ensure HTTP errors are caught - data = response.json() - if data.get("status") == "success": - return data["response"].get("servers", []) - except requests.RequestException as e: - print(f"Error fetching projects for type {server_type}: {e}") - return [] - - def _get_server_type_list(self): - """ - Builds the type structure with projects fetched for each type. - """ - type_structure = {} - for server_type in SERVERJARS_TYPES: - projects = self._fetch_projects_for_type(server_type) - type_structure[server_type] = {project: [] for project in projects} - return type_structure - - def _get_jar_versions(self, server_type, project_name, max_ver=50): - """ - Grabs available versions for specified project - - Args: - server_type (str): Server Type Category (modded, servers, etc) - project_name (str): Target project (paper, forge, magma, etc) - max (int, optional): Max versions returned. Defaults to 50. - - Returns: - list: An array of versions - """ - url = f"{self.base_url}/api/fetchAll/{server_type}/{project_name}?max={max_ver}" - try: - response = requests.get(url, timeout=5) - response.raise_for_status() # Ensure HTTP errors are caught - data = response.json() - logger.debug(f"Received data for {server_type}/{project_name}: {data}") - - if data.get("status") == "success": - versions = [ - item.get("version") - for item in data.get("response", []) - if "version" in item - ] - versions.reverse() # Reverse so versions are newest -> oldest - logger.debug(f"Versions extracted: {versions}") - return versions - except requests.RequestException as e: - logger.error( - f"Error fetching jar versions for {server_type}/{project_name}: {e}" - ) - - return [] - - def _refresh_cache(self): - """ - Contains the shared logic for refreshing the cache. - This method is called by both manual_refresh_cache and refresh_cache methods. - """ - now = datetime.now() - cache_data = { - "last_refreshed": now.strftime("%m/%d/%Y, %H:%M:%S"), - "types": self._get_server_type_list(), - } - - for server_type, projects in cache_data["types"].items(): - for project_name in projects: - versions = self._get_jar_versions(server_type, project_name) - cache_data["types"][server_type][project_name] = versions - - for paper_project in PAPERJARS: - cache_data["types"]["servers"][paper_project] = self.get_paper_versions( - paper_project - ) - - return cache_data - - def manual_refresh_cache(self): - """ - Manually triggers the cache refresh process. - """ - if not self._check_sjars_api_alive(): - logger.error("ServerJars API is not available.") - return False - - logger.info("Manual cache refresh requested.") - cache_data = self._refresh_cache() - - # Save the updated cache data - try: - with open(self.helper.serverjar_cache, "w", encoding="utf-8") as cache_file: - json.dump(cache_data, cache_file, indent=4) - logger.info("Cache file successfully refreshed manually.") - except Exception as e: - logger.error(f"Failed to update cache file manually: {e}") - - def refresh_cache(self): - """ - Automatically trigger cache refresh process based age. - - This method checks if the cache file is older than a specified number of days - before deciding to refresh. - """ - cache_file_path = self.helper.serverjar_cache - - # Determine if the cache is old and needs refreshing - cache_old = self.helper.is_file_older_than_x_days(cache_file_path) - - # debug override - # cache_old = True - - if not self._check_sjars_api_alive(): - logger.error("ServerJars API is not available.") - return False - - if not cache_old: - logger.info("Cache file is not old enough to require automatic refresh.") - return False - - logger.info("Automatic cache refresh initiated due to old cache.") - cache_data = self._refresh_cache() - - # Save the updated cache data - try: - with open(cache_file_path, "w", encoding="utf-8") as cache_file: - json.dump(cache_data, cache_file, indent=4) - logger.info("Cache file successfully refreshed automatically.") - except Exception as e: - logger.error(f"Failed to update cache file automatically: {e}") - - def get_fetch_url(self, jar, server, version): - """ - Constructs the URL for downloading a server JAR file based on the server type. - - Supports two main types of server JAR sources: - - ServerJars API for servers not in PAPERJARS. - - Paper API for servers available through the Paper project. - - Parameters: - jar (str): Name of the JAR file. - server (str): Server software name (e.g., "paper"). - version (str): Server version. - - Returns: - str or None: URL for downloading the JAR file, or None if URL cannot be - constructed or an error occurs. - """ - try: - # Check if the server type is not specifically handled by Paper. - if server not in PAPERJARS: - return f"{self.base_url}/api/fetchJar/{jar}/{server}/{version}" - - # For Paper servers, attempt to get the build for the specified version. - paper_build_info = self.get_paper_build(server, version) - if paper_build_info is None: - # Log an error or handle the case where paper_build_info is None - logger.error( - "Error: Unable to get build information for server:" - f" {server}, version: {version}" - ) - return None - - build = paper_build_info.get("build") - if not build: - # Log an error or handle the case where build is None or not found - logger.error( - f"Error: Build number not found for server:" - f" {server}, version: {version}" - ) - return None - - # Construct and return the URL for downloading the Paper server JAR. - return ( - f"{self.paper_base}/v2/projects/{server}/versions/{version}/" - f"builds/{build}/downloads/{server}-{version}-{build}.jar" - ) - except Exception as e: - logger.error(f"An error occurred while constructing fetch URL: {e}") - return None - - def download_jar(self, jar, server, version, path, server_id): - update_thread = threading.Thread( - name=f"server_download-{server_id}-{server}-{version}", - target=self.a_download_jar, - daemon=True, - args=(jar, server, version, path, server_id), - ) - update_thread.start() - - def a_download_jar(self, jar, server, version, path, server_id): - """ - Downloads a server JAR file and performs post-download actions including - notifying users and setting import status. - - This method waits for the server registration to complete, retrieves the - download URL for the specified server JAR file. - - Upon successful download, it either runs the installer for - Forge servers or simply finishes the import process for other types. It - notifies server users about the completion of the download. - - Parameters: - - jar (str): The name of the JAR file to download. - - server (str): The type of server software (e.g., 'forge', 'paper'). - - version (str): The version of the server software. - - path (str): The local filesystem path where the JAR file will be saved. - - server_id (str): The unique identifier for the server being updated or - imported, used for notifying users and setting the import status. - - Returns: - - bool: True if the JAR file was successfully downloaded and saved; - False otherwise. - - The method ensures that the server is properly registered before proceeding - with the download and handles exceptions by logging errors and reverting - the import status if necessary. - """ - # delaying download for server register to finish - time.sleep(3) - - fetch_url = self.get_fetch_url(jar, server, version) - if not fetch_url: - return False - - server_users = PermissionsServers.get_server_user_list(server_id) - - # Make sure the server is registered before updating its stats - while True: - try: - ServersController.set_import(server_id) - for user in server_users: - WebSocketManager().broadcast_user(user, "send_start_reload", {}) - break - except Exception as ex: - logger.debug(f"Server not registered yet. Delaying download - {ex}") - - # Initiate Download - jar_dir = os.path.dirname(path) - jar_name = os.path.basename(path) - logger.info(fetch_url) - success = FileHelpers.ssl_get_file(fetch_url, jar_dir, jar_name) - - # Post-download actions - if success: - if server == "forge": - # If this is the newer Forge version, run the installer - ServersController.finish_import(server_id, True) - else: - ServersController.finish_import(server_id) - - # Notify users - for user in server_users: - WebSocketManager().broadcast_user( - user, "notification", "Executable download finished" - ) - time.sleep(3) # Delay for user notification - WebSocketManager().broadcast_user(user, "send_start_reload", {}) - else: - logger.error(f"Unable to save jar to {path} due to download failure.") - ServersController.finish_import(server_id) - - return success diff --git a/app/classes/shared/helpers.py b/app/classes/shared/helpers.py index 0427da11..55a588fc 100644 --- a/app/classes/shared/helpers.py +++ b/app/classes/shared/helpers.py @@ -72,7 +72,7 @@ class Helpers: self.db_path = os.path.join( self.root_dir, "app", "config", "db", "crafty.sqlite" ) - self.serverjar_cache = os.path.join(self.config_dir, "serverjars.json") + self.big_bucket_cache = os.path.join(self.config_dir, "bigbucket.json") self.credits_cache = os.path.join(self.config_dir, "credits.json") self.passhasher = PasswordHasher() self.exiting = False @@ -516,6 +516,7 @@ class Helpers: "monitored_mounts": mounts, "dir_size_poll_freq_minutes": 5, "crafty_logs_delete_after_days": 0, + "big_bucket_repo": "https://jars.arcadiatech.org", } def get_all_settings(self): diff --git a/app/classes/shared/main_controller.py b/app/classes/shared/main_controller.py index 9c3219ff..66feff91 100644 --- a/app/classes/shared/main_controller.py +++ b/app/classes/shared/main_controller.py @@ -32,7 +32,7 @@ from app.classes.shared.console import Console from app.classes.shared.helpers import Helpers from app.classes.shared.file_helpers import FileHelpers from app.classes.shared.import_helper import ImportHelpers -from app.classes.minecraft.serverjars import ServerJars +from app.classes.minecraft.bigbucket import BigBucket from app.classes.shared.websocket_manager import WebSocketManager logger = logging.getLogger(__name__) @@ -43,7 +43,7 @@ class Controller: self.helper: Helpers = helper self.file_helper: FileHelpers = file_helper self.import_helper: ImportHelpers = import_helper - self.server_jars: ServerJars = ServerJars(helper) + self.big_bucket: BigBucket = BigBucket(helper) self.users_helper: HelperUsers = HelperUsers(database, self.helper) self.roles_helper: HelperRoles = HelperRoles(database) self.servers_helper: HelperServers = HelperServers(database) @@ -436,7 +436,7 @@ class Controller: if root_create_data["create_type"] == "download_jar": if Helpers.is_os_windows(): # Let's check for and setup for install server commands - if create_data["type"] == "forge": + if create_data["type"] == "forge-installer": server_command = ( f"java -Xms{Helpers.float_to_string(min_mem)}M " f"-Xmx{Helpers.float_to_string(max_mem)}M " @@ -449,7 +449,7 @@ class Controller: f'-jar "{server_file}" nogui' ) else: - if create_data["type"] == "forge": + if create_data["type"] == "forge-installer": server_command = ( f"java -Xms{Helpers.float_to_string(min_mem)}M " f"-Xmx{Helpers.float_to_string(max_mem)}M " @@ -569,19 +569,16 @@ class Controller: if data["create_type"] == "minecraft_java": if root_create_data["create_type"] == "download_jar": # modded update urls from server jars will only update the installer - if ( - create_data["category"] != "modded" - and create_data["type"] not in ServerJars.get_paper_jars() - ): + if create_data["type"] != "forge-installer": server_obj = self.servers.get_server_obj(new_server_id) - url = ( - "https://api.serverjars.com/api/fetchJar/" - f"{create_data['category']}" - f"/{create_data['type']}/{create_data['version']}" + url = self.big_bucket.get_fetch_url( + create_data["category"], + create_data["type"], + create_data["version"], ) server_obj.executable_update_url = url self.servers.update_server(server_obj) - self.server_jars.download_jar( + self.big_bucket.download_jar( create_data["category"], create_data["type"], create_data["version"], diff --git a/app/classes/shared/server.py b/app/classes/shared/server.py index a31cc891..a6c98b89 100644 --- a/app/classes/shared/server.py +++ b/app/classes/shared/server.py @@ -690,7 +690,8 @@ class ServerInstance: try: # Getting the forge version from the executable command version = re.findall( - r"forge-([0-9\.]+)((?:)|(?:-([0-9\.]+)-[a-zA-Z]+)).jar", + r"forge-installer-([0-9\.]+)((?:)|" + r"(?:-([0-9\.]+)-[a-zA-Z]+)).jar", server_obj.execution_command, ) version_param = version[0][0].split(".") diff --git a/app/classes/shared/tasks.py b/app/classes/shared/tasks.py index d1b786b9..b9513441 100644 --- a/app/classes/shared/tasks.py +++ b/app/classes/shared/tasks.py @@ -685,16 +685,16 @@ class TasksManager: id="stats", ) - def serverjar_cache_refresher(self): - logger.info("Refreshing serverjars.com cache on start") - self.controller.server_jars.refresh_cache() + def big_bucket_cache_refresher(self): + logger.info("Refreshing big bucket cache on start") + self.controller.big_bucket.refresh_cache() - logger.info("Scheduling Serverjars.com cache refresh service every 12 hours") + logger.info("Scheduling big bucket cache refresh service every 12 hours") self.scheduler.add_job( - self.controller.server_jars.refresh_cache, + self.controller.big_bucket.refresh_cache, "interval", hours=12, - id="serverjars", + id="big_bucket", ) def realtime(self): diff --git a/app/classes/web/routes/api/crafty/config/index.py b/app/classes/web/routes/api/crafty/config/index.py index 40504d76..0c2f196c 100644 --- a/app/classes/web/routes/api/crafty/config/index.py +++ b/app/classes/web/routes/api/crafty/config/index.py @@ -31,6 +31,7 @@ config_json_schema = { "monitored_mounts": {"type": "array"}, "dir_size_poll_freq_minutes": {"type": "integer"}, "crafty_logs_delete_after_days": {"type": "integer"}, + "big_bucket_repo": {"type": "string"}, }, "additionalProperties": False, "minProperties": 1, diff --git a/app/classes/web/routes/api/crafty/exe_cache.py b/app/classes/web/routes/api/crafty/exe_cache.py index 8836aef8..93162279 100644 --- a/app/classes/web/routes/api/crafty/exe_cache.py +++ b/app/classes/web/routes/api/crafty/exe_cache.py @@ -17,11 +17,11 @@ class ApiCraftyJarCacheIndexHandler(BaseApiHandler): if not auth_data[4]["superuser"]: return self.finish_json(400, {"status": "error", "error": "NOT_AUTHORIZED"}) - self.controller.server_jars.manual_refresh_cache() + self.controller.big_bucket.manual_refresh_cache() self.finish_json( 200, { "status": "ok", - "data": self.controller.server_jars.get_serverjar_data(), + "data": self.controller.big_bucket.get_bucket_data(), }, ) diff --git a/app/classes/web/routes/api/servers/index.py b/app/classes/web/routes/api/servers/index.py index 3c14f604..ea632c68 100644 --- a/app/classes/web/routes/api/servers/index.py +++ b/app/classes/web/routes/api/servers/index.py @@ -139,7 +139,7 @@ new_server_schema = { "category": { "title": "Jar Category", "type": "string", - "examples": ["modded", "vanilla"], + "examples": ["Mc_java_servers", "Mc_java_proxies"], }, "properties": { "type": { diff --git a/app/classes/web/server_handler.py b/app/classes/web/server_handler.py index 11853a47..a8e278b2 100644 --- a/app/classes/web/server_handler.py +++ b/app/classes/web/server_handler.py @@ -146,12 +146,12 @@ class ServerHandler(BaseHandler): return page_data["server_api"] = False if page_data["online"]: - page_data["server_api"] = self.helper.check_address_status( - "https://api.serverjars.com" + page_data["server_api"] = ( + self.controller.big_bucket._check_bucket_alive() ) - page_data["server_types"] = self.controller.server_jars.get_serverjar_data() + page_data["server_types"] = self.controller.big_bucket.get_bucket_data() page_data["js_server_types"] = json.dumps( - self.controller.server_jars.get_serverjar_data() + self.controller.big_bucket.get_bucket_data() ) if page_data["server_types"] is None: page_data["server_types"] = [] diff --git a/app/frontend/static/assets/images/serverjars/FULL-WHITE.svg b/app/frontend/static/assets/images/serverjars/FULL-WHITE.svg deleted file mode 100644 index d5036723..00000000 --- a/app/frontend/static/assets/images/serverjars/FULL-WHITE.svg +++ /dev/null @@ -1,120 +0,0 @@ - - - diff --git a/app/frontend/static/assets/images/serverjars/ICON.svg b/app/frontend/static/assets/images/serverjars/ICON.svg deleted file mode 100644 index 2adc4cff..00000000 --- a/app/frontend/static/assets/images/serverjars/ICON.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/app/frontend/templates/panel/loading.html b/app/frontend/templates/panel/loading.html index a56a75ee..15396071 100644 --- a/app/frontend/templates/panel/loading.html +++ b/app/frontend/templates/panel/loading.html @@ -20,7 +20,8 @@ data-internet="{{ translate('startup', 'internet', data['lang']) }}" data-tasks="{{ translate('startup', 'tasks', data['lang']) }}" data-internals="{{ translate('startup', 'internals', data['lang']) }}" - data-almost="{{ translate('startup', 'almost', data['lang']) }}"> + data-almost="{{ translate('startup', 'almost', data['lang']) }}" + data-cache="{{ translate('startup', 'cache', data['lang'])}}"> {{ translate('startup', 'starting', data['lang']) }} @@ -70,4 +71,4 @@ }); -{% end %} +{% end %} \ No newline at end of file diff --git a/app/frontend/templates/server/wizard.html b/app/frontend/templates/server/wizard.html index d6d64da3..fd079343 100644 --- a/app/frontend/templates/server/wizard.html +++ b/app/frontend/templates/server/wizard.html @@ -20,11 +20,6 @@
{{ - translate('error', 'serverJars1', data['lang']) }} {{ translate('error', + translate('error', 'bigBucket1', data['lang']) }} {{ + translate('error', 'craftyStatus', data['lang']) }} - {{ translate('error', 'serverJars2', data['lang']) }}
+ {{ translate('error', 'bigBucket2', data['lang']) }}{{ translate('error', 'selfHost', + data['lang'])}}Please wait while we gather your files...
', closeButton: false }); - setTimeout(function(){ + setTimeout(function () { getDirView(); }, 2000); } else { @@ -845,9 +846,9 @@ message: 'Please wait while we gather your files...
', closeButton: false }); - setTimeout(function(){ - getDirView(); - }, 2000); + setTimeout(function () { + getDirView(); + }, 2000); }); var upload = false; var file; @@ -1137,7 +1138,7 @@ function wait_msg(importing) { bootbox.alert({ title: importing ? '{% raw translate("serverWizard", "importing", data["lang"]) %}' : '{% raw translate("serverWizard", "downloading", data["lang"]) %}', - message: importing ? ' {% raw translate("serverWizard", "bePatient", data["lang"]) %}' : ' {% raw translate("serverWizard", "bePatient", data["lang"]) %}