From f763fa9d0cf30fe8bc1cee8ca20764efb965079a Mon Sep 17 00:00:00 2001 From: luukas Date: Thu, 19 May 2022 16:01:03 +0300 Subject: [PATCH 01/30] Fix API v2 server modification --- app/classes/web/routes/api/servers/server/index.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/classes/web/routes/api/servers/server/index.py b/app/classes/web/routes/api/servers/server/index.py index 962f9380..ea8c71de 100644 --- a/app/classes/web/routes/api/servers/server/index.py +++ b/app/classes/web/routes/api/servers/server/index.py @@ -110,7 +110,7 @@ class ApiServersServerIndexHandler(BaseApiHandler): server_obj = self.controller.servers.get_server_obj(server_id) for key in data: # If we don't validate the input there could be security issues - setattr(self, key, data[key]) + setattr(server_obj, key, data[key]) self.controller.servers.update_server(server_obj) self.controller.management.add_to_audit_log( From bd4a35b418782df101415c7ab5d8b9d1ccd2d3df Mon Sep 17 00:00:00 2001 From: luukas Date: Thu, 19 May 2022 16:13:25 +0300 Subject: [PATCH 02/30] Make role add and edit use API v2 internal APIs --- app/classes/web/panel_handler.py | 44 ++++++-------------------------- 1 file changed, 8 insertions(+), 36 deletions(-) diff --git a/app/classes/web/panel_handler.py b/app/classes/web/panel_handler.py index 2144cdd4..ae3b2536 100644 --- a/app/classes/web/panel_handler.py +++ b/app/classes/web/panel_handler.py @@ -16,6 +16,7 @@ from tornado import iostream # TZLocal is set as a hidden import on win pipeline from tzlocal import get_localzone from croniter import croniter +from app.classes.controllers.roles_controller import RolesController from app.classes.models.roles import HelperRoles from app.classes.models.server_permissions import ( @@ -40,8 +41,8 @@ class PanelHandler(BaseHandler): user_roles[user_id] = user_roles_list return user_roles - def get_role_servers(self) -> t.Set[int]: - servers = set() + def get_role_servers(self) -> t.List[RolesController.RoleServerJsonType]: + servers = list() for server in self.controller.list_defined_servers(): argument = self.get_argument(f"server_{server['server_id']}_access", "0") if argument == "0": @@ -57,7 +58,9 @@ class PanelHandler(BaseHandler): permission_mask, permission, "1" ) - servers.add((server["server_id"], permission_mask)) + servers.append( + {"server_id": server["server_id"], "permissions": permission_mask} + ) return servers def get_perms_quantity(self) -> t.Tuple[str, dict]: @@ -2022,35 +2025,7 @@ class PanelHandler(BaseHandler): servers = self.get_role_servers() - # TODO: use update_role_advanced when API v2 gets merged - base_data = self.controller.roles.get_role_with_servers(role_id) - - server_ids = {server[0] for server in servers} - server_permissions_map = {server[0]: server[1] for server in servers} - - added_servers = server_ids.difference(set(base_data["servers"])) - removed_servers = set(base_data["servers"]).difference(server_ids) - same_servers = server_ids.intersection(set(base_data["servers"])) - logger.debug( - f"role: {role_id} +server:{added_servers} -server{removed_servers}" - ) - for server_id in added_servers: - PermissionsServers.get_or_create( - role_id, server_id, server_permissions_map[server_id] - ) - for server_id in same_servers: - PermissionsServers.update_role_permission( - role_id, server_id, server_permissions_map[server_id] - ) - if len(removed_servers) != 0: - PermissionsServers.delete_roles_permissions(role_id, removed_servers) - - up_data = { - "role_name": role_name, - "last_update": Helpers.get_time_as_string(), - } - # TODO: do the last_update on the db side - HelperRoles.update_role(role_id, up_data) + self.controller.roles.update_role_advanced(role_id, role_name, servers) self.controller.management.add_to_audit_log( exec_user["user_id"], @@ -2087,10 +2062,7 @@ class PanelHandler(BaseHandler): servers = self.get_role_servers() - role_id = self.controller.roles.add_role(role_name) - # TODO: use add_role_advanced when API v2 gets merged - for server in servers: - PermissionsServers.get_or_create(role_id, server[0], server[1]) + role_id = self.controller.roles.add_role_advanced(role_name, servers) self.controller.management.add_to_audit_log( exec_user["user_id"], From 73175d0f82fde579232edff5ba31861e7bc99cb6 Mon Sep 17 00:00:00 2001 From: luukas Date: Thu, 19 May 2022 16:32:18 +0300 Subject: [PATCH 03/30] Remove the root example from the new server schema * It messed up https://json-schema-faker.js.org * It wasn't updated for agree_to_eula --- app/classes/web/routes/api/servers/index.py | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/app/classes/web/routes/api/servers/index.py b/app/classes/web/routes/api/servers/index.py index 04172386..0351c56c 100644 --- a/app/classes/web/routes/api/servers/index.py +++ b/app/classes/web/routes/api/servers/index.py @@ -17,24 +17,6 @@ new_server_schema = { "monitoring_type", "create_type", ], - "examples": [ - { - "name": "My Server", - "monitoring_type": "minecraft_java", - "minecraft_java_monitoring_data": {"host": "127.0.0.1", "port": 25565}, - "create_type": "minecraft_java", - "minecraft_java_create_data": { - "create_type": "download_jar", - "download_jar_create_data": { - "type": "Paper", - "version": "1.18.2", - "mem_min": 1, - "mem_max": 2, - "server_properties_port": 25565, - }, - }, - } - ], "properties": { "name": { "title": "Name", From 7a7c7501e6de1983379003558d861ad4c580231e Mon Sep 17 00:00:00 2001 From: luukas Date: Thu, 19 May 2022 17:27:36 +0300 Subject: [PATCH 04/30] Use relative path for latest.log --- app/classes/shared/main_controller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/classes/shared/main_controller.py b/app/classes/shared/main_controller.py index 6553dbc9..2114d4c2 100644 --- a/app/classes/shared/main_controller.py +++ b/app/classes/shared/main_controller.py @@ -468,7 +468,7 @@ class Controller: log_location = data.get("log_location", "") if log_location == "": # TODO: different default log locations for server creation types - log_location = "/logs/latest.log" + log_location = "./logs/latest.log" if data["monitoring_type"] == "minecraft_java": monitoring_port = data["minecraft_java_monitoring_data"]["port"] From 48948423c98b1bb020585832bfb07887d8f11635 Mon Sep 17 00:00:00 2001 From: luukas Date: Fri, 20 May 2022 01:33:02 +0300 Subject: [PATCH 05/30] Fix various things in create_api_server --- app/classes/shared/main_controller.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/app/classes/shared/main_controller.py b/app/classes/shared/main_controller.py index 2114d4c2..39a3f0fa 100644 --- a/app/classes/shared/main_controller.py +++ b/app/classes/shared/main_controller.py @@ -383,12 +383,12 @@ class Controller: + ("" if empty else f"\nserver-port={port}") ) + server_file = "server.jar" # HACK: Throw this horrible default out of here root_create_data = data[data["create_type"] + "_create_data"] create_data = root_create_data[root_create_data["create_type"] + "_create_data"] if data["create_type"] == "minecraft_java": if root_create_data["create_type"] == "download_jar": server_file = f"{create_data['type']}-{create_data['version']}.jar" - full_jar_path = os.path.join(new_server_path, server_file) # Create an EULA file with open( @@ -399,16 +399,18 @@ class Controller: ) elif root_create_data["create_type"] == "import_server": _copy_import_dir_files(create_data["existing_server_path"]) - full_jar_path = os.path.join(new_server_path, create_data["jarfile"]) + server_file = create_data["jarfile"] elif root_create_data["create_type"] == "import_zip": # TODO: Copy files from the zip file to the new server directory - full_jar_path = os.path.join(new_server_path, create_data["jarfile"]) + server_file = create_data["jarfile"] raise Exception("Not yet implemented") _create_server_properties_if_needed(create_data["server_properties_port"]) min_mem = create_data["mem_min"] max_mem = create_data["mem_max"] + full_jar_path = os.path.join(new_server_path, server_file) + def _gibs_to_mibs(gibs: float) -> str: return str(int(gibs * 1024)) @@ -438,7 +440,9 @@ class Controller: _create_server_properties_if_needed(0, True) server_command = create_data["command"] - server_file = "" + server_file = ( + "./bedrock_server" # HACK: This is a hack to make the server start + ) elif data["create_type"] == "custom": # TODO: working_directory, executable_update if root_create_data["create_type"] == "raw_exec": @@ -458,7 +462,11 @@ class Controller: _create_server_properties_if_needed(0, True) server_command = create_data["command"] - server_file = root_create_data["executable_update"].get("file", "") + + server_file_new = root_create_data["executable_update"].get("file", "") + if server_file_new != "": + # HACK: Horrible hack to make the server start + server_file = server_file_new stop_command = data.get("stop_command", "") if stop_command == "": @@ -480,7 +488,7 @@ class Controller: monitoring_type = "minecraft-bedrock" elif data["monitoring_type"] == "none": # TODO: this needs to be NUKED.. - # There shouldn't be anything set if there are nothing to monitor + # There shouldn't be anything set if there is nothing to monitor monitoring_port = 25565 monitoring_host = "127.0.0.1" monitoring_type = "minecraft-java" From 1b059b24df439c093fa189090d2b3c0ae0b9ceb9 Mon Sep 17 00:00:00 2001 From: luukas Date: Fri, 20 May 2022 13:15:50 +0300 Subject: [PATCH 06/30] Update get_*_column functions Use getattr instead of model_to_dict in single columns. We might want to change the functions later on so peewee's ForeignKeyField primary key shorthand like model.server_id instead of model.server.server_id will work. This will very likely increase performance of the get_*_column functions due to not having to call the model_to_dict function from Peewee's helper library. --- app/classes/models/roles.py | 7 +++---- app/classes/models/servers.py | 6 +++--- app/classes/models/users.py | 15 +++------------ 3 files changed, 9 insertions(+), 19 deletions(-) diff --git a/app/classes/models/roles.py b/app/classes/models/roles.py index e5afcd31..0166244a 100644 --- a/app/classes/models/roles.py +++ b/app/classes/models/roles.py @@ -66,10 +66,9 @@ class HelperRoles: @staticmethod def get_role_column(role_id: t.Union[str, int], column_name: str) -> t.Any: column = getattr(Roles, column_name) - return model_to_dict( - Roles.select(column).where(Roles.role_id == role_id).get(), - only=[column], - )[column_name] + return getattr( + Roles.select(column).where(Roles.role_id == role_id).get(), column_name + ) @staticmethod def add_role(role_name): diff --git a/app/classes/models/servers.py b/app/classes/models/servers.py index 5b7617b1..6e1af166 100644 --- a/app/classes/models/servers.py +++ b/app/classes/models/servers.py @@ -144,10 +144,10 @@ class HelperServers: @staticmethod def get_server_column(server_id: t.Union[str, int], column_name: str) -> t.Any: column = getattr(Servers, column_name) - return model_to_dict( + return getattr( Servers.select(column).where(Servers.server_id == server_id).get(), - only=[column], - )[column_name] + column_name, + ) # ********************************************************************************** # Servers Methods diff --git a/app/classes/models/users.py b/app/classes/models/users.py index 5370d430..f2dc4460 100644 --- a/app/classes/models/users.py +++ b/app/classes/models/users.py @@ -165,19 +165,10 @@ class HelperUsers: @staticmethod def get_user_column(user_id: t.Union[str, int], column_name: str) -> t.Any: column = getattr(Users, column_name) - return model_to_dict( + return getattr( Users.select(column).where(Users.user_id == user_id).get(), - only=[column], - )[column_name] - - @staticmethod - def check_system_user(user_id): - try: - result = Users.get(Users.user_id == user_id).user_id == user_id - if result: - return True - except: - return False + column_name, + ) @staticmethod def get_user_model(user_id: str) -> Users: From dba3fafa87eff2de568861f0dc3ea43c398ad15d Mon Sep 17 00:00:00 2001 From: luukas Date: Fri, 20 May 2022 13:31:30 +0300 Subject: [PATCH 07/30] Use shorthand for Controller.check_system_user This reduced the code from 4 lines to 1 line. The code if : return True else: return False can be shortened to return --- app/classes/shared/main_controller.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/classes/shared/main_controller.py b/app/classes/shared/main_controller.py index 39a3f0fa..9e08c04c 100644 --- a/app/classes/shared/main_controller.py +++ b/app/classes/shared/main_controller.py @@ -147,10 +147,7 @@ class Controller: @staticmethod def check_system_user(): - if HelperUsers.get_user_id_by_name("system") is not None: - return True - else: - return False + return HelperUsers.get_user_id_by_name("system") is not None def set_project_root(self, root_dir): self.project_root = root_dir From 9ddcd13f2f50ebfed8b4d08082d0a3ab4bde8df6 Mon Sep 17 00:00:00 2001 From: luukas Date: Fri, 20 May 2022 14:06:46 +0300 Subject: [PATCH 08/30] Fix W0611 & R1734 lint issues --- app/classes/web/panel_handler.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/app/classes/web/panel_handler.py b/app/classes/web/panel_handler.py index ae3b2536..b627b7fb 100644 --- a/app/classes/web/panel_handler.py +++ b/app/classes/web/panel_handler.py @@ -18,11 +18,7 @@ from tzlocal import get_localzone from croniter import croniter from app.classes.controllers.roles_controller import RolesController -from app.classes.models.roles import HelperRoles -from app.classes.models.server_permissions import ( - EnumPermissionsServer, - PermissionsServers, -) +from app.classes.models.server_permissions import EnumPermissionsServer from app.classes.models.crafty_permissions import EnumPermissionsCrafty from app.classes.models.management import HelpersManagement from app.classes.shared.helpers import Helpers @@ -42,7 +38,7 @@ class PanelHandler(BaseHandler): return user_roles def get_role_servers(self) -> t.List[RolesController.RoleServerJsonType]: - servers = list() + servers = [] for server in self.controller.list_defined_servers(): argument = self.get_argument(f"server_{server['server_id']}_access", "0") if argument == "0": From ab022a65ed44e7b853350d769a26ec9bc7adc26b Mon Sep 17 00:00:00 2001 From: Zedifus Date: Mon, 23 May 2022 20:35:43 +0100 Subject: [PATCH 09/30] Version bumping jsonlint Checking if this is causing lint issue --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index d57a8b2f..d57479e9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,5 +17,5 @@ requests==2.26 termcolor==1.1 tornado==6.0 tzlocal==4.0 -jsonschema==4.4.0 +jsonschema==4.5.1 orjson==3.6.7 From 4c981f50c24dd6902a9a1911fbe4a076ea13112c Mon Sep 17 00:00:00 2001 From: luukas Date: Mon, 23 May 2022 22:45:27 +0300 Subject: [PATCH 10/30] Add more permission validation in user creation --- app/classes/web/routes/api/users/index.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/app/classes/web/routes/api/users/index.py b/app/classes/web/routes/api/users/index.py index d2a9724e..4c5a85a2 100644 --- a/app/classes/web/routes/api/users/index.py +++ b/app/classes/web/routes/api/users/index.py @@ -99,7 +99,7 @@ class ApiUsersIndexHandler(BaseApiHandler): email = data.get("email", "default@example.com") enabled = data.get("enabled", True) lang = data.get("lang", self.helper.get_setting("language")) - superuser = data.get("superuser", False) + new_superuser = data.get("superuser", False) permissions = data.get("permissions", None) roles = data.get("roles", None) hints = data.get("hints", True) @@ -134,13 +134,24 @@ class ApiUsersIndexHandler(BaseApiHandler): ) permissions_mask = "".join(permissions_mask) + if new_superuser and not superuser: + return self.finish_json( + 400, {"status": "error", "error": "INVALID_SUPERUSER_CREATE"} + ) + + if len(roles) != 0 and not superuser: + # HACK: This should check if the user has the roles or something + return self.finish_json( + 400, {"status": "error", "error": "INVALID_ROLES_CREATE"} + ) + # TODO: do this in the most efficient way user_id = self.controller.users.add_user( username, password, email, enabled, - superuser, + new_superuser, ) self.controller.users.update_user( user_id, From 4205c0a8f06515bb9f691bc4e689da0eb370e590 Mon Sep 17 00:00:00 2001 From: Zedifus Date: Mon, 23 May 2022 20:53:23 +0100 Subject: [PATCH 11/30] Exempt jsonschema falsepositive E0611 Can't understand why these are flagging, code is as per docs. Version is latest, and not flagging locally. Going to exempt mod for now --- .pylintrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pylintrc b/.pylintrc index ba047ba8..6e47cc92 100644 --- a/.pylintrc +++ b/.pylintrc @@ -443,7 +443,7 @@ ignored-classes=optparse.Values,thread._local,_thread._local # (useful for modules/projects where namespaces are manipulated during runtime # and thus existing member attributes cannot be deduced by static analysis). It # supports qualified module names, as well as Unix pattern matching. -ignored-modules= +ignored-modules=jsonschema # Show a hint with possible names when a member name was not found. The aspect # of finding the hint is based on edit distance. From afdffcd836df5059aaf9c9931ca8c647de23bb44 Mon Sep 17 00:00:00 2001 From: luukas Date: Mon, 23 May 2022 23:03:50 +0300 Subject: [PATCH 12/30] Optimize get_user_permissions_mask --- app/classes/models/server_permissions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/classes/models/server_permissions.py b/app/classes/models/server_permissions.py index afdf428c..529e279d 100644 --- a/app/classes/models/server_permissions.py +++ b/app/classes/models/server_permissions.py @@ -205,7 +205,7 @@ class PermissionsServers: @staticmethod def get_user_permissions_mask(user: Users, server_id: str): if user.superuser: - permissions_mask = "1" * len(PermissionsServers.get_permissions_list()) + permissions_mask = "1" * len(EnumPermissionsServer) else: roles_list = HelperUsers.get_user_roles_id(user.user_id) role_server = ( @@ -217,7 +217,7 @@ class PermissionsServers: try: permissions_mask = role_server[0].permissions except IndexError: - permissions_mask = "0" * len(PermissionsServers.get_permissions_list()) + permissions_mask = "0" * len(EnumPermissionsServer) return permissions_mask @staticmethod From 11335b58f37001255563389b430c735c44dd8f32 Mon Sep 17 00:00:00 2001 From: Zedifus Date: Mon, 23 May 2022 22:20:19 +0100 Subject: [PATCH 13/30] Update Translations for kofi credit support More sane key naming as multiple sources, title & desc update too. --- app/translations/de_DE.json | 8 ++++---- app/translations/en_EN.json | 8 ++++---- app/translations/fi_FI.json | 8 ++++---- app/translations/fr_FR.json | 8 ++++---- app/translations/fy_NL.json | 8 ++++---- app/translations/hr_HR.json | 8 ++++---- app/translations/id_ID.json | 8 ++++---- app/translations/it_IT.json | 8 ++++---- app/translations/lol_EN.json | 8 ++++---- app/translations/lv_LV.json | 8 ++++---- app/translations/nl_BE.json | 8 ++++---- app/translations/nl_NL.json | 8 ++++---- app/translations/zh_CN.json | 8 ++++---- 13 files changed, 52 insertions(+), 52 deletions(-) diff --git a/app/translations/de_DE.json b/app/translations/de_DE.json index 2813b570..d5cfb94f 100644 --- a/app/translations/de_DE.json +++ b/app/translations/de_DE.json @@ -39,11 +39,11 @@ "hugeDesc": "Ein riesiges", "pageDescription": "Ohne diese Menschen würde Crafty nicht existieren", "pageTitle": "Mitwirkende", - "patreonDesc": "an unsere Patreon-Unterstützer!", - "patreonLevel": "Unterstützer-Level", - "patreonName": "Name", + "patreonDesc": "an unsere Patreon/Ko-fi-Unterstützer!", + "subscriptionLevel": "Unterstützer-Level", + "subscriberName": "Name", "patreonOther": "Andere", - "patreonSupporter": "Patreon Unterstützer", + "patreonSupporter": "Patreon / Ko-fi Unterstützer", "patreonUpdate": "Letzte Aktualisierung:", "retiredStaff": "Ehemalige Helfer", "supportTeam": "Support- und Dokumentationsteam", diff --git a/app/translations/en_EN.json b/app/translations/en_EN.json index 6be25f00..55f1d4cc 100644 --- a/app/translations/en_EN.json +++ b/app/translations/en_EN.json @@ -39,11 +39,11 @@ "hugeDesc": "A huge", "pageDescription": "Without these people, you wouldn't have Crafty", "pageTitle": "Credits", - "patreonDesc": "to our Patreon supporters!", - "patreonLevel": "Level", - "patreonName": "Name", + "patreonDesc": "to our Patreon / Ko-fi supporters!", + "subscriptionLevel": "Level", + "subscriberName": "Name", "patreonOther": "Other", - "patreonSupporter": "Patreon Supporters", + "patreonSupporter": "Patreon / Ko-fi Supporters", "patreonUpdate": "Last Update:", "retiredStaff": "Retired Staff", "supportTeam": "Support and Documentation Team", diff --git a/app/translations/fi_FI.json b/app/translations/fi_FI.json index 09fca876..2d38e4b7 100644 --- a/app/translations/fi_FI.json +++ b/app/translations/fi_FI.json @@ -39,11 +39,11 @@ "hugeDesc": "Valtava", "pageDescription": "Ilman näitä ihmisiä sinulla ei olisi Craftya", "pageTitle": "Hyvitykset", - "patreonDesc": "Patreon-tukijoillemme!", - "patreonLevel": "Taso", - "patreonName": "Nimi", + "patreonDesc": "Patreon / Ko-fi-tukijoillemme!", + "subscriptionLevel": "Taso", + "subscriberName": "Nimi", "patreonOther": "Muu", - "patreonSupporter": "Patreon-tukijat", + "patreonSupporter": "Patreon / Ko-fi-tukijat", "patreonUpdate": "Viimeisin päivitys:", "retiredStaff": "Entinen henkilökunta", "supportTeam": "Tuki- ja dokumentointitiimi", diff --git a/app/translations/fr_FR.json b/app/translations/fr_FR.json index 608e255c..e1201d07 100644 --- a/app/translations/fr_FR.json +++ b/app/translations/fr_FR.json @@ -39,11 +39,11 @@ "hugeDesc": "Un Enorme", "pageDescription": "Sans ces personnes, vous n'auriez pas Crafty", "pageTitle": "Crédits", - "patreonDesc": "à nos Soutiens Patreon !", - "patreonLevel": "Niveau", - "patreonName": "Nom", + "patreonDesc": "à nos Soutiens Patreon / Ko-fi !", + "subscriptionLevel": "Niveau", + "subscriberName": "Nom", "patreonOther": "Autre", - "patreonSupporter": "Soutiens Patreon", + "patreonSupporter": "Soutiens Patreon / Ko-fi", "patreonUpdate": "Dernière mise à Jour :", "retiredStaff": "Retraités de Crafty", "supportTeam": "Equipe de Support et de Documentation", diff --git a/app/translations/fy_NL.json b/app/translations/fy_NL.json index 6d3e7683..2c4c0fd4 100644 --- a/app/translations/fy_NL.json +++ b/app/translations/fy_NL.json @@ -39,11 +39,11 @@ "hugeDesc": "In enoarm", "pageDescription": "Sûnder dizze minsken soene jo Crafty net hawwe", "pageTitle": "Credits", - "patreonDesc": "oan ús Patreon-supporters!", - "patreonLevel": "Nivel", - "patreonName": "Namme", + "patreonDesc": "oan ús Patreon / Ko-fi-supporters!", + "subscriptionLevel": "Nivel", + "subscriberName": "Namme", "patreonOther": "Oare", - "patreonSupporter": "Patreon Supporters", + "patreonSupporter": "Patreon / Ko-fi Supporters", "patreonUpdate": "Lêste update:", "retiredStaff": "Pensionearre staff", "supportTeam": "Support- en dokumintaasjeteam", diff --git a/app/translations/hr_HR.json b/app/translations/hr_HR.json index a33fc6d7..26b5ae2c 100644 --- a/app/translations/hr_HR.json +++ b/app/translations/hr_HR.json @@ -39,11 +39,11 @@ "hugeDesc": "Veliko", "pageDescription": "Bez ovih ljudi ne biste imali Crafty", "pageTitle": "Zasluge", - "patreonDesc": "našim Patreon donorima!", - "patreonLevel": "Razina", - "patreonName": "Ime", + "patreonDesc": "našim Patreon / Ko-fi donorima!", + "subscriptionLevel": "Razina", + "subscriberName": "Ime", "patreonOther": "Ostalo", - "patreonSupporter": "Patreon donorima", + "patreonSupporter": "Patreon / Ko-fi donorima", "patreonUpdate": "Zadnje ažuriranje:", "retiredStaff": "Umirovljeno osoblje", "supportTeam": "Tim za podršku i dokumentaciju", diff --git a/app/translations/id_ID.json b/app/translations/id_ID.json index c6981c35..81257ab6 100644 --- a/app/translations/id_ID.json +++ b/app/translations/id_ID.json @@ -39,11 +39,11 @@ "hugeDesc": "Besar", "pageDescription": "Tanpa orang-orang ini, Anda tidak akan memiliki Crafty", "pageTitle": "Kredit", - "patreonDesc": "untuk pendukung Patreon kami!", - "patreonLevel": "Level", - "patreonName": "Nama", + "patreonDesc": "untuk pendukung Patreon / Ko-fi kami!", + "subscriptionLevel": "Level", + "subscriberName": "Nama", "patreonOther": "Lainnya", - "patreonSupporter": "Suporter Patreon", + "patreonSupporter": "Suporter Patreon / Ko-fi", "patreonUpdate": "Pembaharuan Terakhir:", "retiredStaff": "Pensiunan Staf", "supportTeam": "Tim Dukungan dan Dokumentasi", diff --git a/app/translations/it_IT.json b/app/translations/it_IT.json index ca96bd38..28754bc9 100644 --- a/app/translations/it_IT.json +++ b/app/translations/it_IT.json @@ -39,11 +39,11 @@ "hugeDesc": "Un enorme", "pageDescription": "Senza queste persone, non avremmo Crafty", "pageTitle": "Crediti", - "patreonDesc": "ai nostri supporter di Patreon!", - "patreonLevel": "Livello", - "patreonName": "Nome", + "patreonDesc": "ai nostri supporter di Patreon / Ko-fi!", + "subscriptionLevel": "Livello", + "subscriberName": "Nome", "patreonOther": "Altro", - "patreonSupporter": "Supporter Patreon", + "patreonSupporter": "Supporter Patreon / Ko-fi", "patreonUpdate": "Ultimo aggiornamento:", "retiredStaff": "Staff ritirato", "supportTeam": "Squadra di supporto e documentazione", diff --git a/app/translations/lol_EN.json b/app/translations/lol_EN.json index d9d76a15..0f49c154 100644 --- a/app/translations/lol_EN.json +++ b/app/translations/lol_EN.json @@ -39,11 +39,11 @@ "hugeDesc": "A HOOJ", "pageDescription": "WITHOUT THEES PEEPS, U WOULDNT HAS CWAFTY", "pageTitle": "GUD HOOMANZ", - "patreonDesc": "2 DA PATREON SUPPORTERS!", - "patreonLevel": "LVLZ", - "patreonName": "NAMEZ", + "patreonDesc": "2 DA PATREUN UN KOFEE SUPPORTERS!", + "subscriptionLevel": "LVLZ", + "subscriberName": "NAMEZ", "patreonOther": "OTHERZ", - "patreonSupporter": "PATREON SUPPORTERS", + "patreonSupporter": "PATREUN UN KOFEE SUPPORTERS", "patreonUpdate": "LAST UPDATE:", "retiredStaff": "DISTANT PPLZ, NEVR FORGOTTEN", "supportTeam": "THEES PEEOPLE FED AN CARE 4 ME, THEY VRY VRY GUD PPL", diff --git a/app/translations/lv_LV.json b/app/translations/lv_LV.json index b5abe58b..d6ea2849 100644 --- a/app/translations/lv_LV.json +++ b/app/translations/lv_LV.json @@ -39,11 +39,11 @@ "hugeDesc": "Liels", "pageDescription": "Bez šiem cilvēkiem, jums nebūtu Crafty", "pageTitle": "Pateicības", - "patreonDesc": "mūsu Patreon atbalstītājiem!", - "patreonLevel": "Līmenis", - "patreonName": "Vārds", + "patreonDesc": "mūsu Patreon / Ko-fi atbalstītājiem!", + "subscriptionLevel": "Līmenis", + "subscriberName": "Vārds", "patreonOther": "Cits", - "patreonSupporter": "Patreon Atbalstītāji", + "patreonSupporter": "Patreon / Ko-fi Atbalstītāji", "patreonUpdate": "Pēdējais Atjaunojums:", "retiredStaff": "Atvaļinātie Komandas Biedri", "supportTeam": "Atbalsta un Dokumentācijas Komanda", diff --git a/app/translations/nl_BE.json b/app/translations/nl_BE.json index b8ed84dd..4420d671 100644 --- a/app/translations/nl_BE.json +++ b/app/translations/nl_BE.json @@ -39,11 +39,11 @@ "hugeDesc": "Een enorme", "pageDescription": "Zonder deze mensen, zou je Crafty niet hebben", "pageTitle": "Credits", - "patreonDesc": "aan onze Patreon supporters!", - "patreonLevel": "Niveau", - "patreonName": "Naam", + "patreonDesc": "aan onze Patreon / Ko-fi supporters!", + "subscriptionLevel": "Niveau", + "subscriberName": "Naam", "patreonOther": "Andere", - "patreonSupporter": "Patreon supporters", + "patreonSupporter": "Patreon / Ko-fi supporters", "patreonUpdate": "Laatste Update:", "retiredStaff": "Gepensioneerd personeel", "supportTeam": "Ondersteunings- en documentatieteam", diff --git a/app/translations/nl_NL.json b/app/translations/nl_NL.json index 2e405922..0e94d1cc 100644 --- a/app/translations/nl_NL.json +++ b/app/translations/nl_NL.json @@ -39,11 +39,11 @@ "hugeDesc": "Een gigantische", "pageDescription": "Zonder deze mensen zou er geen Crafty zijn", "pageTitle": "Credits", - "patreonDesc": "aan onze Patreon supporters!", - "patreonLevel": "Niveau", - "patreonName": "Naam", + "patreonDesc": "aan onze Patreon / Ko-fi supporters!", + "subscriptionLevel": "Niveau", + "subscriberName": "Naam", "patreonOther": "Overig", - "patreonSupporter": "Patreon Supporters", + "patreonSupporter": "Patreon / Ko-fi Supporters", "patreonUpdate": "Laatste update:", "retiredStaff": "Gepensioneerde staff", "supportTeam": "Support- en documentatieteam", diff --git a/app/translations/zh_CN.json b/app/translations/zh_CN.json index d66717c2..bb583baf 100644 --- a/app/translations/zh_CN.json +++ b/app/translations/zh_CN.json @@ -39,11 +39,11 @@ "hugeDesc": "非常", "pageDescription": "没有这些人,就没有 Crafty", "pageTitle": "鸣谢", - "patreonDesc": "我们的 Patreon 支持者!", - "patreonLevel": "等级", - "patreonName": "名称", + "patreonDesc": "我们的 Patreon / Ko-fi 支持者!", + "subscriptionLevel": "等级", + "subscriberName": "名称", "patreonOther": "其他", - "patreonSupporter": "Patreon 支持者", + "patreonSupporter": "Patreon / Ko-fi 支持者", "patreonUpdate": "上次更新:", "retiredStaff": "退休员工", "supportTeam": "支持与文档团队", From 2a4295d9b3e77a923a46b3916a3a64e77bb0c41f Mon Sep 17 00:00:00 2001 From: Zedifus Date: Mon, 23 May 2022 22:21:32 +0100 Subject: [PATCH 14/30] Add subscription source parsing & format html --- app/frontend/templates/panel/credits.html | 319 ++++++++++++---------- 1 file changed, 172 insertions(+), 147 deletions(-) diff --git a/app/frontend/templates/panel/credits.html b/app/frontend/templates/panel/credits.html index a04147df..89b3678e 100644 --- a/app/frontend/templates/panel/credits.html +++ b/app/frontend/templates/panel/credits.html @@ -24,7 +24,8 @@
-

 {{ translate('credits', 'developmentTeam', data['lang']) }}

