From a67f53a4c96243fe1055c9b86b371445538d2f93 Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 28 Dec 2023 18:34:35 -0500 Subject: [PATCH 01/16] Fix bukkit and downstream fork MOTD crash --- app/classes/minecraft/mc_ping.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/classes/minecraft/mc_ping.py b/app/classes/minecraft/mc_ping.py index c5cb9916..84b69505 100644 --- a/app/classes/minecraft/mc_ping.py +++ b/app/classes/minecraft/mc_ping.py @@ -34,8 +34,13 @@ class Server: lines = [] description = self.description + if "text" in description.keys(): + lines.append(description["text"]) if "extra" in description.keys(): for e in description["extra"]: + if not isinstance(e, dict): + lines.append(e) + continue # Conversion format code needed only for Java Version lines.append(get_code_format("reset")) if "bold" in e.keys(): From 60ac3bf630fa9efe252e2a9d5390637089b7caf5 Mon Sep 17 00:00:00 2001 From: Andrew Date: Fri, 29 Dec 2023 12:11:29 -0500 Subject: [PATCH 02/16] Check type in extra so we don't iterate thru str --- app/classes/minecraft/mc_ping.py | 41 +++++++++++++++----------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/app/classes/minecraft/mc_ping.py b/app/classes/minecraft/mc_ping.py index 84b69505..72a91351 100644 --- a/app/classes/minecraft/mc_ping.py +++ b/app/classes/minecraft/mc_ping.py @@ -12,6 +12,7 @@ from app.classes.minecraft.bedrock_ping import BedrockPing from app.classes.shared.console import Console logger = logging.getLogger(__name__) +MOTD_CODES = ["bold", "italic", "underlined", "strikethrough"] class Server: @@ -37,28 +38,24 @@ class Server: if "text" in description.keys(): lines.append(description["text"]) if "extra" in description.keys(): - for e in description["extra"]: - if not isinstance(e, dict): - lines.append(e) - continue - # Conversion format code needed only for Java Version - lines.append(get_code_format("reset")) - if "bold" in e.keys(): - lines.append(get_code_format("bold")) - if "italic" in e.keys(): - lines.append(get_code_format("italic")) - if "underlined" in e.keys(): - lines.append(get_code_format("underlined")) - if "strikethrough" in e.keys(): - lines.append(get_code_format("strikethrough")) - if "color" in e.keys(): - lines.append(get_code_format(e["color"])) - # Then append the text - if "text" in e.keys(): - if e["text"] == "\n": - lines.append("§§") - else: - lines.append(e["text"]) + if isinstance(description["extra"], list): + for e in description["extra"]: + if not isinstance(e, dict): + lines.append(e) + continue + # Conversion format code needed only for Java Version + lines.append(get_code_format("reset")) + for item in MOTD_CODES: + if e.get(item, False): + lines.append(get_code_format(item)) + if "color" in e.keys(): + lines.append(get_code_format(e["color"])) + # Then append the text + if "text" in e.keys(): + if e["text"] == "\n": + lines.append("§§") + else: + lines.append(e["text"]) total_text = " ".join(lines) self.description = total_text From dc09f478715a58a5fda01652ccc29f320ee737c4 Mon Sep 17 00:00:00 2001 From: Silversthorn Date: Wed, 3 Jan 2024 21:10:33 +0100 Subject: [PATCH 03/16] Fixing issues for forge installation for versions >= 1.20 --- app/classes/shared/server.py | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/app/classes/shared/server.py b/app/classes/shared/server.py index 8448f656..035824c5 100644 --- a/app/classes/shared/server.py +++ b/app/classes/shared/server.py @@ -725,8 +725,9 @@ class ServerInstance: server_obj.execution_command = execution_command Console.debug("SUCCESS! Forge install completed") - else: - # NEW VERSION >= 1.17 + elif version_major <= 1 and version_minor < 20: + # NEW VERSION >= 1.17 and <= 1.20 + # (no jar file in server dir, only run.bat and run.sh) run_file_path = "" if self.helper.is_os_windows(): @@ -771,6 +772,37 @@ class ServerInstance: ) server_obj.execution_command = execution_command Console.debug("SUCCESS! Forge install completed") + else: + # NEW VERSION >= 1.20 + # (executable jar is back in server dir) + + # Retrieving the executable jar filename + file_path = glob.glob( + f"{server_obj.path}/forge-{version[0][0]}*.jar" + )[0] + file_name = re.findall( + r"(forge-[\-0-9.]+-shim.jar)", + file_path, + )[0] + + # Let's set the proper server executable + server_obj.executable = os.path.join(file_name) + + # Get memory values + memory_values = re.findall( + r"-Xms([A-Z0-9\.]+) -Xmx([A-Z0-9\.]+)", + server_obj.execution_command, + ) + + # Now lets set up the new run command. + # This is based off the run.sh/bat that + # Forge uses in 1.17 and < + execution_command = ( + f"java -Xms{memory_values[0][0]} -Xmx{memory_values[0][1]}" + f' -jar "{file_name}" nogui' + ) + server_obj.execution_command = execution_command + Console.debug("SUCCESS! Forge install completed") except: logger.debug("Could not find run file.") # TODO Use regex to get version and rebuild simple execution From e274b0c67767bb4ec65a10e4cb17ae7fc7586f41 Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Thu, 11 Jan 2024 19:20:50 -0500 Subject: [PATCH 04/16] Implement paper builds using mineacademy API Big shoutout to zed for fnding this --- app/classes/minecraft/serverjars.py | 30 ++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/app/classes/minecraft/serverjars.py b/app/classes/minecraft/serverjars.py index 447cf80b..55e98a80 100644 --- a/app/classes/minecraft/serverjars.py +++ b/app/classes/minecraft/serverjars.py @@ -11,12 +11,14 @@ from app.classes.models.server_permissions import PermissionsServers from app.classes.shared.websocket_manager import WebSocketManager logger = logging.getLogger(__name__) +MINEACADEMYJARS = ["paper", "folia"] class ServerJars: def __init__(self, helper): self.helper = helper self.base_url = "https://serverjars.com" + self.academy = "https://mineacademy.org" def _get_api_result(self, call_url: str): full_url = f"{self.base_url}{call_url}" @@ -38,6 +40,23 @@ class ServerJars: return api_response + def get_paper_versions(self, project): + try: + response = requests.get( + f"https://api.papermc.io/v2/projects/{project}/", timeout=2 + ) + response.raise_for_status() + api_data = json.loads(response.content) + except Exception as e: + logger.error( + f"Unable to load https://api.papermc.io/v2/projects/{project}/" + f"api due to error: {e}" + ) + return {} + versions = api_data.get("versions", []) + versions.reverse() + return versions + def _read_cache(self): cache_file = self.helper.serverjar_cache cache = {} @@ -95,6 +114,8 @@ class ServerJars: for j in data["types"].get(s): versions = self._get_jar_details(j, s) data["types"][s].update({j: versions}) + for item in MINEACADEMYJARS: + data["types"]["servers"][item] = self.get_paper_versions(item) # save our cache try: with open(cache_file, "w", encoding="utf-8") as f: @@ -133,6 +154,8 @@ class ServerJars: for j in data["types"].get(s): versions = self._get_jar_details(j, s) data["types"][s].update({j: versions}) + for item in MINEACADEMYJARS: + data["types"]["servers"][item] = self.get_paper_versions() # save our cache try: with open(cache_file, "w", encoding="utf-8") as f: @@ -171,7 +194,12 @@ class ServerJars: def a_download_jar(self, jar, server, version, path, server_id): # delaying download for server register to finish time.sleep(3) - fetch_url = f"{self.base_url}/api/fetchJar/{jar}/{server}/{version}" + if server not in MINEACADEMYJARS: + fetch_url = f"{self.base_url}/api/fetchJar/{jar}/{server}/{version}" + else: + fetch_url = ( + f"https://mineacademy.org/api/{server}/{str(version).replace('.', '_')}" + ) server_users = PermissionsServers.get_server_user_list(server_id) # We need to make sure the server is registered before From cd3b8d4d9cdc8ad11173f7b163ddd9e4ee86c350 Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Thu, 11 Jan 2024 19:35:08 -0500 Subject: [PATCH 05/16] Fix update urls --- app/classes/minecraft/serverjars.py | 4 ++++ app/classes/shared/main_controller.py | 15 +++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/app/classes/minecraft/serverjars.py b/app/classes/minecraft/serverjars.py index 55e98a80..5c6d6d91 100644 --- a/app/classes/minecraft/serverjars.py +++ b/app/classes/minecraft/serverjars.py @@ -20,6 +20,10 @@ class ServerJars: self.base_url = "https://serverjars.com" self.academy = "https://mineacademy.org" + @staticmethod + def get_mineacademy_jars(): + return MINEACADEMYJARS + def _get_api_result(self, call_url: str): full_url = f"{self.base_url}{call_url}" diff --git a/app/classes/shared/main_controller.py b/app/classes/shared/main_controller.py index ae58d988..60f3c5df 100644 --- a/app/classes/shared/main_controller.py +++ b/app/classes/shared/main_controller.py @@ -538,10 +538,17 @@ class Controller: # modded update urls from server jars will only update the installer if create_data["category"] != "modded": server_obj = self.servers.get_server_obj(new_server_id) - url = ( - f"https://serverjars.com/api/fetchJar/{create_data['category']}" - f"/{create_data['type']}/{create_data['version']}" - ) + if create_data["type"] not in ServerJars.get_mineacademy_jars(): + url = ( + "https://serverjars.com/api/fetchJar/" + f"{create_data['category']}" + f"/{create_data['type']}/{create_data['version']}" + ) + else: + url = ( + "https://mineacademy.org/api/" + f"{create_data['type']}/{create_data['version']}" + ) server_obj.executable_update_url = url self.servers.update_server(server_obj) self.server_jars.download_jar( From 5f2236563baf2af1c76ae4807583f14eb395f5d3 Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Thu, 11 Jan 2024 19:53:22 -0500 Subject: [PATCH 06/16] Fix bug where invalid server Id leads to stack --- app/classes/controllers/servers_controller.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/classes/controllers/servers_controller.py b/app/classes/controllers/servers_controller.py index 88923194..86e17802 100644 --- a/app/classes/controllers/servers_controller.py +++ b/app/classes/controllers/servers_controller.py @@ -462,7 +462,10 @@ class ServersController(metaclass=Singleton): @staticmethod def server_id_exists(server_id): - srv = ServersController().get_server_instance_by_id(server_id) + try: + srv = ServersController().get_server_instance_by_id(server_id) + except ValueError: + return False return srv.stats_helper.server_id_exists() @staticmethod From 96d5ce58d2e2d675a237c9adfc0dd0620c2c13f9 Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Fri, 12 Jan 2024 11:23:35 -0500 Subject: [PATCH 07/16] Get jars direct frrom paper --- app/classes/minecraft/serverjars.py | 40 +++++++++++++++++++++------ app/classes/shared/main_controller.py | 2 +- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/app/classes/minecraft/serverjars.py b/app/classes/minecraft/serverjars.py index 5c6d6d91..cadcb376 100644 --- a/app/classes/minecraft/serverjars.py +++ b/app/classes/minecraft/serverjars.py @@ -11,18 +11,18 @@ from app.classes.models.server_permissions import PermissionsServers from app.classes.shared.websocket_manager import WebSocketManager logger = logging.getLogger(__name__) -MINEACADEMYJARS = ["paper", "folia"] +PAPERJARS = ["paper", "folia"] class ServerJars: def __init__(self, helper): self.helper = helper self.base_url = "https://serverjars.com" - self.academy = "https://mineacademy.org" + self.paper_base = "https://api.papermc.io" @staticmethod - def get_mineacademy_jars(): - return MINEACADEMYJARS + def get_paper_jars(): + return PAPERJARS def _get_api_result(self, call_url: str): full_url = f"{self.base_url}{call_url}" @@ -47,7 +47,7 @@ class ServerJars: def get_paper_versions(self, project): try: response = requests.get( - f"https://api.papermc.io/v2/projects/{project}/", timeout=2 + f"{self.paper_base}/v2/projects/{project}/", timeout=2 ) response.raise_for_status() api_data = json.loads(response.content) @@ -61,6 +61,23 @@ class ServerJars: versions.reverse() return versions + def get_paper_build(self, project, version): + try: + response = requests.get( + f"{self.paper_base}/v2/projects/{project}/versions/{version}/builds/", + timeout=2, + ) + response.raise_for_status() + api_data = json.loads(response.content) + except Exception as e: + logger.error( + f"Unable to load https://api.papermc.io/v2/projects/{project}/" + f"api due to error: {e}" + ) + return {} + build = api_data.get("builds", [])[-1] + return build + def _read_cache(self): cache_file = self.helper.serverjar_cache cache = {} @@ -118,7 +135,7 @@ class ServerJars: for j in data["types"].get(s): versions = self._get_jar_details(j, s) data["types"][s].update({j: versions}) - for item in MINEACADEMYJARS: + for item in PAPERJARS: data["types"]["servers"][item] = self.get_paper_versions(item) # save our cache try: @@ -158,7 +175,7 @@ class ServerJars: for j in data["types"].get(s): versions = self._get_jar_details(j, s) data["types"][s].update({j: versions}) - for item in MINEACADEMYJARS: + for item in PAPERJARS: data["types"]["servers"][item] = self.get_paper_versions() # save our cache try: @@ -198,11 +215,16 @@ class ServerJars: def a_download_jar(self, jar, server, version, path, server_id): # delaying download for server register to finish time.sleep(3) - if server not in MINEACADEMYJARS: + if server not in PAPERJARS: fetch_url = f"{self.base_url}/api/fetchJar/{jar}/{server}/{version}" else: + build = self.get_paper_build(server, version).get("build", None) + if not build: + return fetch_url = ( - f"https://mineacademy.org/api/{server}/{str(version).replace('.', '_')}" + f"{self.paper_base}/v2/projects" + f"/{server}/versions/{version}/builds/{build}/downloads/" + f"{server}-{version}-{build}.jar" ) server_users = PermissionsServers.get_server_user_list(server_id) diff --git a/app/classes/shared/main_controller.py b/app/classes/shared/main_controller.py index 60f3c5df..ffc355ea 100644 --- a/app/classes/shared/main_controller.py +++ b/app/classes/shared/main_controller.py @@ -538,7 +538,7 @@ class Controller: # modded update urls from server jars will only update the installer if create_data["category"] != "modded": server_obj = self.servers.get_server_obj(new_server_id) - if create_data["type"] not in ServerJars.get_mineacademy_jars(): + if create_data["type"] not in ServerJars.get_paper_jars(): url = ( "https://serverjars.com/api/fetchJar/" f"{create_data['category']}" From e3dee7dcd6ac144f14041763224dbda2deb9bc13 Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Fri, 12 Jan 2024 13:43:04 -0500 Subject: [PATCH 08/16] Fix indent on checkbox on server config --- app/frontend/templates/panel/server_config.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/frontend/templates/panel/server_config.html b/app/frontend/templates/panel/server_config.html index 46f7b4dc..137dc847 100644 --- a/app/frontend/templates/panel/server_config.html +++ b/app/frontend/templates/panel/server_config.html @@ -195,7 +195,7 @@ {% else %} -    + {% end %} {% end %} From 78b2feab01c8dd997e9c6bd9558a55964b9740f7 Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Fri, 12 Jan 2024 14:46:25 -0500 Subject: [PATCH 09/16] Remove update url for paper builds --- app/classes/shared/main_controller.py | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/app/classes/shared/main_controller.py b/app/classes/shared/main_controller.py index ffc355ea..216c13e9 100644 --- a/app/classes/shared/main_controller.py +++ b/app/classes/shared/main_controller.py @@ -536,19 +536,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": + if ( + create_data["category"] != "modded" + and create_data["type"] not in ServerJars.get_paper_jars() + ): server_obj = self.servers.get_server_obj(new_server_id) - if create_data["type"] not in ServerJars.get_paper_jars(): - url = ( - "https://serverjars.com/api/fetchJar/" - f"{create_data['category']}" - f"/{create_data['type']}/{create_data['version']}" - ) - else: - url = ( - "https://mineacademy.org/api/" - f"{create_data['type']}/{create_data['version']}" - ) + url = ( + "https://serverjars.com/api/fetchJar/" + f"{create_data['category']}" + f"/{create_data['type']}/{create_data['version']}" + ) server_obj.executable_update_url = url self.servers.update_server(server_obj) self.server_jars.download_jar( From c43749cc7cb5c8555fd33274192c259a375d58d1 Mon Sep 17 00:00:00 2001 From: Zedifus Date: Tue, 16 Jan 2024 17:53:21 +0000 Subject: [PATCH 10/16] Update changelog !686 --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 71b8b4b6..a2c3c9e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ### New features TBD ### Bug fixes -TBD +- Fix bukkit and downstream fork MOTD crash ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/686)) ### Tweaks TBD ### Lang From b76636ed994accfba69b0e4fffd8650417b090ee Mon Sep 17 00:00:00 2001 From: Zedifus Date: Tue, 16 Jan 2024 18:04:59 +0000 Subject: [PATCH 11/16] Update changelog !687 --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a2c3c9e5..6e94d0db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ TBD ### Bug fixes - Fix bukkit and downstream fork MOTD crash ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/686)) ### Tweaks -TBD +- Refactor Forge server initialisation flow for newer versions ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/687)) ### Lang TBD