+

 {{ translate('credits', 'developmentTeam', data['lang']) + }}

@@ -40,7 +41,8 @@ profile image {% else %}
- profile image + profile image
{% end %}
@@ -66,14 +68,16 @@ {% end %} {% if person['tags'][1] %} {% if type(person['tags'][1]) is list %} - {{ person['tags'][1][0] }} + {{ person['tags'][1][0] + }} {% else %} {{ person['tags'][1] }} {% end %} {% end %} {% if person['tags'][2] %} {% if type(person['tags'][2]) is list %} - {{ person['tags'][2][0] }} + {{ + person['tags'][2][0] }} {% else %} {{ person['tags'][2] }} {% end %} @@ -117,7 +121,8 @@ profile image {% else %}
- profile image + profile image
{% end %}
@@ -143,14 +148,16 @@ {% end %} {% if person['tags'][1] %} {% if type(person['tags'][1]) is list %} - {{ person['tags'][1][0] }} + {{ person['tags'][1][0] + }} {% else %} {{ person['tags'][1] }} {% end %} {% end %} {% if person['tags'][2] %} {% if type(person['tags'][2]) is list %} - {{ person['tags'][2][0] }} + {{ + person['tags'][2][0] }} {% else %} {{ person['tags'][2] }} {% end %} @@ -177,7 +184,8 @@
-

 {{ translate('credits', 'retiredStaff', data['lang']) }}

+

 {{ translate('credits', 'retiredStaff', data['lang']) + }}

@@ -185,163 +193,180 @@ {% for person in data['staff']['retired'] %}
-
-
-
- {% if person['pic'] %} - profile image - {% else %} -
- profile image -
- {% end %} -
- -
-
-

{{ person['name'] }}

-
- -
- {% if person['loc'] %} - -

{{ person['loc'] }}

- {% end %} -
+
+
+
+ {% if person['pic'] %} + profile image + {% else %} +
+ profile image
+ {% end %}
-
-
- {% if person['tags'][0] %} - {{ person['tags'][0] }} - {% end %} - {% if person['tags'][1] %} - {% if type(person['tags'][1]) is list %} - {{ person['tags'][1][0] }} - {% else %} - {{ person['tags'][1] }} - {% end %} - {% end %} - {% if person['tags'][2] %} - {% if type(person['tags'][2]) is list %} - {{ person['tags'][2][0] }} - {% else %} - {{ person['tags'][2] }} - {% end %} - {% end %} +
+
+

{{ person['name'] }}

-
- {% if person['title'] %} -
{{ person['title'] }}
+
+ {% if person['loc'] %} + +

{{ person['loc'] }}

{% end %} -

{{ person['blurb'] }}

+
+
+ {% if person['tags'][0] %} + {{ person['tags'][0] }} + {% end %} + {% if person['tags'][1] %} + {% if type(person['tags'][1]) is list %} + {{ person['tags'][1][0] + }} + {% else %} + {{ person['tags'][1] }} + {% end %} + {% end %} + {% if person['tags'][2] %} + {% if type(person['tags'][2]) is list %} + {{ + person['tags'][2][0] }} + {% else %} + {{ person['tags'][2] }} + {% end %} + {% end %} +
+ +
+ {% if person['title'] %} +
{{ person['title'] }}
+ {% end %} +