From 09c2917e27a644e07c01add8d527df81c365596e Mon Sep 17 00:00:00 2001 From: Zedifus Date: Tue, 16 Jan 2024 18:26:17 +0000 Subject: [PATCH 12/16] Update changelog !688 --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e94d0db..c2432de2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # Changelog ## --- [4.2.3] - 2023/TBD ### New features -TBD +- Use Papermc Group's API for `paper` & `folia` builds in server builder ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/688)) ### Bug fixes - Fix bukkit and downstream fork MOTD crash ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/686)) ### Tweaks From 7d7ae02bebd5ea5de76e2aac8a7b05b503537c7e Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Tue, 16 Jan 2024 13:50:05 -0500 Subject: [PATCH 13/16] Add parameter to version call --- app/classes/minecraft/serverjars.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/classes/minecraft/serverjars.py b/app/classes/minecraft/serverjars.py index cadcb376..29675e8d 100644 --- a/app/classes/minecraft/serverjars.py +++ b/app/classes/minecraft/serverjars.py @@ -176,7 +176,7 @@ class ServerJars: versions = self._get_jar_details(j, s) data["types"][s].update({j: versions}) for item in PAPERJARS: - data["types"]["servers"][item] = self.get_paper_versions() + data["types"]["servers"][item] = self.get_paper_versions(item) # save our cache try: with open(cache_file, "w", encoding="utf-8") as f: From 0b520aae80c5d059044379853154388a9376709d Mon Sep 17 00:00:00 2001 From: amcmanu3 Date: Tue, 16 Jan 2024 13:53:50 -0500 Subject: [PATCH 14/16] Fix misc sonarcube finding --- app/classes/shared/server.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/classes/shared/server.py b/app/classes/shared/server.py index 035824c5..f413b0f2 100644 --- a/app/classes/shared/server.py +++ b/app/classes/shared/server.py @@ -43,6 +43,7 @@ with redirect_stderr(NullWriter()): from psutil import NoSuchProcess logger = logging.getLogger(__name__) +SUCCESSMSG = "SUCCESS! Forge install completed" def callback(called_func): @@ -723,7 +724,7 @@ class ServerInstance: f' -jar "{file_name}" nogui' ) server_obj.execution_command = execution_command - Console.debug("SUCCESS! Forge install completed") + Console.debug(SUCCESSMSG) elif version_major <= 1 and version_minor < 20: # NEW VERSION >= 1.17 and <= 1.20 @@ -771,7 +772,7 @@ class ServerInstance: f" {server_command[4]}" ) server_obj.execution_command = execution_command - Console.debug("SUCCESS! Forge install completed") + Console.debug(SUCCESSMSG) else: # NEW VERSION >= 1.20 # (executable jar is back in server dir) @@ -802,7 +803,7 @@ class ServerInstance: f' -jar "{file_name}" nogui' ) server_obj.execution_command = execution_command - Console.debug("SUCCESS! Forge install completed") + Console.debug(SUCCESSMSG) except: logger.debug("Could not find run file.") # TODO Use regex to get version and rebuild simple execution From fc308d898581cd1f06bca38d0e31b24c22ee3bf9 Mon Sep 17 00:00:00 2001 From: Zedifus Date: Tue, 16 Jan 2024 19:02:09 +0000 Subject: [PATCH 15/16] Update changelog !690 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2432de2..66552821 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - Use Papermc Group's API for `paper` & `folia` builds in server builder ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/688)) ### Bug fixes - Fix bukkit and downstream fork MOTD crash ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/686)) +- Fix bug where invalid server Id leads to stack ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/690)) ### Tweaks - Refactor Forge server initialisation flow for newer versions ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/687)) ### Lang From d9682fdf8f6a87631a88c630037c1039cc3089eb Mon Sep 17 00:00:00 2001 From: Zedifus Date: Tue, 16 Jan 2024 19:15:06 +0000 Subject: [PATCH 16/16] Update changelog !691 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 66552821..1799d83e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Bug fixes - Fix bukkit and downstream fork MOTD crash ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/686)) - Fix bug where invalid server Id leads to stack ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/690)) +- Fix indent on public status check box ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/691)) ### Tweaks - Refactor Forge server initialisation flow for newer versions ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/687)) ### Lang