{{ person['blurb'] }}

+
+
-
- {% end %} -
-
-
-
- -
- -
-
-
-

{{ translate('credits', 'patreonSupporter', - data['lang']) - }}

-
-
-

{{ translate('credits', 'hugeDesc', data['lang']) }} - {{ translate('credits', 'thankYou', data['lang']) }}  {{ translate('credits', 'patreonDesc', data['lang']) }} | {{ translate('credits', 'patreonUpdate', data['lang']) }} {{ data["lastUpdate"] }} -

- - - - - - - - - {% for pat in data["patrons"] %} - - - - - {% end %} - - -
{{ translate('credits', 'patreonName', data['lang']) }}{{ translate('credits', 'patreonLevel', data['lang']) }}
{{ pat["name"] }} - {% if pat["level"] == "Crafty Sustainer" %} - Sustainer - {% elif pat["level"] == "Crafty Advocate" %} - Advocate - {% elif pat["level"] == "Crafty Supporter" %} - Supporter - {% else %} - {{ translate('credits', 'patreonOther', data['lang']) }} - {% end %} -
-
- -
-
-
-

{{ translate('credits', 'translationTitle', data['lang']) }}

-
-
-

{{ translate('credits', 'hugeDesc', data['lang']) }} - {{ translate('credits', 'thankYou', data['lang']) }}  {{ translate('credits', 'translationDesc', data['lang']) }} -

- - - - - - - - - {% for person in data['translations'] %} - - - - - {% end %} - -
{{ translate('credits', 'translationName', data['lang']) }}{{ translate('credits', 'translator', data['lang']) }}
{{ person }} -
- {% for language in data['translations'][person] %} - {{ language }} - {% end %} -
-
-
-
-
- + {% end %} +
- - {% end %} +
- {% block js %} - + + +
+
+
- {% end %} \ No newline at end of file +
+
+
+

{{ translate('credits', 'translationTitle', + data['lang']) }}

+
+
+

{{ translate('credits', 'hugeDesc', data['lang']) }} + {{ translate('credits', 'thankYou', data['lang']) }}  {{ translate('credits', + 'translationDesc', data['lang']) }} +

+ + + + + + + + + {% for person in data['translations'] %} + + + + + {% end %} + +
{{ translate('credits', 'translationName', data['lang']) }}{{ translate('credits', 'translator', data['lang']) }}
{{ person }} +
+ {% for language in data['translations'][person] %} + {{ language }} + {% end %} +
+
+
+
+
+ +
+
+ + +{% end %} + +{% block js %} + + +{% end %} From d0596af4c9b2eb38e16eb6f8f2d68c7cdce7965d Mon Sep 17 00:00:00 2001 From: Zedifus Date: Mon, 23 May 2022 22:54:06 +0100 Subject: [PATCH 15/30] Add exemption orjson no-member falsepositive --- .pylintrc | 2 +- app/classes/web/base_handler.py | 2 +- app/classes/web/routes/api/roles/index.py | 4 ++-- app/classes/web/routes/api/roles/role/index.py | 4 ++-- app/classes/web/routes/api/servers/index.py | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.pylintrc b/.pylintrc index 6e47cc92..a7573c8e 100644 --- a/.pylintrc +++ b/.pylintrc @@ -443,7 +443,7 @@ ignored-classes=optparse.Values,thread._local,_thread._local # (useful for modules/projects where namespaces are manipulated during runtime # and thus existing member attributes cannot be deduced by static analysis). It # supports qualified module names, as well as Unix pattern matching. -ignored-modules=jsonschema +ignored-modules=jsonschema,orjson # Show a hint with possible names when a member name was not found. The aspect # of finding the hint is based on edit distance. diff --git a/app/classes/web/base_handler.py b/app/classes/web/base_handler.py index c7aca58c..8a649d78 100644 --- a/app/classes/web/base_handler.py +++ b/app/classes/web/base_handler.py @@ -238,4 +238,4 @@ class BaseHandler(tornado.web.RequestHandler): def finish_json(self, status: int, data: t.Dict[str, t.Any]): self.set_status(status) self.set_header("Content-Type", "application/json") - self.finish(orjson.dumps(data)) # pylint: disable=no-member + self.finish(orjson.dumps(data)) diff --git a/app/classes/web/routes/api/roles/index.py b/app/classes/web/routes/api/roles/index.py index d98d8d53..11142ebc 100644 --- a/app/classes/web/routes/api/roles/index.py +++ b/app/classes/web/routes/api/roles/index.py @@ -79,8 +79,8 @@ class ApiRolesIndexHandler(BaseApiHandler): return self.finish_json(400, {"status": "error", "error": "NOT_AUTHORIZED"}) try: - data = orjson.loads(self.request.body) # pylint: disable=no-member - except orjson.decoder.JSONDecodeError as e: # pylint: disable=no-member + data = orjson.loads(self.request.body) + except orjson.decoder.JSONDecodeError as e: return self.finish_json( 400, {"status": "error", "error": "INVALID_JSON", "error_data": str(e)} ) diff --git a/app/classes/web/routes/api/roles/role/index.py b/app/classes/web/routes/api/roles/role/index.py index 8dbb7373..43abbd55 100644 --- a/app/classes/web/routes/api/roles/role/index.py +++ b/app/classes/web/routes/api/roles/role/index.py @@ -105,8 +105,8 @@ class ApiRolesRoleIndexHandler(BaseApiHandler): return self.finish_json(400, {"status": "error", "error": "NOT_AUTHORIZED"}) try: - data = orjson.loads(self.request.body) # pylint: disable=no-member - except orjson.decoder.JSONDecodeError as e: # pylint: disable=no-member + data = orjson.loads(self.request.body) + except orjson.decoder.JSONDecodeError as e: return self.finish_json( 400, {"status": "error", "error": "INVALID_JSON", "error_data": str(e)} ) diff --git a/app/classes/web/routes/api/servers/index.py b/app/classes/web/routes/api/servers/index.py index 0351c56c..f3789f62 100644 --- a/app/classes/web/routes/api/servers/index.py +++ b/app/classes/web/routes/api/servers/index.py @@ -647,8 +647,8 @@ class ApiServersIndexHandler(BaseApiHandler): return self.finish_json(400, {"status": "error", "error": "NOT_AUTHORIZED"}) try: - data = orjson.loads(self.request.body) # pylint: disable=no-member - except orjson.decoder.JSONDecodeError as e: # pylint: disable=no-member + data = orjson.loads(self.request.body) + except orjson.decoder.JSONDecodeError as e: return self.finish_json( 400, {"status": "error", "error": "INVALID_JSON", "error_data": str(e)} ) From 5104c34513d144864517ac6faeef101ab70540ac Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 23 May 2022 21:23:29 -0400 Subject: [PATCH 16/30] Add link to documentation to WSS error --- app/frontend/templates/base.html | 40 +++++++++++++++++----------- config_examples/apache2.conf.example | 2 +- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/app/frontend/templates/base.html b/app/frontend/templates/base.html index 84454acf..09e8b0d2 100644 --- a/app/frontend/templates/base.html +++ b/app/frontend/templates/base.html @@ -52,12 +52,13 @@