From 1cb30dd7d03bb2835436054a9d4ff0821649b7be Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 11:48:21 -0500 Subject: [PATCH 01/67] Start working on forge data handling --- mcstatus/forgedata.py | 131 ++++++++++++++++++++++++++++++++++++ mcstatus/status_response.py | 51 ++++++++++++++ 2 files changed, 182 insertions(+) create mode 100644 mcstatus/forgedata.py diff --git a/mcstatus/forgedata.py b/mcstatus/forgedata.py new file mode 100644 index 00000000..74193749 --- /dev/null +++ b/mcstatus/forgedata.py @@ -0,0 +1,131 @@ +"""Forge Data Decoder + +Forge mod data is encoded into a UTF-16 string that represents +binary data containing data like the forge mod loader network +version, a big list of channels that all the forge mods use, +and a list of mods the server has. + +For more information see this file from forge itself: +https://github.com/MinecraftForge/MinecraftForge/blob/42115d37d6a46856e3dc914b54a1ce6d33b9872a/src/main/java/net/minecraftforge/network/ServerStatusPing.java""" + +from __future__ import annotations + +from typing import Final, NotRequired, TypedDict + +from mcstatus.pinger import RawResponse +from mcstatus.protocol.connection import Connection + +VERSION_FLAG_IGNORESERVERONLY: Final = 0b1 +# IGNORESERVERONLY: Final = 'OHNOES\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31' # noqa +IGNORESERVERONLY: Final = "" + + +class JavaForgeDataChannel(TypedDict): + res: str + """Channel name and id (ex. "fml:handshake")""" + version: str + """Channel version (ex. "1.2.3.4")""" + required: bool + """Is this channel required for client to join""" + + +class JavaForgeDataMod(TypedDict): + modid: str + """Mod ID""" + modmarker: str + """Mod marker""" + + +class RawJavaForgeData(TypedDict): + fml_network_version: int + channels: list[RawJavaForgeDataChannel] + mods: list[RawJavaForgeDataMod] + d: NotRequired[str] + + +def decode_optimized(string: str) -> Connection: + """Decode buffer UTF-16 optimized binary data from `string`""" + text = io.StringIO(string) + + def read() -> int: + result = text.read(1) + if not result: + return 0 + return ord(result) + + size = read() | (read() << 15) + + buffer = Connection() + value = 0 + bits = 0 + for _ in range(len(string) - 2): + while bits >= 8: + buffer.receive((value & 0xFF).to_bytes(length=1, byteorder="big", signed=False)) + value >>= 8 + bits -= 8 + value |= (read() & 0x7FFF) << bits + bits += 15 + + while buffer.remaining() < size: + buffer.receive((value & 0xFF).to_bytes(length=1, byteorder="big", signed=False)) + value >>= 8 + bits -= 8 + return buffer + + +def decode_forge_data(response: RawResponse) -> dict[str, Any] | None: + "Return decoded forgeData if present or None" + data: dict[str, Any] = response + + if "forgeData" not in response: + return None + forge = response["forgeData"] + if "d" not in response: + return forge + + buffer = decode_optimized(forge["d"]) + + channels: dict[tuple[str, str], tuple[str, bool]] = {} + # channels: dict[str, tuple[str, bool]] = {} + mods: dict[str, str] = {} + + try: + truncated = buffer.read_bool() + mod_size = buffer.read_ushort() + for _ in range(mod_size): + channel_version_flags = buffer.read_varint() + + channel_size = channel_version_flags >> 1 + is_server = channel_version_flags & VERSION_FLAG_IGNORESERVERONLY != 0 + mod_id = buffer.read_utf() + + mod_version = IGNORESERVERONLY + if not is_server: + mod_version = buffer.read_utf() + + for _ in range(channel_size): + name = buffer.read_utf() + version = buffer.read_utf() + client_required = buffer.read_bool() + channels[(mod_id, name)] = (version, client_required) + + mods[mod_id] = mod_version + + non_mod_channel_size = buffer.read_varint() + for _ in range(non_mod_channel_size): + mod_name, mod_id = buffer.read_utf().split(":", 1) + channel_key: tuple[str, str] = mod_name, mod_id + # name = buffer.read_utf() + version = buffer.read_utf() + client_required = buffer.read_bool() + # channels[name] = (version, client_required) + channels[channel_key] = (version, client_required) + except Exception as ex: + if not truncated: + raise + # Semi-expect errors if truncated + + new_forge = forge.update({"truncated": truncated, "mods": mods, "channels": channels}) + if "d" in new_forge: + del new_forge["d"] + return new_forge diff --git a/mcstatus/status_response.py b/mcstatus/status_response.py index b3920c1c..1393c1b3 100644 --- a/mcstatus/status_response.py +++ b/mcstatus/status_response.py @@ -4,6 +4,7 @@ from dataclasses import dataclass from typing import Any, TYPE_CHECKING +from mcstatus.forgedata import JavaForgeDataChannel, JavaForgeDataMod, RawJavaForgeData from mcstatus.motd import Motd if TYPE_CHECKING: @@ -22,6 +23,21 @@ class RawJavaResponseVersion(TypedDict): name: str protocol: int + class RawJavaForgeDataChannel(TypedDict): + res: str + version: str + required: bool + + class RawJavaForgeDataMod(TypedDict): + modid: str + modmarker: str + + class RawJavaForgeData(TypedDict): + fml_network_version: int + channels: list[RawJavaForgeDataChannel] + mods: list[RawJavaForgeDataMod] + d: NotRequired[str] + class RawJavaResponseMotdWhenDict(TypedDict, total=False): text: str # only present if translation is set translation: str # same to the above field @@ -41,11 +57,15 @@ class RawJavaResponse(TypedDict): players: RawJavaResponsePlayers version: RawJavaResponseVersion favicon: NotRequired[str] + forge_data: NotRequired[RawJavaForgeData] else: RawJavaResponsePlayer = dict RawJavaResponsePlayers = dict RawJavaResponseVersion = dict + RawJavaForgeDataChannel = dict + RawJavaForgeDataMod = dict + RawJavaForgeData = dict RawJavaResponseMotdWhenDict = dict RawJavaResponse = dict @@ -266,6 +286,37 @@ def build(cls, raw: RawJavaResponsePlayers) -> Self: ) +@dataclass +class JavaForgeData(BaseStatusPlayers): + """Class for storing information about forge mods on the server.""" + + truncated: bool + """True if the server had to truncate the response to be able to send successfully + + If true, expect the mods and channels list to be incomplete""" + mods: list[RawJavaForgeDataMod] = {} + """Dictionary of mod IDs to mod versions""" + channels: list[RawJavaForgeDataChannel] = {} + """Dictionary of (mod name, mod id) to (channel version, is required on client)""" + + @classmethod + def build(cls, raw: RawJavaResponseForge) -> Self: + """Build :class:`JavaStatusPlayers` from raw response :class:`dict`. + + :param raw: Raw response :class:`dict`. + :raise ValueError: If the required keys (``online``, ``max``) are not present. + :raise TypeError: + If the required keys (``online`` - :class:`int`, ``max`` - :class:`int`, + ``sample`` - :class:`list`) are not of the expected type. + :return: :class:`JavaStatusPlayers` object. + """ + return cls( + truncated=raw["online"], + mods=raw["mods"], + channels=raw["channels"], + ) + + @dataclass class BedrockStatusPlayers(BaseStatusPlayers): """Class for storing information about players on the server.""" From e2e1d1c845197b3b96c8cefc86a52a61ed45ef10 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 12:38:29 -0500 Subject: [PATCH 02/67] Implement forge data decoder --- mcstatus/{forgedata.py => forge_data.py} | 106 ++++++++++++++++------- mcstatus/status_response.py | 61 +++---------- 2 files changed, 88 insertions(+), 79 deletions(-) rename mcstatus/{forgedata.py => forge_data.py} (55%) diff --git a/mcstatus/forgedata.py b/mcstatus/forge_data.py similarity index 55% rename from mcstatus/forgedata.py rename to mcstatus/forge_data.py index 74193749..4337e447 100644 --- a/mcstatus/forgedata.py +++ b/mcstatus/forge_data.py @@ -6,13 +6,14 @@ and a list of mods the server has. For more information see this file from forge itself: -https://github.com/MinecraftForge/MinecraftForge/blob/42115d37d6a46856e3dc914b54a1ce6d33b9872a/src/main/java/net/minecraftforge/network/ServerStatusPing.java""" +https://github.com/MinecraftForge/MinecraftForge/blob/42115d37d6a46856e3dc914b54a1ce6d33b9872a/src/main/java/net/minecraftforge/network/ServerStatusPing.java""" # noqa: E501 from __future__ import annotations -from typing import Final, NotRequired, TypedDict +import io +from dataclasses import dataclass +from typing import Final, NotRequired, Self, TypedDict -from mcstatus.pinger import RawResponse from mcstatus.protocol.connection import Connection VERSION_FLAG_IGNORESERVERONLY: Final = 0b1 @@ -33,16 +34,40 @@ class JavaForgeDataMod(TypedDict): modid: str """Mod ID""" modmarker: str - """Mod marker""" + """Mod version""" class RawJavaForgeData(TypedDict): - fml_network_version: int - channels: list[RawJavaForgeDataChannel] - mods: list[RawJavaForgeDataMod] + fmlNetworkVersion: int + channels: list[JavaForgeDataChannel] + mods: list[JavaForgeDataMod] d: NotRequired[str] +@dataclass +class JavaForgeData: + fml_network_version: int + """Forge Mod Loader network version""" + channels: list[JavaForgeDataChannel] + """List of channels, both for mods and non-mods""" + mods: list[JavaForgeDataMod] + """List of mods""" + truncated: bool + """Is the mods list and or channel list incomplete?""" + + @classmethod + def build(cls, raw: RawJavaForgeData) -> Self: + """Build :class:`JavaForgeData` from raw response :class:`dict`. + + :param raw: Raw forge data response :class:`dict`. + :return: :class:`JavaForgeData` object. + """ + raw.setdefault("fmlNetworkVersion", 0) + raw.setdefault("channels", []) + raw.setdefault("mods", []) + return decode_forge_data(raw) + + def decode_optimized(string: str) -> Connection: """Decode buffer UTF-16 optimized binary data from `string`""" text = io.StringIO(string) @@ -73,21 +98,22 @@ def read() -> int: return buffer -def decode_forge_data(response: RawResponse) -> dict[str, Any] | None: +def decode_forge_data(response: RawJavaForgeData) -> JavaForgeData: "Return decoded forgeData if present or None" - data: dict[str, Any] = response - if "forgeData" not in response: - return None - forge = response["forgeData"] if "d" not in response: - return forge + return JavaForgeData( + fml_network_version=response["fmlNetworkVersion"], + channels=response["channels"], + mods=response["mods"], + truncated=False, + ) - buffer = decode_optimized(forge["d"]) + buffer = decode_optimized(response["d"]) - channels: dict[tuple[str, str], tuple[str, bool]] = {} + channels: list[JavaForgeDataChannel] = [] # channels: dict[str, tuple[str, bool]] = {} - mods: dict[str, str] = {} + mods: list[JavaForgeDataMod] = [] try: truncated = buffer.read_bool() @@ -107,25 +133,47 @@ def decode_forge_data(response: RawResponse) -> dict[str, Any] | None: name = buffer.read_utf() version = buffer.read_utf() client_required = buffer.read_bool() - channels[(mod_id, name)] = (version, client_required) - - mods[mod_id] = mod_version + channels.append( + JavaForgeDataChannel( + { + "res": f"{mod_id}:{name}", + "version": version, + "required": client_required, + } + ) + ) + + mods.append( + JavaForgeDataMod( + { + "modid": mod_id, + "modmarker": mod_version, + } + ) + ) non_mod_channel_size = buffer.read_varint() for _ in range(non_mod_channel_size): - mod_name, mod_id = buffer.read_utf().split(":", 1) - channel_key: tuple[str, str] = mod_name, mod_id - # name = buffer.read_utf() + channel_identifier = buffer.read_utf() version = buffer.read_utf() client_required = buffer.read_bool() - # channels[name] = (version, client_required) - channels[channel_key] = (version, client_required) - except Exception as ex: + channels.append( + JavaForgeDataChannel( + { + "res": channel_identifier, + "version": version, + "required": client_required, + } + ) + ) + except Exception: if not truncated: raise # Semi-expect errors if truncated - new_forge = forge.update({"truncated": truncated, "mods": mods, "channels": channels}) - if "d" in new_forge: - del new_forge["d"] - return new_forge + return JavaForgeData( + fml_network_version=response["fmlNetworkVersion"], + channels=channels, + mods=mods, + truncated=truncated, + ) diff --git a/mcstatus/status_response.py b/mcstatus/status_response.py index 1393c1b3..1abf3474 100644 --- a/mcstatus/status_response.py +++ b/mcstatus/status_response.py @@ -4,7 +4,10 @@ from dataclasses import dataclass from typing import Any, TYPE_CHECKING -from mcstatus.forgedata import JavaForgeDataChannel, JavaForgeDataMod, RawJavaForgeData +from mcstatus.forge_data import JavaForgeData +from mcstatus.forge_data import JavaForgeDataChannel as JavaForgeDataChannel +from mcstatus.forge_data import JavaForgeDataMod as JavaForgeDataMod +from mcstatus.forge_data import RawJavaForgeData from mcstatus.motd import Motd if TYPE_CHECKING: @@ -23,21 +26,6 @@ class RawJavaResponseVersion(TypedDict): name: str protocol: int - class RawJavaForgeDataChannel(TypedDict): - res: str - version: str - required: bool - - class RawJavaForgeDataMod(TypedDict): - modid: str - modmarker: str - - class RawJavaForgeData(TypedDict): - fml_network_version: int - channels: list[RawJavaForgeDataChannel] - mods: list[RawJavaForgeDataMod] - d: NotRequired[str] - class RawJavaResponseMotdWhenDict(TypedDict, total=False): text: str # only present if translation is set translation: str # same to the above field @@ -63,9 +51,6 @@ class RawJavaResponse(TypedDict): RawJavaResponsePlayer = dict RawJavaResponsePlayers = dict RawJavaResponseVersion = dict - RawJavaForgeDataChannel = dict - RawJavaForgeDataMod = dict - RawJavaForgeData = dict RawJavaResponseMotdWhenDict = dict RawJavaResponse = dict @@ -134,6 +119,8 @@ class JavaStatusResponse(BaseStatusResponse): .. seealso:: :ref:`pages/faq:how to get server image?` """ + forge_data: JavaForgeData | None + """Forge mod data (mod list, channels, etc) if the server is modded""" @classmethod def build(cls, raw: RawJavaResponse, latency: float = 0) -> Self: @@ -147,6 +134,10 @@ def build(cls, raw: RawJavaResponse, latency: float = 0) -> Self: ``description`` - :class:`str`) are not of the expected type. :return: :class:`JavaStatusResponse` object. """ + forge_data = None + raw_forge_data = raw.get("forgeData") + if raw_forge_data: + forge_data = JavaForgeData.build(raw_forge_data) return cls( raw=raw, players=JavaStatusPlayers.build(raw["players"]), @@ -154,6 +145,7 @@ def build(cls, raw: RawJavaResponse, latency: float = 0) -> Self: motd=Motd.parse(raw["description"], bedrock=False), icon=raw.get("favicon"), latency=latency, + forge_data=forge_data, ) @property @@ -286,37 +278,6 @@ def build(cls, raw: RawJavaResponsePlayers) -> Self: ) -@dataclass -class JavaForgeData(BaseStatusPlayers): - """Class for storing information about forge mods on the server.""" - - truncated: bool - """True if the server had to truncate the response to be able to send successfully - - If true, expect the mods and channels list to be incomplete""" - mods: list[RawJavaForgeDataMod] = {} - """Dictionary of mod IDs to mod versions""" - channels: list[RawJavaForgeDataChannel] = {} - """Dictionary of (mod name, mod id) to (channel version, is required on client)""" - - @classmethod - def build(cls, raw: RawJavaResponseForge) -> Self: - """Build :class:`JavaStatusPlayers` from raw response :class:`dict`. - - :param raw: Raw response :class:`dict`. - :raise ValueError: If the required keys (``online``, ``max``) are not present. - :raise TypeError: - If the required keys (``online`` - :class:`int`, ``max`` - :class:`int`, - ``sample`` - :class:`list`) are not of the expected type. - :return: :class:`JavaStatusPlayers` object. - """ - return cls( - truncated=raw["online"], - mods=raw["mods"], - channels=raw["channels"], - ) - - @dataclass class BedrockStatusPlayers(BaseStatusPlayers): """Class for storing information about players on the server.""" From 92d13a1b965312116e6f5b96fa4cba050a985a95 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 13:32:05 -0500 Subject: [PATCH 03/67] Add tests for forge data decoding --- mcstatus/forge_data.py | 46 +-- mcstatus/status_response.py | 2 +- tests/status_response/test_java.py | 451 ++++++++++++++++++++++++++++- tests/test_forge_data.py | 15 + 4 files changed, 487 insertions(+), 27 deletions(-) create mode 100644 tests/test_forge_data.py diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 4337e447..71e475fe 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -12,7 +12,7 @@ import io from dataclasses import dataclass -from typing import Final, NotRequired, Self, TypedDict +from typing import Final, NotRequired, Self, TYPE_CHECKING, TypedDict from mcstatus.protocol.connection import Connection @@ -21,27 +21,32 @@ IGNORESERVERONLY: Final = "" -class JavaForgeDataChannel(TypedDict): - res: str - """Channel name and id (ex. "fml:handshake")""" - version: str - """Channel version (ex. "1.2.3.4")""" - required: bool - """Is this channel required for client to join""" +if TYPE_CHECKING: + class JavaForgeDataChannel(TypedDict): + res: str + """Channel name and id (ex. "fml:handshake")""" + version: str + """Channel version (ex. "1.2.3.4")""" + required: bool + """Is this channel required for client to join""" -class JavaForgeDataMod(TypedDict): - modid: str - """Mod ID""" - modmarker: str - """Mod version""" + class JavaForgeDataMod(TypedDict): + modid: str + """Mod ID""" + modmarker: str + """Mod version""" + class RawJavaForgeData(TypedDict): + fmlNetworkVersion: int + channels: list[JavaForgeDataChannel] + mods: list[JavaForgeDataMod] + d: NotRequired[str] -class RawJavaForgeData(TypedDict): - fmlNetworkVersion: int - channels: list[JavaForgeDataChannel] - mods: list[JavaForgeDataMod] - d: NotRequired[str] +else: + JavaForgeDataChannel = dict + JavaForgeDataMod = dict + RawJavaForgeData = dict @dataclass @@ -112,12 +117,11 @@ def decode_forge_data(response: RawJavaForgeData) -> JavaForgeData: buffer = decode_optimized(response["d"]) channels: list[JavaForgeDataChannel] = [] - # channels: dict[str, tuple[str, bool]] = {} mods: list[JavaForgeDataMod] = [] + truncated = buffer.read_bool() + mod_size = buffer.read_ushort() try: - truncated = buffer.read_bool() - mod_size = buffer.read_ushort() for _ in range(mod_size): channel_version_flags = buffer.read_varint() diff --git a/mcstatus/status_response.py b/mcstatus/status_response.py index 1abf3474..58b03246 100644 --- a/mcstatus/status_response.py +++ b/mcstatus/status_response.py @@ -4,7 +4,7 @@ from dataclasses import dataclass from typing import Any, TYPE_CHECKING -from mcstatus.forge_data import JavaForgeData +from mcstatus.forge_data import JavaForgeData as JavaForgeData from mcstatus.forge_data import JavaForgeDataChannel as JavaForgeDataChannel from mcstatus.forge_data import JavaForgeDataMod as JavaForgeDataMod from mcstatus.forge_data import RawJavaForgeData diff --git a/tests/status_response/test_java.py b/tests/status_response/test_java.py index ecf5d364..18890658 100644 --- a/tests/status_response/test_java.py +++ b/tests/status_response/test_java.py @@ -1,7 +1,7 @@ from pytest import fixture from mcstatus.motd import Motd -from mcstatus.status_response import JavaStatusPlayer, JavaStatusPlayers, JavaStatusResponse, JavaStatusVersion +from mcstatus.status_response import JavaForgeData, JavaStatusPlayer, JavaStatusPlayers, JavaStatusResponse, JavaStatusVersion from tests.status_response import BaseStatusResponseTest @@ -21,6 +21,7 @@ class TestJavaStatusResponse(BaseStatusResponseTest): ("latency", 0), ("icon", "data:image/png;base64,foo"), ("raw", RAW), + ("forge_data", None), ] OPTIONAL_FIELDS = [("favicon", "icon")], { "players": {"max": 20, "online": 0}, @@ -65,9 +66,18 @@ def build(self): "max": 20, "online": 0, "sample": [ - {"name": "foo", "id": "0b3717c4-f45d-47c8-b8e2-3d9ff6f93a89"}, - {"name": "bar", "id": "61699b2e-d327-4a01-9f1e-0ea8c3f06bc6"}, - {"name": "baz", "id": "40e8d003-8872-412d-b09a-4431a5afcbd4"}, + { + "name": "foo", + "id": "0b3717c4-f45d-47c8-b8e2-3d9ff6f93a89", + }, + { + "name": "bar", + "id": "61699b2e-d327-4a01-9f1e-0ea8c3f06bc6", + }, + { + "name": "baz", + "id": "40e8d003-8872-412d-b09a-4431a5afcbd4", + }, ], } ) @@ -78,7 +88,10 @@ def test_empty_sample_turns_into_empty_list(self): @BaseStatusResponseTest.construct class TestJavaStatusPlayer(BaseStatusResponseTest): - EXPECTED_VALUES = [("name", "foo"), ("id", "0b3717c4-f45d-47c8-b8e2-3d9ff6f93a89")] + EXPECTED_VALUES = [ + ("name", "foo"), + ("id", "0b3717c4-f45d-47c8-b8e2-3d9ff6f93a89"), + ] @fixture(scope="class") def build(self): @@ -99,3 +112,431 @@ class TestJavaStatusVersion(BaseStatusResponseTest): @fixture(scope="class") def build(self): return JavaStatusVersion.build({"name": "1.8-pre1", "protocol": 44}) + + +@BaseStatusResponseTest.construct +class TestJavaStatusVersion(BaseStatusResponseTest): + EXPECTED_VALUES = [ + ("fml_network_version", 3), + ( + "channels", + [ + { + "res": "cyclopscore:channel_main", + "version": "1.0.0", + "required": True, + }, + { + "res": "supermartijn642configlib:sync_configs", + "version": "1", + "required": False, + }, + { + "res": "alexsmobs:main_channel", + "version": "1", + "required": False, + }, + { + "res": "sophisticatedcore:channel", + "version": "1", + "required": False, + }, + { + "res": "rftoolsbase:rftoolsbase", + "version": "1.0", + "required": True, + }, + { + "res": "irongenerators:irongenerators", + "version": "1", + "required": False, + }, + { + "res": "xaeroworldmap:main", + "version": "1.0", + "required": True, + }, + { + "res": "cookingforblockheads:network", + "version": "1.0", + "required": False, + }, + {"res": "xnet:xnet", "version": "1.0", "required": True}, + { + "res": "placebo:placebo", + "version": "1.0.0", + "required": True, + }, + { + "res": "citadel:main_channel", + "version": "1", + "required": False, + }, + { + "res": "sophisticatedbackpacks:channel", + "version": "1", + "required": False, + }, + { + "res": "buildinggadgets:main", + "version": "4", + "required": False, + }, + { + "res": "mekanismgenerators:mekanismgenerators", + "version": "10.2.5", + "required": False, + }, + { + "res": "waila:networking", + "version": "1.0.0", + "required": True, + }, + { + "res": "shetiphiancore:main_channel", + "version": "1.0.0", + "required": False, + }, + { + "res": "dummmmmmy:dummychannel", + "version": "1", + "required": False, + }, + { + "res": "supplementaries:network", + "version": "1", + "required": False, + }, + { + "res": "refinedstorage:main_channel", + "version": "1", + "required": False, + }, + {"res": "corpse:default", "version": "1.0.0", "required": True}, + { + "res": "ping:ping_channel", + "version": "PING1", + "required": True, + }, + { + "res": "ironfurnaces:ironfurnaces_network", + "version": "1.0", + "required": True, + }, + {"res": "botania:main", "version": "0", "required": False}, + {"res": "curios:main", "version": "1", "required": False}, + {"res": "patchouli:main", "version": "1", "required": False}, + {"res": "camera:default", "version": "1.0.0", "required": True}, + { + "res": "libnonymous:channel", + "version": "1.0", + "required": True, + }, + { + "res": "elevatorid:main_channel", + "version": "1", + "required": False, + }, + {"res": "worldedit:cui", "version": "1", "required": True}, + {"res": "worldedit:internal", "version": "1", "required": True}, + {"res": "cfm:network", "version": "1", "required": False}, + { + "res": "architectury:network", + "version": "1", + "required": True, + }, + {"res": "trashcans:main", "version": "1", "required": False}, + {"res": "jei:channel", "version": "1.0.0", "required": True}, + {"res": "ae2:main", "version": "1", "required": True}, + { + "res": "mekanism:mekanism", + "version": "10.2.5", + "required": False, + }, + {"res": "bdlib:multiblock", "version": "2", "required": False}, + {"res": "bdlib:misc", "version": "1", "required": False}, + {"res": "create:main", "version": "1", "required": False}, + { + "res": "waystones:network", + "version": "1.0", + "required": False, + }, + {"res": "comforts:main", "version": "1", "required": False}, + { + "res": "naturescompass:naturescompass", + "version": "1.0", + "required": True, + }, + { + "res": "storagenetwork:main_channel", + "version": "1", + "required": False, + }, + {"res": "cofh_core:general", "version": "1", "required": True}, + { + "res": "mcjtylib:mcjtylib", + "version": "1.0", + "required": True, + }, + { + "res": "mininggadgets:main_network_channel", + "version": "2", + "required": False, + }, + { + "res": "crafttweaker:main", + "version": "1.0.0", + "required": False, + }, + {"res": "akashictome:main", "version": "1", "required": False}, + { + "res": "forge:tier_sorting", + "version": "1.0", + "required": False, + }, + {"res": "forge:split", "version": "1.1", "required": True}, + { + "res": "colossalchests:channel_main", + "version": "1.0.0", + "required": True, + }, + {"res": "selene:network", "version": "1", "required": False}, + { + "res": "craftingtweaks:network", + "version": "1.0", + "required": False, + }, + { + "res": "minecraft:unregister", + "version": "FML3", + "required": True, + }, + { + "res": "minecraft:register", + "version": "FML3", + "required": True, + }, + {"res": "titanium:network", "version": "1.0", "required": True}, + { + "res": "easy_villagers:default", + "version": "1.0.0", + "required": True, + }, + {"res": "pipez:default", "version": "1.0.0", "required": True}, + {"res": "mantle:network", "version": "1", "required": False}, + {"res": "quark:main", "version": "1", "required": False}, + { + "res": "xaerominimap:main", + "version": "1.0", + "required": True, + }, + { + "res": "fastbench:channel", + "version": "4.6.0", + "required": True, + }, + {"res": "polymorph:main", "version": "1", "required": False}, + { + "res": "storagedrawers:main_channel", + "version": "1", + "required": False, + }, + { + "res": "enercell:network", + "version": "0.0.0", + "required": False, + }, + {"res": "appleskin:sync", "version": "1", "required": True}, + { + "res": "modularrouters:main_channel", + "version": "2", + "required": False, + }, + { + "res": "the_vault:network", + "version": "0.26.0", + "required": False, + }, + { + "res": "modernui:fluxnetworks", + "version": "707", + "required": False, + }, + ], + ), + ( + "mods", + [ + {"modid": "rsrequestify", "modmarker": "2.2.0"}, + {"modid": "cyclopscore", "modmarker": "1.15.1"}, + {"modid": "auudio", "modmarker": "1.0.3"}, + {"modid": "auxiliaryblocks", "modmarker": "1.18.2-0.0.14"}, + {"modid": "supermartijn642configlib", "modmarker": "1.1.6"}, + {"modid": "alexsmobs", "modmarker": "1.18.6"}, + {"modid": "architects_palette", "modmarker": "1.1.2"}, + {"modid": "cagerium", "modmarker": "1.18.2-1.1.0"}, + {"modid": "mcwwindows", "modmarker": "2.0.3"}, + { + "modid": "sophisticatedcore", + "modmarker": "1.18.2-0.5.32.179", + }, + {"modid": "thermal", "modmarker": "1.6.3.28"}, + {"modid": "rftoolsbase", "modmarker": "1.18-3.0.9"}, + {"modid": "initialinventory", "modmarker": "6.0.8"}, + {"modid": "irongenerators", "modmarker": "2.0.1"}, + {"modid": "xaeroworldmap", "modmarker": "1.25.1"}, + {"modid": "cookingforblockheads", "modmarker": "12.0.2"}, + { + "modid": "controlling", + "modmarker": "", + }, + {"modid": "xnet", "modmarker": "1.18-4.0.5"}, + {"modid": "placebo", "modmarker": "6.4.1"}, + {"modid": "citadel", "modmarker": "1.11.3"}, + {"modid": "powah", "modmarker": "3.0.1-beta"}, + {"modid": "bookshelf", "modmarker": "13.2.50"}, + {"modid": "lootbeams", "modmarker": "1.18.1"}, + { + "modid": "sophisticatedbackpacks", + "modmarker": "1.18.2-3.18.35.752", + }, + {"modid": "twigs", "modmarker": "1.1.4-patch1+1.18.2"}, + { + "modid": "buildinggadgets", + "modmarker": "3.13.0-build.5+mc1.18.2}", + }, + {"modid": "darkutils", "modmarker": "10.0.5"}, + {"modid": "mcwdoors", "modmarker": "1.0.6"}, + {"modid": "waddles", "modmarker": "1.18.2-0.8.19"}, + {"modid": "mekanismgenerators", "modmarker": "10.2.5"}, + {"modid": "balm", "modmarker": "3.2.0+0"}, + {"modid": "waila", "modmarker": ""}, + {"modid": "jeresources", "modmarker": "0.14.1.171"}, + { + "modid": "cloth_config", + "modmarker": "", + }, + {"modid": "shetiphiancore", "modmarker": "3.10.10"}, + {"modid": "dummmmmmy", "modmarker": "1.18-1.5.2"}, + {"modid": "supplementaries", "modmarker": "1.18.2-1.5.13"}, + {"modid": "refinedstorage", "modmarker": "1.10.2"}, + {"modid": "konkrete", "modmarker": "1.3.3"}, + {"modid": "easy_piglins", "modmarker": "1.18.2-1.0.0"}, + {"modid": "corpse", "modmarker": "1.18.2-1.0.2"}, + {"modid": "packmenu", "modmarker": ""}, + {"modid": "mcwbridges", "modmarker": "2.0.3"}, + {"modid": "torchmaster", "modmarker": "18.1.0"}, + {"modid": "compressium", "modmarker": "1.4.2-build.9+mc1.18.2"}, + {"modid": "ping", "modmarker": "1.18-1.8.0"}, + {"modid": "ironfurnaces", "modmarker": "3.3.1"}, + {"modid": "mcwtrpdoors", "modmarker": "1.0.6"}, + {"modid": "mcwfences", "modmarker": "1.0.5"}, + {"modid": "supermartijn642corelib", "modmarker": "1.0.19"}, + {"modid": "simplylight", "modmarker": "1.18.2-1.4.2-build.31"}, + {"modid": "botania", "modmarker": "1.18.2-434"}, + {"modid": "highlighter", "modmarker": "ANY"}, + {"modid": "spark", "modmarker": ""}, + {"modid": "curios", "modmarker": "1.18.2-5.0.7.1"}, + {"modid": "patchouli", "modmarker": "1.18.2-71.1"}, + {"modid": "camera", "modmarker": "1.18.2-1.0.4"}, + {"modid": "blockcarpentry", "modmarker": "1.18-0.3.0"}, + {"modid": "thermal_foundation", "modmarker": "1.6.3.28"}, + {"modid": "thermal_expansion", "modmarker": "1.6.3.13"}, + {"modid": "libnonymous", "modmarker": "2.1.0"}, + {"modid": "elevatorid", "modmarker": "1.18.2-1.8.4"}, + {"modid": "runelic", "modmarker": "11.0.1"}, + { + "modid": "worldedit", + "modmarker": "", + }, + {"modid": "cfm", "modmarker": "7.0.0-pre29"}, + {"modid": "architectury", "modmarker": "4.9.84"}, + {"modid": "weirdinggadget", "modmarker": "2.2.11"}, + {"modid": "mcwfurnitures", "modmarker": "3.0.0"}, + {"modid": "trashcans", "modmarker": "1.0.15"}, + {"modid": "mcwlights", "modmarker": "1.0.3"}, + {"modid": "cucumber", "modmarker": "5.1.2"}, + {"modid": "snad", "modmarker": "1.18.2-1.22.04.15a"}, + {"modid": "jei", "modmarker": "9.7.0.209"}, + {"modid": "ae2", "modmarker": "11.1.4"}, + {"modid": "mekanism", "modmarker": "10.2.5"}, + {"modid": "bdlib", "modmarker": "1.19.3.7"}, + {"modid": "create", "modmarker": "0.5.0.d"}, + {"modid": "waystones", "modmarker": "10.1.0"}, + {"modid": "clumps", "modmarker": "8.0.0+10"}, + {"modid": "shutupexperimentalsettings", "modmarker": "1.0.5"}, + {"modid": "comforts", "modmarker": "1.18.2-5.0.0.4"}, + {"modid": "naturescompass", "modmarker": "1.18.2-1.9.7-forge"}, + {"modid": "storagenetwork", "modmarker": "1.18.2-1.6.1"}, + {"modid": "framedcompactdrawers", "modmarker": "1.18-4.1.0"}, + {"modid": "decorative_blocks", "modmarker": "2.1.0"}, + {"modid": "botanypots", "modmarker": "8.0.12"}, + {"modid": "ftbbackups2", "modmarker": "1.0.17"}, + {"modid": "cofh_core", "modmarker": "1.6.4.21"}, + {"modid": "mcjtylib", "modmarker": "1.18-6.0.15"}, + {"modid": "ispawner", "modmarker": "1.0"}, + {"modid": "everycomp", "modmarker": "1.18.2-1.5.7"}, + {"modid": "jeitweaker", "modmarker": "3.0.0.8"}, + {"modid": "terralith", "modmarker": "0.0NONE"}, + {"modid": "mininggadgets", "modmarker": "1.11.0"}, + {"modid": "crafttweaker", "modmarker": "9.1.197"}, + {"modid": "akashictome", "modmarker": "1.5-20"}, + {"modid": "forge", "modmarker": "ANY"}, + {"modid": "colossalchests", "modmarker": "1.8.3"}, + {"modid": "selene", "modmarker": "1.18.2-1.17.9"}, + {"modid": "drippyloadingscreen", "modmarker": "1.6.4"}, + { + "modid": "craftingtweaks", + "modmarker": "", + }, + {"modid": "minecraft", "modmarker": "1.18.2"}, + {"modid": "terrablender", "modmarker": "1.18.2-1.1.0.102"}, + { + "modid": "sophisticatedbackpacksvh", + "modmarker": "1.18.2-1.0.4.12", + }, + {"modid": "mousetweaks", "modmarker": "ANY"}, + {"modid": "titanium", "modmarker": "3.5.6"}, + {"modid": "jade", "modmarker": ""}, + {"modid": "createtweaker", "modmarker": "2.0.0.17"}, + {"modid": "easy_villagers", "modmarker": "1.18.2-1.0.10"}, + {"modid": "pipez", "modmarker": "1.18.2-1.1.5"}, + {"modid": "iceberg", "modmarker": "ANY"}, + {"modid": "flywheel", "modmarker": ""}, + {"modid": "mantle", "modmarker": "1.9.27"}, + {"modid": "ecologics", "modmarker": "1.7.3"}, + {"modid": "quark", "modmarker": "3.2-358"}, + {"modid": "xaerominimap", "modmarker": "22.11.1"}, + {"modid": "pigpen", "modmarker": "8.0.1"}, + {"modid": "fastbench", "modmarker": "6.0.2"}, + {"modid": "polymorph", "modmarker": "1.18.2-0.44"}, + {"modid": "autoreglib", "modmarker": "1.7-53"}, + {"modid": "storagedrawers", "modmarker": "10.2.1"}, + {"modid": "fluxnetworks", "modmarker": "7.0.7.8"}, + {"modid": "neoncraft2", "modmarker": "2.2"}, + {"modid": "enercell", "modmarker": "0.0NONE"}, + {"modid": "appleskin", "modmarker": "2.4.0+mc1.18"}, + { + "modid": "ferritecore", + "modmarker": "", + }, + {"modid": "modularrouters", "modmarker": "9.1.1-93"}, + {"modid": "refinedstorageaddons", "modmarker": "0.8.2"}, + {"modid": "openloader", "modmarker": "12.0.1"}, + {"modid": "the_vault", "modmarker": "1.18.2-2.0.10.869"}, + ], + ), + ("truncated", False), + ] + + @fixture(scope="class") + def build(self): + return JavaForgeData.build( + { + "channels": [], + "d": "\u0e8b\x00\x00Ą䠰\u139bᙗ⺮᳙㒺祦搊䢸ű〣ⱡᣞ㞶獰廆ᗉ࠳ዣ䚦ోㆆ慨峜㆕櫻ᘖⷍు᠗〮\x02И⮫ᙇⷭు᠗㌮Ḁ善䯃ᛆ䰭Ṝ㘱捯曖䐵ॱ掃♅ఋ᠗ㄮѨ䱠Ϋ♗ⶮᲘ㒺湪桬ೈ獻ᙦ೭ᩛʱ⸱屢ヘ䮘㛧毬ᯘ㌷杩˦Ä䠐䘐ಭ峞㞶獢戌䒸燁䍢ⶡᩘ⾷档峂ᖹୣ̐䀀ᡄㆹ楨䫨再箛ᜅⶌᴙ㊺ㄅ扜䢸䀁ᘰⳬ岙㪴౭屢惄ᅱዓ◆\u0b8c\x18洊滆◝⍳盶\u2e6eಁ᠗㌮∄㷌䎃㚖⺎壚㨰摥廆ᗉࢋዣ䜆䲋᠖㔮晜㣈㦉玓ౠᡚ㜷汥戂\x00‸嚇⹌ᡛж⸱屬㣌䆑〣乁崙㞷獬䋄ᗍࡓዣ✆ೋ᠗㤮搖写筻㛆ⱎ峘Ʋ⸱ɠ䀀獈䚖\u2d2e嬘㜴敶棜䦽⯋捠䘅ซ܁物峞ᖝ⭳ᜦ溌岛ʹ⸲屠㣄ፈ曷Ⳮ宙㤲瑡擞\u05cdƈ倠⼁ᥘ㞹潷壤㖑̋ၧ䗆ൌᢗ洄勂ඹ熈ጂ@壅㞷楫仜㶙᎓盆汭娚ゲ獤戌㣈熁猢ⷀ崙㞻歲戆䂸ࠁグ䷬ᴛ㞹汬峒ঝ䀠囧二ూᢗⴸ屨㣀↩枀ಭ䃝\u1718İค㇀ᬋ♖ⷬඁᨗㄮ怎ֱ⬛瘦₭\u0b8c\u1718İค▌ண噆䶌ుᢗ⸱ᡦִ獋㗶ⴌᮘ㊷Ŭb᐀简\u1776䴌ೂ᠗ㄮ䑚冕̋ₐ淬嫛㐹汥໌䳄ᅱ勣؆ɀ㞶瑯䫄㖅㎛挐إ䮎Ę猖惞□⎛㚗బᥝㄲ捡惖අ᭛ᄧ◆ฌᤗ㌭扜㣠⦙狣䚦䇌㐱湡䫜ֱƈ倀満婝㦳ㄓ扜傸ũ䘗౮䱚ᢕㄮ屰ࣈၸ\u1756ඍᩙ㎷慧仈冕䎛挱春\u0b8cᚘ畢壒㦑妩㛒䘬ో\u171c紲娈▅୳̀\u2000夂㤰畫勨䶱࠳挃䘅ോЀ捭䣮㶽ᮓၗ׆\u0b8c\x1b眇䣂㆑ᬫთ◆ฌᤗ〭灜䒸ᇉ儠沭ᡚ㒷浳䫎ᖹஓ睆湍䆜᠘㈮橜㑈嬫昖洭孜㊳敮䋤㷑ᮓၧ䘆ಋ᪗\x00䐈ㆅ㭫挰䙅䰋᠕ԃ䋮ㆥ匋因溌ᯝ㖹湩\u0ace㣄熁ጂ怀媂㤲獥櫞\u0dc9ᬫ§◆ഌᢗㄮ扮〄挘䛶洎壗㜷楦ӎ䰸⭃ᝆญ婚㜰潣䫤䰝ॱ挃إ䌌ザ湩䚾֡獳䙖₭\u0b8c\u17180ሄ喐歫囖ⶭṛᢅㄮ婰㣄熩䌢ⲁ孝㲶档峂ᖹୣ̐恀峃㠺汰嫊㦕ணᜦ沭䍜\u1718㠱摜䒴⥱ዣ晦宁㨲潷囤䐅ခ⃠䲮ᩙ㊷獤廨\u05c9⬻ၦ◆ఌᤗ洌勂綹䌚昖ⷍ嬙ᢀ\x00嘐㦽\u135b䙗Ⲯుᦗ㌮᠀֔䮛\u05f7洮嬙㜴\u0c73屢惄ᅱዓ׆\u0b8cĘ挆擞䷁挫挐إஎᚙ⸱屠\u1cc8⬠ᙦຬ崛ᢂ〮恜Є@㘗\u2d6cᥛ㪷\u0a00䛚ঢ়䮓癆沬Ŝ\u1719⸰f倬፻طⶭ᳘㊺ٲ灢䒸ű〃污᭛㤸獥勦㗕ࢳ䋣䗆ୌ㪱汩峈ⳤ᭩挖إஎę瀄峒⦝熈̒▧\u0b8c\u171cర勠ᶹ\u1afbᚆ䷌ᥛʶ䥐ຜӅ怐⚐䷮妛㤺慮䫆ᗍ熘挲إᩅ㞹普擪ֹ⬛眶ⷋ崙㞻歲戆䂸\t傰汭ᴝ㠹潤擞ᗍ熈挂ۅ䉀ㆶ晷峊ᖍ⮛挐䘅ോ\u0b00畳䫠㗉ጋᝇ䵍ඛᤚ潣䫤▱㌓挐䘅䱋\x1c猋嫒㇁揋皖ഌ䕝\u1718㠱摜䒴ⅱ⋣䖦嵘㘴\u2e64扦ᰈ笐ᝆⷌᡚᢅㄮ屰㓈ᦡ䍃ⶠᩘ·0ᘀ■䌻ᛆ೭崚㤲䄃㊜ᐅΘ☗䵮䆀㪱楲曞䐹ॱ掃♅ോ᠗㜮扜㐐䬋ᛦؠ䂀㠄瑡僆喽䭣Ⴖ◆ฌᤗ㜭屢Ⴤ୨暖\u202d\x0ć慣䫚\u05c9ࡣዣ䜆䲋ᢖ〮桜လ㌫嘖ඎ䅝\u1718⸰ɠ㠀挐㛶浬ᡘ㠹湥擨⧥熈֧̒䮌\u17190栤ᖡ殓䘖䯭寙㜺慤勨㦽ࡃ拣旆\u0b8cᰙᄀ僨䦕୫盆ಫ尞㜰楳峞䐡ㅱ㋣◆ೌց楬峄㦽毋囶\u2e6eಁᢗ〮䘎֡獳䙖\u206d\u0b8c\x98ਂ壊妕⌋⛷മ䌙\u1718㠱摜䒴䅱䋣ↆ塛㜴损䋐㦹挫ဖ\x06ǀ㪹敮勘ᦍঈˣ◆䅌㮄牯䣘ᆕ⍋〷⺬䁚\x98椈棜䦕୳ᛆ☠䂀ㆁ浦渖䂸ű˓⹎䲙Μ敮滨䦽\u0b5b̐@ᡃㆹ楨䫨再Ꭻ林䚀๋ᰗܴ䫜巑፻ᚷ☠\x00㮇楥䣤㦥㬻䘖ⳬᴙᤃ㈮扜Ä桨瘶ⳎᲝ㒷畴䫤ᗍ熘挂䘅ɀ㤺獡䛐㦅㎛挐䘅䱋Ț慭峒䐅\x01傐汭嬝㎴瑨૦㣄熁̲愀嵘㪱扭擊吕ॱ⋣\x06᳁シቤ屢惄ᅱዓ䗆ಌ᠗⸴橢\u0984倘ᙖℭ䮎\u171b⸰恤᳤䌘昖ⷍ嬙ᢂ〮恜ࠄ࠘♖\u20c6ౌᢗ㐮娈▅୳ጐ@孂㖲湡曒ᦵƈ⋣◆䈍㊶慫勜㗍࠳挃䙅ോȀ戅壈থࡃዣ䜦ೋᮗ洊壪◑挓㛶\u2d6cಀȀ業䛦䐅ခだ⹌ᡙ㊺〇橜䂸ⅱ偆Ⱝ定ᢀȀ渒斅⎛曷沭䆜᠘ㄮ恜㠜⌫睷湍䃚\u17180ఀㆌ殫㜆Ďஎ\u1718⬰恢栀䎘䝖ຮᥜ㠼牥嫒㦕ண㛆ಮ崝㜴獧戊䂸⥱#污᭛㞳瑲᳦㣄䆉⋣▦\u0b8d\u1718⸰ࡨִ獋ဖ䀆\u0380シ畴䫤\u0dcd死ᜆ湬䒜\u1718㠱摜䒴䥱狣䖦ᯙ㎹\u0e65䋜嗑⮓㜶ⷬ尛㦰ͳ屢Ӏ瀐䜰䷮塜㊳敮滨䦽捛挐إஎᚙ⸱屬ツ୨暖毭娘㜰敮˘Ä\u2000♡Ⱞᥛㆲ浯䋠再ጣ瘗䲮᳜ᢅㄮ婰㣐熉̂Ƞ奙㞱慲勨ᗙዻ盆汭峚ᤂㄮ恜⠀笐ᝆⷌ尞㨷ٳ屰㣀ᆉ〃ುᢝケ正惪䧍࠱ˣ◆\u0dccҁ潣僌ൽ፻ٗ䘡උᨗ㈮\u0e62ᖜ⭳ᜦⶌ䱀Ā洈哆旑䭣㘦䘡ో᚜⸶屠哄桁☶⺍嬞ㄴ\u3103恜\x04䡀ܶ氮宝㤲\u3103恜␀㌨♗漮寘㠶ㄌ扜㣠榑挒䚥\u0dcbԀ敪棒ᗝ嬋♖惮\u0b8c\u1718⸰p値ጫᜧⶌᴚδ⸰ᱠ㤽ሪ僐䴭ᩛ㎷慧仈冕㎛挐☥\u0b8cਘ慭峒㥽⌫睷湍埚㐱湡䫜ֱƐ䀠䱡ᡜ㨳睴䋊ᖭ㮓掐䘥䱋ᮜ洄勂ᖹ熈挂\u0605䂀ゅ慫僦ඥ箣囖\u20cc䮌ᚚ〲娈▅୳̐₀妁㤷敧Ȇ改\u2062嚗湌峗㤷楴仜䐍ű倃\u0e60嬜㨴\u3103扜ࠄᡰ䛶淭峜㘰档曊䷑ࠫˣ旇䌌㐱湡䫜綱୪暖₭\u0b8c\u1718İఄᗌ⭣囦↬䮌ᰘ㈮扚䒸熹玒ⷀ崙㞻歲戂\x00ₘᜦญṜ㞶摡峒䶝ጛ噗ⷌుᬗ㐮ᰆ䦌㌋ᝆ淍崙㊻歡\u0ee6ᖸ㮣⛷浮ీ᠗Ѐ娒㦥ᬫᜦೌ䆝\u1718㠱摜吨፳癗洬崜㤲䘄ᢚӍ၀癗洬崜㤲䘄ᢚӍ怀址乌ᡜ㘱湥䫈䇉熈̒䗇䭌\u1718⸱屠䃄Ƒㆀ෮娜㦴楴䋆ᗑጣ㘖൬塜㖱癳Ố㣄䆉⋣▦\u0b8c\u1718⸴摢Ⰰ筨㝖ಮ川ゲ獫Ȇ改䀒ᝀ⺍官㪴խ屦㣔㦱因溌ᯝ㖹\u3103恜Є倠䘖ಬ䍀㤱慥䫨巑ଫ嚶์ಂ᠗〮扜ࣜ⡰㘖漮嶗㘴慬䫎䷉\u086bዣ䜆䲋ᢖ〮扜᳀⬠ᙦຬ崛ᢂ〮恜ࠄ(ڗ䲮䌞\u1718㠱摜䒴ॱ勣æᥙコ汵૨㣄熁ጂ怀婁㊱敢令Ѝ䩲\x15ು幛㐻敥Ә㐘猋䝆䲭ుᲗ㈮\u0e6eᖸ㮣⛷\u2d6eీ\x00攉廆㶱䬻㘶₮䮌\u171bȳ戊ו宓ぶ䗆䭌᪙и䋚㦥ࠋ\u2003ƀ塞㤲浯峒㖥̋⁷䙆䱋\u1718б䋚㦥ࠛˣ&ƀ㒸灧峊怕űዣ⁆如㦰扴峊\u218d〫ˣ䗆䇌㐱湡䫜ᖱ熠换★䂀㠄汯嫲䦽䎃Ⴖ◆ฌᤗ〭桜ა୨暖\u202d\x0cԀ畡廨ᗉ挻⚖\u20cc䮌᚛㌵ᰄ凌፻瘗ಬ岙㮰牥೦䃄ᅱዣↆ塛㜴损䋐㦹挫ဖ\x06̀㘳硵䫜巑፻㚷惮\u0b8d\u1718⸷p㠨笫㛦⹌ᦘ᤺㈃摜\u2008猨♖Ɱᬙζ⸰ᱠ㤽㨪因溌ᯝ㖹々恜䂸ခ႐ฌ嬜㦲楫ᣜ㣈熡㌂涥ౘᢗи狦ඹࠋဓ䅠ᥙ㤹瑩䛊䦽ጫ僠෭ᵙザ牲櫞ᗑᮓႇ◇䮌ᚘ㌹娘▅筳ص䰭宛㘲㈁\x00䡐㌫暖ಭ᳙㞺慲䫎ᆅ笣㛦®\u0b8c\u171c2帔ᗁ捳ᛶⲌᲙᢃ⸲屠ࣄ⁈嚇䯬塝㘺ᅴ屢惄ᅱ⋓׆䮌᠘㠮牬㠜⌫睷湍ƚ\u1718㘲恜Ѐ梨䛶䲬宜㒺昺櫘㧡⌫睷湍峚ᮁ㜰\x00", + "fmlNetworkVersion": 3, + "mods": [], + "truncated": True, + } + ) diff --git a/tests/test_forge_data.py b/tests/test_forge_data.py new file mode 100644 index 00000000..1d3e21b1 --- /dev/null +++ b/tests/test_forge_data.py @@ -0,0 +1,15 @@ +raw_response = { + "description": { + "text": "motd=\u00a74------ \u00a72 Vault Hunters: 1.18.2 \u00a76VER: See Discord \u00a7c \u00a74------\u00a7r\n \u00a74------ \u00a7e vaulthunters.gg \u00a74------" + }, + "favicon": "", + "forgeData": { + "channels": [], + "d": "\u0e8b\x00\x00Ą䠰\u139bᙗ⺮᳙㒺祦搊䢸ű〣ⱡᣞ㞶獰廆ᗉ࠳ዣ䚦ోㆆ慨峜㆕櫻ᘖⷍు᠗〮\x02И⮫ᙇⷭు᠗㌮Ḁ善䯃ᛆ䰭Ṝ㘱捯曖䐵ॱ掃♅ఋ᠗ㄮѨ䱠Ϋ♗ⶮᲘ㒺湪桬ೈ獻ᙦ೭ᩛʱ⸱屢ヘ䮘㛧毬ᯘ㌷杩˦Ä䠐䘐ಭ峞㞶獢戌䒸燁䍢ⶡᩘ⾷档峂ᖹୣ̐䀀ᡄㆹ楨䫨再箛ᜅⶌᴙ㊺ㄅ扜䢸䀁ᘰⳬ岙㪴౭屢惄ᅱዓ◆\u0b8c\x18洊滆◝⍳盶\u2e6eಁ᠗㌮∄㷌䎃㚖⺎壚㨰摥廆ᗉࢋዣ䜆䲋᠖㔮晜㣈㦉玓ౠᡚ㜷汥戂\x00‸嚇⹌ᡛж⸱屬㣌䆑〣乁崙㞷獬䋄ᗍࡓዣ✆ೋ᠗㤮搖写筻㛆ⱎ峘Ʋ⸱ɠ䀀獈䚖\u2d2e嬘㜴敶棜䦽⯋捠䘅ซ܁物峞ᖝ⭳ᜦ溌岛ʹ⸲屠㣄ፈ曷Ⳮ宙㤲瑡擞\u05cdƈ倠⼁ᥘ㞹潷壤㖑̋ၧ䗆ൌᢗ洄勂ඹ熈ጂ@壅㞷楫仜㶙᎓盆汭娚ゲ獤戌㣈熁猢ⷀ崙㞻歲戆䂸ࠁグ䷬ᴛ㞹汬峒ঝ䀠囧二ూᢗⴸ屨㣀↩枀ಭ䃝\u1718İค㇀ᬋ♖ⷬඁᨗㄮ怎ֱ⬛瘦₭\u0b8c\u1718İค▌ண噆䶌ుᢗ⸱ᡦִ獋㗶ⴌᮘ㊷Ŭb᐀简\u1776䴌ೂ᠗ㄮ䑚冕̋ₐ淬嫛㐹汥໌䳄ᅱ勣؆ɀ㞶瑯䫄㖅㎛挐إ䮎Ę猖惞□⎛㚗బᥝㄲ捡惖අ᭛ᄧ◆ฌᤗ㌭扜㣠⦙狣䚦䇌㐱湡䫜ֱƈ倀満婝㦳ㄓ扜傸ũ䘗౮䱚ᢕㄮ屰ࣈၸ\u1756ඍᩙ㎷慧仈冕䎛挱春\u0b8cᚘ畢壒㦑妩㛒䘬ో\u171c紲娈▅୳̀\u2000夂㤰畫勨䶱࠳挃䘅ോЀ捭䣮㶽ᮓၗ׆\u0b8c\x1b眇䣂㆑ᬫთ◆ฌᤗ〭灜䒸ᇉ儠沭ᡚ㒷浳䫎ᖹஓ睆湍䆜᠘㈮橜㑈嬫昖洭孜㊳敮䋤㷑ᮓၧ䘆ಋ᪗\x00䐈ㆅ㭫挰䙅䰋᠕ԃ䋮ㆥ匋因溌ᯝ㖹湩\u0ace㣄熁ጂ怀媂㤲獥櫞\u0dc9ᬫ§◆ഌᢗㄮ扮〄挘䛶洎壗㜷楦ӎ䰸⭃ᝆญ婚㜰潣䫤䰝ॱ挃إ䌌ザ湩䚾֡獳䙖₭\u0b8c\u17180ሄ喐歫囖ⶭṛᢅㄮ婰㣄熩䌢ⲁ孝㲶档峂ᖹୣ̐恀峃㠺汰嫊㦕ணᜦ沭䍜\u1718㠱摜䒴⥱ዣ晦宁㨲潷囤䐅ခ⃠䲮ᩙ㊷獤廨\u05c9⬻ၦ◆ఌᤗ洌勂綹䌚昖ⷍ嬙ᢀ\x00嘐㦽\u135b䙗Ⲯుᦗ㌮᠀֔䮛\u05f7洮嬙㜴\u0c73屢惄ᅱዓ׆\u0b8cĘ挆擞䷁挫挐إஎᚙ⸱屠\u1cc8⬠ᙦຬ崛ᢂ〮恜Є@㘗\u2d6cᥛ㪷\u0a00䛚ঢ়䮓癆沬Ŝ\u1719⸰f倬፻طⶭ᳘㊺ٲ灢䒸ű〃污᭛㤸獥勦㗕ࢳ䋣䗆ୌ㪱汩峈ⳤ᭩挖إஎę瀄峒⦝熈̒▧\u0b8c\u171cర勠ᶹ\u1afbᚆ䷌ᥛʶ䥐ຜӅ怐⚐䷮妛㤺慮䫆ᗍ熘挲إᩅ㞹普擪ֹ⬛眶ⷋ崙㞻歲戆䂸\t傰汭ᴝ㠹潤擞ᗍ熈挂ۅ䉀ㆶ晷峊ᖍ⮛挐䘅ോ\u0b00畳䫠㗉ጋᝇ䵍ඛᤚ潣䫤▱㌓挐䘅䱋\x1c猋嫒㇁揋皖ഌ䕝\u1718㠱摜䒴ⅱ⋣䖦嵘㘴\u2e64扦ᰈ笐ᝆⷌᡚᢅㄮ屰㓈ᦡ䍃ⶠᩘ·0ᘀ■䌻ᛆ೭崚㤲䄃㊜ᐅΘ☗䵮䆀㪱楲曞䐹ॱ掃♅ോ᠗㜮扜㐐䬋ᛦؠ䂀㠄瑡僆喽䭣Ⴖ◆ฌᤗ㜭屢Ⴤ୨暖\u202d\x0ć慣䫚\u05c9ࡣዣ䜆䲋ᢖ〮桜လ㌫嘖ඎ䅝\u1718⸰ɠ㠀挐㛶浬ᡘ㠹湥擨⧥熈֧̒䮌\u17190栤ᖡ殓䘖䯭寙㜺慤勨㦽ࡃ拣旆\u0b8cᰙᄀ僨䦕୫盆ಫ尞㜰楳峞䐡ㅱ㋣◆ೌց楬峄㦽毋囶\u2e6eಁᢗ〮䘎֡獳䙖\u206d\u0b8c\x98ਂ壊妕⌋⛷മ䌙\u1718㠱摜䒴䅱䋣ↆ塛㜴损䋐㦹挫ဖ\x06ǀ㪹敮勘ᦍঈˣ◆䅌㮄牯䣘ᆕ⍋〷⺬䁚\x98椈棜䦕୳ᛆ☠䂀ㆁ浦渖䂸ű˓⹎䲙Μ敮滨䦽\u0b5b̐@ᡃㆹ楨䫨再Ꭻ林䚀๋ᰗܴ䫜巑፻ᚷ☠\x00㮇楥䣤㦥㬻䘖ⳬᴙᤃ㈮扜Ä桨瘶ⳎᲝ㒷畴䫤ᗍ熘挂䘅ɀ㤺獡䛐㦅㎛挐䘅䱋Ț慭峒䐅\x01傐汭嬝㎴瑨૦㣄熁̲愀嵘㪱扭擊吕ॱ⋣\x06᳁シቤ屢惄ᅱዓ䗆ಌ᠗⸴橢\u0984倘ᙖℭ䮎\u171b⸰恤᳤䌘昖ⷍ嬙ᢂ〮恜ࠄ࠘♖\u20c6ౌᢗ㐮娈▅୳ጐ@孂㖲湡曒ᦵƈ⋣◆䈍㊶慫勜㗍࠳挃䙅ോȀ戅壈থࡃዣ䜦ೋᮗ洊壪◑挓㛶\u2d6cಀȀ業䛦䐅ခだ⹌ᡙ㊺〇橜䂸ⅱ偆Ⱝ定ᢀȀ渒斅⎛曷沭䆜᠘ㄮ恜㠜⌫睷湍䃚\u17180ఀㆌ殫㜆Ďஎ\u1718⬰恢栀䎘䝖ຮᥜ㠼牥嫒㦕ண㛆ಮ崝㜴獧戊䂸⥱#污᭛㞳瑲᳦㣄䆉⋣▦\u0b8d\u1718⸰ࡨִ獋ဖ䀆\u0380シ畴䫤\u0dcd死ᜆ湬䒜\u1718㠱摜䒴䥱狣䖦ᯙ㎹\u0e65䋜嗑⮓㜶ⷬ尛㦰ͳ屢Ӏ瀐䜰䷮塜㊳敮滨䦽捛挐إஎᚙ⸱屬ツ୨暖毭娘㜰敮˘Ä\u2000♡Ⱞᥛㆲ浯䋠再ጣ瘗䲮᳜ᢅㄮ婰㣐熉̂Ƞ奙㞱慲勨ᗙዻ盆汭峚ᤂㄮ恜⠀笐ᝆⷌ尞㨷ٳ屰㣀ᆉ〃ುᢝケ正惪䧍࠱ˣ◆\u0dccҁ潣僌ൽ፻ٗ䘡උᨗ㈮\u0e62ᖜ⭳ᜦⶌ䱀Ā洈哆旑䭣㘦䘡ో᚜⸶屠哄桁☶⺍嬞ㄴ\u3103恜\x04䡀ܶ氮宝㤲\u3103恜␀㌨♗漮寘㠶ㄌ扜㣠榑挒䚥\u0dcbԀ敪棒ᗝ嬋♖惮\u0b8c\u1718⸰p値ጫᜧⶌᴚδ⸰ᱠ㤽ሪ僐䴭ᩛ㎷慧仈冕㎛挐☥\u0b8cਘ慭峒㥽⌫睷湍埚㐱湡䫜ֱƐ䀠䱡ᡜ㨳睴䋊ᖭ㮓掐䘥䱋ᮜ洄勂ᖹ熈挂\u0605䂀ゅ慫僦ඥ箣囖\u20cc䮌ᚚ〲娈▅୳̐₀妁㤷敧Ȇ改\u2062嚗湌峗㤷楴仜䐍ű倃\u0e60嬜㨴\u3103扜ࠄᡰ䛶淭峜㘰档曊䷑ࠫˣ旇䌌㐱湡䫜綱୪暖₭\u0b8c\u1718İఄᗌ⭣囦↬䮌ᰘ㈮扚䒸熹玒ⷀ崙㞻歲戂\x00ₘᜦญṜ㞶摡峒䶝ጛ噗ⷌుᬗ㐮ᰆ䦌㌋ᝆ淍崙㊻歡\u0ee6ᖸ㮣⛷浮ీ᠗Ѐ娒㦥ᬫᜦೌ䆝\u1718㠱摜吨፳癗洬崜㤲䘄ᢚӍ၀癗洬崜㤲䘄ᢚӍ怀址乌ᡜ㘱湥䫈䇉熈̒䗇䭌\u1718⸱屠䃄Ƒㆀ෮娜㦴楴䋆ᗑጣ㘖൬塜㖱癳Ố㣄䆉⋣▦\u0b8c\u1718⸴摢Ⰰ筨㝖ಮ川ゲ獫Ȇ改䀒ᝀ⺍官㪴խ屦㣔㦱因溌ᯝ㖹\u3103恜Є倠䘖ಬ䍀㤱慥䫨巑ଫ嚶์ಂ᠗〮扜ࣜ⡰㘖漮嶗㘴慬䫎䷉\u086bዣ䜆䲋ᢖ〮扜᳀⬠ᙦຬ崛ᢂ〮恜ࠄ(ڗ䲮䌞\u1718㠱摜䒴ॱ勣æᥙコ汵૨㣄熁ጂ怀婁㊱敢令Ѝ䩲\x15ು幛㐻敥Ә㐘猋䝆䲭ుᲗ㈮\u0e6eᖸ㮣⛷\u2d6eీ\x00攉廆㶱䬻㘶₮䮌\u171bȳ戊ו宓ぶ䗆䭌᪙и䋚㦥ࠋ\u2003ƀ塞㤲浯峒㖥̋⁷䙆䱋\u1718б䋚㦥ࠛˣ&ƀ㒸灧峊怕űዣ⁆如㦰扴峊\u218d〫ˣ䗆䇌㐱湡䫜ᖱ熠换★䂀㠄汯嫲䦽䎃Ⴖ◆ฌᤗ〭桜ა୨暖\u202d\x0cԀ畡廨ᗉ挻⚖\u20cc䮌᚛㌵ᰄ凌፻瘗ಬ岙㮰牥೦䃄ᅱዣↆ塛㜴损䋐㦹挫ဖ\x06̀㘳硵䫜巑፻㚷惮\u0b8d\u1718⸷p㠨笫㛦⹌ᦘ᤺㈃摜\u2008猨♖Ɱᬙζ⸰ᱠ㤽㨪因溌ᯝ㖹々恜䂸ခ႐ฌ嬜㦲楫ᣜ㣈熡㌂涥ౘᢗи狦ඹࠋဓ䅠ᥙ㤹瑩䛊䦽ጫ僠෭ᵙザ牲櫞ᗑᮓႇ◇䮌ᚘ㌹娘▅筳ص䰭宛㘲㈁\x00䡐㌫暖ಭ᳙㞺慲䫎ᆅ笣㛦®\u0b8c\u171c2帔ᗁ捳ᛶⲌᲙᢃ⸲屠ࣄ⁈嚇䯬塝㘺ᅴ屢惄ᅱ⋓׆䮌᠘㠮牬㠜⌫睷湍ƚ\u1718㘲恜Ѐ梨䛶䲬宜㒺昺櫘㧡⌫睷湍峚ᮁ㜰\x00", + "fmlNetworkVersion": 3, + "mods": [], + "truncated": true, + }, + "players": {"max": 20, "online": 0}, + "version": {"name": "1.18.2", "protocol": 758}, +} From 55d0c4fa740300317246fafeb0f0e70c47332098 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 13:49:42 -0500 Subject: [PATCH 04/67] Fix syntax --- tests/test_forge_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_forge_data.py b/tests/test_forge_data.py index 1d3e21b1..8f625aa3 100644 --- a/tests/test_forge_data.py +++ b/tests/test_forge_data.py @@ -8,7 +8,7 @@ "d": "\u0e8b\x00\x00Ą䠰\u139bᙗ⺮᳙㒺祦搊䢸ű〣ⱡᣞ㞶獰廆ᗉ࠳ዣ䚦ోㆆ慨峜㆕櫻ᘖⷍు᠗〮\x02И⮫ᙇⷭు᠗㌮Ḁ善䯃ᛆ䰭Ṝ㘱捯曖䐵ॱ掃♅ఋ᠗ㄮѨ䱠Ϋ♗ⶮᲘ㒺湪桬ೈ獻ᙦ೭ᩛʱ⸱屢ヘ䮘㛧毬ᯘ㌷杩˦Ä䠐䘐ಭ峞㞶獢戌䒸燁䍢ⶡᩘ⾷档峂ᖹୣ̐䀀ᡄㆹ楨䫨再箛ᜅⶌᴙ㊺ㄅ扜䢸䀁ᘰⳬ岙㪴౭屢惄ᅱዓ◆\u0b8c\x18洊滆◝⍳盶\u2e6eಁ᠗㌮∄㷌䎃㚖⺎壚㨰摥廆ᗉࢋዣ䜆䲋᠖㔮晜㣈㦉玓ౠᡚ㜷汥戂\x00‸嚇⹌ᡛж⸱屬㣌䆑〣乁崙㞷獬䋄ᗍࡓዣ✆ೋ᠗㤮搖写筻㛆ⱎ峘Ʋ⸱ɠ䀀獈䚖\u2d2e嬘㜴敶棜䦽⯋捠䘅ซ܁物峞ᖝ⭳ᜦ溌岛ʹ⸲屠㣄ፈ曷Ⳮ宙㤲瑡擞\u05cdƈ倠⼁ᥘ㞹潷壤㖑̋ၧ䗆ൌᢗ洄勂ඹ熈ጂ@壅㞷楫仜㶙᎓盆汭娚ゲ獤戌㣈熁猢ⷀ崙㞻歲戆䂸ࠁグ䷬ᴛ㞹汬峒ঝ䀠囧二ూᢗⴸ屨㣀↩枀ಭ䃝\u1718İค㇀ᬋ♖ⷬඁᨗㄮ怎ֱ⬛瘦₭\u0b8c\u1718İค▌ண噆䶌ుᢗ⸱ᡦִ獋㗶ⴌᮘ㊷Ŭb᐀简\u1776䴌ೂ᠗ㄮ䑚冕̋ₐ淬嫛㐹汥໌䳄ᅱ勣؆ɀ㞶瑯䫄㖅㎛挐إ䮎Ę猖惞□⎛㚗బᥝㄲ捡惖අ᭛ᄧ◆ฌᤗ㌭扜㣠⦙狣䚦䇌㐱湡䫜ֱƈ倀満婝㦳ㄓ扜傸ũ䘗౮䱚ᢕㄮ屰ࣈၸ\u1756ඍᩙ㎷慧仈冕䎛挱春\u0b8cᚘ畢壒㦑妩㛒䘬ో\u171c紲娈▅୳̀\u2000夂㤰畫勨䶱࠳挃䘅ോЀ捭䣮㶽ᮓၗ׆\u0b8c\x1b眇䣂㆑ᬫთ◆ฌᤗ〭灜䒸ᇉ儠沭ᡚ㒷浳䫎ᖹஓ睆湍䆜᠘㈮橜㑈嬫昖洭孜㊳敮䋤㷑ᮓၧ䘆ಋ᪗\x00䐈ㆅ㭫挰䙅䰋᠕ԃ䋮ㆥ匋因溌ᯝ㖹湩\u0ace㣄熁ጂ怀媂㤲獥櫞\u0dc9ᬫ§◆ഌᢗㄮ扮〄挘䛶洎壗㜷楦ӎ䰸⭃ᝆญ婚㜰潣䫤䰝ॱ挃إ䌌ザ湩䚾֡獳䙖₭\u0b8c\u17180ሄ喐歫囖ⶭṛᢅㄮ婰㣄熩䌢ⲁ孝㲶档峂ᖹୣ̐恀峃㠺汰嫊㦕ணᜦ沭䍜\u1718㠱摜䒴⥱ዣ晦宁㨲潷囤䐅ခ⃠䲮ᩙ㊷獤廨\u05c9⬻ၦ◆ఌᤗ洌勂綹䌚昖ⷍ嬙ᢀ\x00嘐㦽\u135b䙗Ⲯుᦗ㌮᠀֔䮛\u05f7洮嬙㜴\u0c73屢惄ᅱዓ׆\u0b8cĘ挆擞䷁挫挐إஎᚙ⸱屠\u1cc8⬠ᙦຬ崛ᢂ〮恜Є@㘗\u2d6cᥛ㪷\u0a00䛚ঢ়䮓癆沬Ŝ\u1719⸰f倬፻طⶭ᳘㊺ٲ灢䒸ű〃污᭛㤸獥勦㗕ࢳ䋣䗆ୌ㪱汩峈ⳤ᭩挖إஎę瀄峒⦝熈̒▧\u0b8c\u171cర勠ᶹ\u1afbᚆ䷌ᥛʶ䥐ຜӅ怐⚐䷮妛㤺慮䫆ᗍ熘挲إᩅ㞹普擪ֹ⬛眶ⷋ崙㞻歲戆䂸\t傰汭ᴝ㠹潤擞ᗍ熈挂ۅ䉀ㆶ晷峊ᖍ⮛挐䘅ോ\u0b00畳䫠㗉ጋᝇ䵍ඛᤚ潣䫤▱㌓挐䘅䱋\x1c猋嫒㇁揋皖ഌ䕝\u1718㠱摜䒴ⅱ⋣䖦嵘㘴\u2e64扦ᰈ笐ᝆⷌᡚᢅㄮ屰㓈ᦡ䍃ⶠᩘ·0ᘀ■䌻ᛆ೭崚㤲䄃㊜ᐅΘ☗䵮䆀㪱楲曞䐹ॱ掃♅ോ᠗㜮扜㐐䬋ᛦؠ䂀㠄瑡僆喽䭣Ⴖ◆ฌᤗ㜭屢Ⴤ୨暖\u202d\x0ć慣䫚\u05c9ࡣዣ䜆䲋ᢖ〮桜လ㌫嘖ඎ䅝\u1718⸰ɠ㠀挐㛶浬ᡘ㠹湥擨⧥熈֧̒䮌\u17190栤ᖡ殓䘖䯭寙㜺慤勨㦽ࡃ拣旆\u0b8cᰙᄀ僨䦕୫盆ಫ尞㜰楳峞䐡ㅱ㋣◆ೌց楬峄㦽毋囶\u2e6eಁᢗ〮䘎֡獳䙖\u206d\u0b8c\x98ਂ壊妕⌋⛷മ䌙\u1718㠱摜䒴䅱䋣ↆ塛㜴损䋐㦹挫ဖ\x06ǀ㪹敮勘ᦍঈˣ◆䅌㮄牯䣘ᆕ⍋〷⺬䁚\x98椈棜䦕୳ᛆ☠䂀ㆁ浦渖䂸ű˓⹎䲙Μ敮滨䦽\u0b5b̐@ᡃㆹ楨䫨再Ꭻ林䚀๋ᰗܴ䫜巑፻ᚷ☠\x00㮇楥䣤㦥㬻䘖ⳬᴙᤃ㈮扜Ä桨瘶ⳎᲝ㒷畴䫤ᗍ熘挂䘅ɀ㤺獡䛐㦅㎛挐䘅䱋Ț慭峒䐅\x01傐汭嬝㎴瑨૦㣄熁̲愀嵘㪱扭擊吕ॱ⋣\x06᳁シቤ屢惄ᅱዓ䗆ಌ᠗⸴橢\u0984倘ᙖℭ䮎\u171b⸰恤᳤䌘昖ⷍ嬙ᢂ〮恜ࠄ࠘♖\u20c6ౌᢗ㐮娈▅୳ጐ@孂㖲湡曒ᦵƈ⋣◆䈍㊶慫勜㗍࠳挃䙅ോȀ戅壈থࡃዣ䜦ೋᮗ洊壪◑挓㛶\u2d6cಀȀ業䛦䐅ခだ⹌ᡙ㊺〇橜䂸ⅱ偆Ⱝ定ᢀȀ渒斅⎛曷沭䆜᠘ㄮ恜㠜⌫睷湍䃚\u17180ఀㆌ殫㜆Ďஎ\u1718⬰恢栀䎘䝖ຮᥜ㠼牥嫒㦕ண㛆ಮ崝㜴獧戊䂸⥱#污᭛㞳瑲᳦㣄䆉⋣▦\u0b8d\u1718⸰ࡨִ獋ဖ䀆\u0380シ畴䫤\u0dcd死ᜆ湬䒜\u1718㠱摜䒴䥱狣䖦ᯙ㎹\u0e65䋜嗑⮓㜶ⷬ尛㦰ͳ屢Ӏ瀐䜰䷮塜㊳敮滨䦽捛挐إஎᚙ⸱屬ツ୨暖毭娘㜰敮˘Ä\u2000♡Ⱞᥛㆲ浯䋠再ጣ瘗䲮᳜ᢅㄮ婰㣐熉̂Ƞ奙㞱慲勨ᗙዻ盆汭峚ᤂㄮ恜⠀笐ᝆⷌ尞㨷ٳ屰㣀ᆉ〃ುᢝケ正惪䧍࠱ˣ◆\u0dccҁ潣僌ൽ፻ٗ䘡උᨗ㈮\u0e62ᖜ⭳ᜦⶌ䱀Ā洈哆旑䭣㘦䘡ో᚜⸶屠哄桁☶⺍嬞ㄴ\u3103恜\x04䡀ܶ氮宝㤲\u3103恜␀㌨♗漮寘㠶ㄌ扜㣠榑挒䚥\u0dcbԀ敪棒ᗝ嬋♖惮\u0b8c\u1718⸰p値ጫᜧⶌᴚδ⸰ᱠ㤽ሪ僐䴭ᩛ㎷慧仈冕㎛挐☥\u0b8cਘ慭峒㥽⌫睷湍埚㐱湡䫜ֱƐ䀠䱡ᡜ㨳睴䋊ᖭ㮓掐䘥䱋ᮜ洄勂ᖹ熈挂\u0605䂀ゅ慫僦ඥ箣囖\u20cc䮌ᚚ〲娈▅୳̐₀妁㤷敧Ȇ改\u2062嚗湌峗㤷楴仜䐍ű倃\u0e60嬜㨴\u3103扜ࠄᡰ䛶淭峜㘰档曊䷑ࠫˣ旇䌌㐱湡䫜綱୪暖₭\u0b8c\u1718İఄᗌ⭣囦↬䮌ᰘ㈮扚䒸熹玒ⷀ崙㞻歲戂\x00ₘᜦญṜ㞶摡峒䶝ጛ噗ⷌుᬗ㐮ᰆ䦌㌋ᝆ淍崙㊻歡\u0ee6ᖸ㮣⛷浮ీ᠗Ѐ娒㦥ᬫᜦೌ䆝\u1718㠱摜吨፳癗洬崜㤲䘄ᢚӍ၀癗洬崜㤲䘄ᢚӍ怀址乌ᡜ㘱湥䫈䇉熈̒䗇䭌\u1718⸱屠䃄Ƒㆀ෮娜㦴楴䋆ᗑጣ㘖൬塜㖱癳Ố㣄䆉⋣▦\u0b8c\u1718⸴摢Ⰰ筨㝖ಮ川ゲ獫Ȇ改䀒ᝀ⺍官㪴խ屦㣔㦱因溌ᯝ㖹\u3103恜Є倠䘖ಬ䍀㤱慥䫨巑ଫ嚶์ಂ᠗〮扜ࣜ⡰㘖漮嶗㘴慬䫎䷉\u086bዣ䜆䲋ᢖ〮扜᳀⬠ᙦຬ崛ᢂ〮恜ࠄ(ڗ䲮䌞\u1718㠱摜䒴ॱ勣æᥙコ汵૨㣄熁ጂ怀婁㊱敢令Ѝ䩲\x15ು幛㐻敥Ә㐘猋䝆䲭ుᲗ㈮\u0e6eᖸ㮣⛷\u2d6eీ\x00攉廆㶱䬻㘶₮䮌\u171bȳ戊ו宓ぶ䗆䭌᪙и䋚㦥ࠋ\u2003ƀ塞㤲浯峒㖥̋⁷䙆䱋\u1718б䋚㦥ࠛˣ&ƀ㒸灧峊怕űዣ⁆如㦰扴峊\u218d〫ˣ䗆䇌㐱湡䫜ᖱ熠换★䂀㠄汯嫲䦽䎃Ⴖ◆ฌᤗ〭桜ა୨暖\u202d\x0cԀ畡廨ᗉ挻⚖\u20cc䮌᚛㌵ᰄ凌፻瘗ಬ岙㮰牥೦䃄ᅱዣↆ塛㜴损䋐㦹挫ဖ\x06̀㘳硵䫜巑፻㚷惮\u0b8d\u1718⸷p㠨笫㛦⹌ᦘ᤺㈃摜\u2008猨♖Ɱᬙζ⸰ᱠ㤽㨪因溌ᯝ㖹々恜䂸ခ႐ฌ嬜㦲楫ᣜ㣈熡㌂涥ౘᢗи狦ඹࠋဓ䅠ᥙ㤹瑩䛊䦽ጫ僠෭ᵙザ牲櫞ᗑᮓႇ◇䮌ᚘ㌹娘▅筳ص䰭宛㘲㈁\x00䡐㌫暖ಭ᳙㞺慲䫎ᆅ笣㛦®\u0b8c\u171c2帔ᗁ捳ᛶⲌᲙᢃ⸲屠ࣄ⁈嚇䯬塝㘺ᅴ屢惄ᅱ⋓׆䮌᠘㠮牬㠜⌫睷湍ƚ\u1718㘲恜Ѐ梨䛶䲬宜㒺昺櫘㧡⌫睷湍峚ᮁ㜰\x00", "fmlNetworkVersion": 3, "mods": [], - "truncated": true, + "truncated": True, }, "players": {"max": 20, "online": 0}, "version": {"name": "1.18.2", "protocol": 758}, From 8cf8d4ba020ef9232dc594f4fe3454aa92c68143 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 14:03:57 -0500 Subject: [PATCH 05/67] Add periods to docstrings Co-authored-by: Perchun Pak --- mcstatus/forge_data.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 71e475fe..e8f070aa 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -25,11 +25,11 @@ class JavaForgeDataChannel(TypedDict): res: str - """Channel name and id (ex. "fml:handshake")""" + """Channel name and ID (for example ``fml:handshake``).""" version: str - """Channel version (ex. "1.2.3.4")""" + """Channel version (for example ``1.2.3.4``).""" required: bool - """Is this channel required for client to join""" + """Is this channel required for client to join?""" class JavaForgeDataMod(TypedDict): modid: str From 412d6e8f99ebc49a6ac552d18e3269502776db76 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 14:05:08 -0500 Subject: [PATCH 06/67] Rename JavaForge things to Forge, Forge implies Java --- mcstatus/forge_data.py | 44 ++++++++++++++++++------------------- mcstatus/status_response.py | 14 ++++++------ 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index e8f070aa..62b10a50 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -23,7 +23,7 @@ if TYPE_CHECKING: - class JavaForgeDataChannel(TypedDict): + class ForgeDataChannel(TypedDict): res: str """Channel name and ID (for example ``fml:handshake``).""" version: str @@ -31,41 +31,41 @@ class JavaForgeDataChannel(TypedDict): required: bool """Is this channel required for client to join?""" - class JavaForgeDataMod(TypedDict): + class ForgeDataMod(TypedDict): modid: str """Mod ID""" modmarker: str """Mod version""" - class RawJavaForgeData(TypedDict): + class RawForgeData(TypedDict): fmlNetworkVersion: int - channels: list[JavaForgeDataChannel] - mods: list[JavaForgeDataMod] + channels: list[ForgeDataChannel] + mods: list[ForgeDataMod] d: NotRequired[str] else: - JavaForgeDataChannel = dict - JavaForgeDataMod = dict - RawJavaForgeData = dict + ForgeDataChannel = dict + ForgeDataMod = dict + RawForgeData = dict @dataclass -class JavaForgeData: +class ForgeData: fml_network_version: int """Forge Mod Loader network version""" - channels: list[JavaForgeDataChannel] + channels: list[ForgeDataChannel] """List of channels, both for mods and non-mods""" - mods: list[JavaForgeDataMod] + mods: list[ForgeDataMod] """List of mods""" truncated: bool """Is the mods list and or channel list incomplete?""" @classmethod - def build(cls, raw: RawJavaForgeData) -> Self: - """Build :class:`JavaForgeData` from raw response :class:`dict`. + def build(cls, raw: RawForgeData) -> Self: + """Build :class:`ForgeData` from raw response :class:`dict`. :param raw: Raw forge data response :class:`dict`. - :return: :class:`JavaForgeData` object. + :return: :class:`ForgeData` object. """ raw.setdefault("fmlNetworkVersion", 0) raw.setdefault("channels", []) @@ -103,11 +103,11 @@ def read() -> int: return buffer -def decode_forge_data(response: RawJavaForgeData) -> JavaForgeData: +def decode_forge_data(response: RawForgeData) -> ForgeData: "Return decoded forgeData if present or None" if "d" not in response: - return JavaForgeData( + return ForgeData( fml_network_version=response["fmlNetworkVersion"], channels=response["channels"], mods=response["mods"], @@ -116,8 +116,8 @@ def decode_forge_data(response: RawJavaForgeData) -> JavaForgeData: buffer = decode_optimized(response["d"]) - channels: list[JavaForgeDataChannel] = [] - mods: list[JavaForgeDataMod] = [] + channels: list[ForgeDataChannel] = [] + mods: list[ForgeDataMod] = [] truncated = buffer.read_bool() mod_size = buffer.read_ushort() @@ -138,7 +138,7 @@ def decode_forge_data(response: RawJavaForgeData) -> JavaForgeData: version = buffer.read_utf() client_required = buffer.read_bool() channels.append( - JavaForgeDataChannel( + ForgeDataChannel( { "res": f"{mod_id}:{name}", "version": version, @@ -148,7 +148,7 @@ def decode_forge_data(response: RawJavaForgeData) -> JavaForgeData: ) mods.append( - JavaForgeDataMod( + ForgeDataMod( { "modid": mod_id, "modmarker": mod_version, @@ -162,7 +162,7 @@ def decode_forge_data(response: RawJavaForgeData) -> JavaForgeData: version = buffer.read_utf() client_required = buffer.read_bool() channels.append( - JavaForgeDataChannel( + ForgeDataChannel( { "res": channel_identifier, "version": version, @@ -175,7 +175,7 @@ def decode_forge_data(response: RawJavaForgeData) -> JavaForgeData: raise # Semi-expect errors if truncated - return JavaForgeData( + return ForgeData( fml_network_version=response["fmlNetworkVersion"], channels=channels, mods=mods, diff --git a/mcstatus/status_response.py b/mcstatus/status_response.py index 58b03246..9043d9a1 100644 --- a/mcstatus/status_response.py +++ b/mcstatus/status_response.py @@ -4,10 +4,10 @@ from dataclasses import dataclass from typing import Any, TYPE_CHECKING -from mcstatus.forge_data import JavaForgeData as JavaForgeData -from mcstatus.forge_data import JavaForgeDataChannel as JavaForgeDataChannel -from mcstatus.forge_data import JavaForgeDataMod as JavaForgeDataMod -from mcstatus.forge_data import RawJavaForgeData +from mcstatus.forge_data import ForgeData as ForgeData +from mcstatus.forge_data import ForgeDataChannel as ForgeDataChannel +from mcstatus.forge_data import ForgeDataMod as ForgeDataMod +from mcstatus.forge_data import RawForgeData from mcstatus.motd import Motd if TYPE_CHECKING: @@ -45,7 +45,7 @@ class RawJavaResponse(TypedDict): players: RawJavaResponsePlayers version: RawJavaResponseVersion favicon: NotRequired[str] - forge_data: NotRequired[RawJavaForgeData] + forge_data: NotRequired[RawForgeData] else: RawJavaResponsePlayer = dict @@ -119,7 +119,7 @@ class JavaStatusResponse(BaseStatusResponse): .. seealso:: :ref:`pages/faq:how to get server image?` """ - forge_data: JavaForgeData | None + forge_data: ForgeData | None """Forge mod data (mod list, channels, etc) if the server is modded""" @classmethod @@ -137,7 +137,7 @@ def build(cls, raw: RawJavaResponse, latency: float = 0) -> Self: forge_data = None raw_forge_data = raw.get("forgeData") if raw_forge_data: - forge_data = JavaForgeData.build(raw_forge_data) + forge_data = ForgeData.build(raw_forge_data) return cls( raw=raw, players=JavaStatusPlayers.build(raw["players"]), From 7236865c4d010ae147686950d5182c6ba0750407 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 14:07:36 -0500 Subject: [PATCH 07/67] Forgot prefix in tests --- tests/status_response/test_java.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/status_response/test_java.py b/tests/status_response/test_java.py index 18890658..55a369ec 100644 --- a/tests/status_response/test_java.py +++ b/tests/status_response/test_java.py @@ -1,7 +1,7 @@ from pytest import fixture from mcstatus.motd import Motd -from mcstatus.status_response import JavaForgeData, JavaStatusPlayer, JavaStatusPlayers, JavaStatusResponse, JavaStatusVersion +from mcstatus.status_response import ForgeData, JavaStatusPlayer, JavaStatusPlayers, JavaStatusResponse, JavaStatusVersion from tests.status_response import BaseStatusResponseTest @@ -531,7 +531,7 @@ class TestJavaStatusVersion(BaseStatusResponseTest): @fixture(scope="class") def build(self): - return JavaForgeData.build( + return ForgeData.build( { "channels": [], "d": "\u0e8b\x00\x00Ą䠰\u139bᙗ⺮᳙㒺祦搊䢸ű〣ⱡᣞ㞶獰廆ᗉ࠳ዣ䚦ోㆆ慨峜㆕櫻ᘖⷍు᠗〮\x02И⮫ᙇⷭు᠗㌮Ḁ善䯃ᛆ䰭Ṝ㘱捯曖䐵ॱ掃♅ఋ᠗ㄮѨ䱠Ϋ♗ⶮᲘ㒺湪桬ೈ獻ᙦ೭ᩛʱ⸱屢ヘ䮘㛧毬ᯘ㌷杩˦Ä䠐䘐ಭ峞㞶獢戌䒸燁䍢ⶡᩘ⾷档峂ᖹୣ̐䀀ᡄㆹ楨䫨再箛ᜅⶌᴙ㊺ㄅ扜䢸䀁ᘰⳬ岙㪴౭屢惄ᅱዓ◆\u0b8c\x18洊滆◝⍳盶\u2e6eಁ᠗㌮∄㷌䎃㚖⺎壚㨰摥廆ᗉࢋዣ䜆䲋᠖㔮晜㣈㦉玓ౠᡚ㜷汥戂\x00‸嚇⹌ᡛж⸱屬㣌䆑〣乁崙㞷獬䋄ᗍࡓዣ✆ೋ᠗㤮搖写筻㛆ⱎ峘Ʋ⸱ɠ䀀獈䚖\u2d2e嬘㜴敶棜䦽⯋捠䘅ซ܁物峞ᖝ⭳ᜦ溌岛ʹ⸲屠㣄ፈ曷Ⳮ宙㤲瑡擞\u05cdƈ倠⼁ᥘ㞹潷壤㖑̋ၧ䗆ൌᢗ洄勂ඹ熈ጂ@壅㞷楫仜㶙᎓盆汭娚ゲ獤戌㣈熁猢ⷀ崙㞻歲戆䂸ࠁグ䷬ᴛ㞹汬峒ঝ䀠囧二ూᢗⴸ屨㣀↩枀ಭ䃝\u1718İค㇀ᬋ♖ⷬඁᨗㄮ怎ֱ⬛瘦₭\u0b8c\u1718İค▌ண噆䶌ుᢗ⸱ᡦִ獋㗶ⴌᮘ㊷Ŭb᐀简\u1776䴌ೂ᠗ㄮ䑚冕̋ₐ淬嫛㐹汥໌䳄ᅱ勣؆ɀ㞶瑯䫄㖅㎛挐إ䮎Ę猖惞□⎛㚗బᥝㄲ捡惖අ᭛ᄧ◆ฌᤗ㌭扜㣠⦙狣䚦䇌㐱湡䫜ֱƈ倀満婝㦳ㄓ扜傸ũ䘗౮䱚ᢕㄮ屰ࣈၸ\u1756ඍᩙ㎷慧仈冕䎛挱春\u0b8cᚘ畢壒㦑妩㛒䘬ో\u171c紲娈▅୳̀\u2000夂㤰畫勨䶱࠳挃䘅ോЀ捭䣮㶽ᮓၗ׆\u0b8c\x1b眇䣂㆑ᬫთ◆ฌᤗ〭灜䒸ᇉ儠沭ᡚ㒷浳䫎ᖹஓ睆湍䆜᠘㈮橜㑈嬫昖洭孜㊳敮䋤㷑ᮓၧ䘆ಋ᪗\x00䐈ㆅ㭫挰䙅䰋᠕ԃ䋮ㆥ匋因溌ᯝ㖹湩\u0ace㣄熁ጂ怀媂㤲獥櫞\u0dc9ᬫ§◆ഌᢗㄮ扮〄挘䛶洎壗㜷楦ӎ䰸⭃ᝆญ婚㜰潣䫤䰝ॱ挃إ䌌ザ湩䚾֡獳䙖₭\u0b8c\u17180ሄ喐歫囖ⶭṛᢅㄮ婰㣄熩䌢ⲁ孝㲶档峂ᖹୣ̐恀峃㠺汰嫊㦕ணᜦ沭䍜\u1718㠱摜䒴⥱ዣ晦宁㨲潷囤䐅ခ⃠䲮ᩙ㊷獤廨\u05c9⬻ၦ◆ఌᤗ洌勂綹䌚昖ⷍ嬙ᢀ\x00嘐㦽\u135b䙗Ⲯుᦗ㌮᠀֔䮛\u05f7洮嬙㜴\u0c73屢惄ᅱዓ׆\u0b8cĘ挆擞䷁挫挐إஎᚙ⸱屠\u1cc8⬠ᙦຬ崛ᢂ〮恜Є@㘗\u2d6cᥛ㪷\u0a00䛚ঢ়䮓癆沬Ŝ\u1719⸰f倬፻طⶭ᳘㊺ٲ灢䒸ű〃污᭛㤸獥勦㗕ࢳ䋣䗆ୌ㪱汩峈ⳤ᭩挖إஎę瀄峒⦝熈̒▧\u0b8c\u171cర勠ᶹ\u1afbᚆ䷌ᥛʶ䥐ຜӅ怐⚐䷮妛㤺慮䫆ᗍ熘挲إᩅ㞹普擪ֹ⬛眶ⷋ崙㞻歲戆䂸\t傰汭ᴝ㠹潤擞ᗍ熈挂ۅ䉀ㆶ晷峊ᖍ⮛挐䘅ോ\u0b00畳䫠㗉ጋᝇ䵍ඛᤚ潣䫤▱㌓挐䘅䱋\x1c猋嫒㇁揋皖ഌ䕝\u1718㠱摜䒴ⅱ⋣䖦嵘㘴\u2e64扦ᰈ笐ᝆⷌᡚᢅㄮ屰㓈ᦡ䍃ⶠᩘ·0ᘀ■䌻ᛆ೭崚㤲䄃㊜ᐅΘ☗䵮䆀㪱楲曞䐹ॱ掃♅ോ᠗㜮扜㐐䬋ᛦؠ䂀㠄瑡僆喽䭣Ⴖ◆ฌᤗ㜭屢Ⴤ୨暖\u202d\x0ć慣䫚\u05c9ࡣዣ䜆䲋ᢖ〮桜လ㌫嘖ඎ䅝\u1718⸰ɠ㠀挐㛶浬ᡘ㠹湥擨⧥熈֧̒䮌\u17190栤ᖡ殓䘖䯭寙㜺慤勨㦽ࡃ拣旆\u0b8cᰙᄀ僨䦕୫盆ಫ尞㜰楳峞䐡ㅱ㋣◆ೌց楬峄㦽毋囶\u2e6eಁᢗ〮䘎֡獳䙖\u206d\u0b8c\x98ਂ壊妕⌋⛷മ䌙\u1718㠱摜䒴䅱䋣ↆ塛㜴损䋐㦹挫ဖ\x06ǀ㪹敮勘ᦍঈˣ◆䅌㮄牯䣘ᆕ⍋〷⺬䁚\x98椈棜䦕୳ᛆ☠䂀ㆁ浦渖䂸ű˓⹎䲙Μ敮滨䦽\u0b5b̐@ᡃㆹ楨䫨再Ꭻ林䚀๋ᰗܴ䫜巑፻ᚷ☠\x00㮇楥䣤㦥㬻䘖ⳬᴙᤃ㈮扜Ä桨瘶ⳎᲝ㒷畴䫤ᗍ熘挂䘅ɀ㤺獡䛐㦅㎛挐䘅䱋Ț慭峒䐅\x01傐汭嬝㎴瑨૦㣄熁̲愀嵘㪱扭擊吕ॱ⋣\x06᳁シቤ屢惄ᅱዓ䗆ಌ᠗⸴橢\u0984倘ᙖℭ䮎\u171b⸰恤᳤䌘昖ⷍ嬙ᢂ〮恜ࠄ࠘♖\u20c6ౌᢗ㐮娈▅୳ጐ@孂㖲湡曒ᦵƈ⋣◆䈍㊶慫勜㗍࠳挃䙅ോȀ戅壈থࡃዣ䜦ೋᮗ洊壪◑挓㛶\u2d6cಀȀ業䛦䐅ခだ⹌ᡙ㊺〇橜䂸ⅱ偆Ⱝ定ᢀȀ渒斅⎛曷沭䆜᠘ㄮ恜㠜⌫睷湍䃚\u17180ఀㆌ殫㜆Ďஎ\u1718⬰恢栀䎘䝖ຮᥜ㠼牥嫒㦕ண㛆ಮ崝㜴獧戊䂸⥱#污᭛㞳瑲᳦㣄䆉⋣▦\u0b8d\u1718⸰ࡨִ獋ဖ䀆\u0380シ畴䫤\u0dcd死ᜆ湬䒜\u1718㠱摜䒴䥱狣䖦ᯙ㎹\u0e65䋜嗑⮓㜶ⷬ尛㦰ͳ屢Ӏ瀐䜰䷮塜㊳敮滨䦽捛挐إஎᚙ⸱屬ツ୨暖毭娘㜰敮˘Ä\u2000♡Ⱞᥛㆲ浯䋠再ጣ瘗䲮᳜ᢅㄮ婰㣐熉̂Ƞ奙㞱慲勨ᗙዻ盆汭峚ᤂㄮ恜⠀笐ᝆⷌ尞㨷ٳ屰㣀ᆉ〃ುᢝケ正惪䧍࠱ˣ◆\u0dccҁ潣僌ൽ፻ٗ䘡උᨗ㈮\u0e62ᖜ⭳ᜦⶌ䱀Ā洈哆旑䭣㘦䘡ో᚜⸶屠哄桁☶⺍嬞ㄴ\u3103恜\x04䡀ܶ氮宝㤲\u3103恜␀㌨♗漮寘㠶ㄌ扜㣠榑挒䚥\u0dcbԀ敪棒ᗝ嬋♖惮\u0b8c\u1718⸰p値ጫᜧⶌᴚδ⸰ᱠ㤽ሪ僐䴭ᩛ㎷慧仈冕㎛挐☥\u0b8cਘ慭峒㥽⌫睷湍埚㐱湡䫜ֱƐ䀠䱡ᡜ㨳睴䋊ᖭ㮓掐䘥䱋ᮜ洄勂ᖹ熈挂\u0605䂀ゅ慫僦ඥ箣囖\u20cc䮌ᚚ〲娈▅୳̐₀妁㤷敧Ȇ改\u2062嚗湌峗㤷楴仜䐍ű倃\u0e60嬜㨴\u3103扜ࠄᡰ䛶淭峜㘰档曊䷑ࠫˣ旇䌌㐱湡䫜綱୪暖₭\u0b8c\u1718İఄᗌ⭣囦↬䮌ᰘ㈮扚䒸熹玒ⷀ崙㞻歲戂\x00ₘᜦญṜ㞶摡峒䶝ጛ噗ⷌుᬗ㐮ᰆ䦌㌋ᝆ淍崙㊻歡\u0ee6ᖸ㮣⛷浮ీ᠗Ѐ娒㦥ᬫᜦೌ䆝\u1718㠱摜吨፳癗洬崜㤲䘄ᢚӍ၀癗洬崜㤲䘄ᢚӍ怀址乌ᡜ㘱湥䫈䇉熈̒䗇䭌\u1718⸱屠䃄Ƒㆀ෮娜㦴楴䋆ᗑጣ㘖൬塜㖱癳Ố㣄䆉⋣▦\u0b8c\u1718⸴摢Ⰰ筨㝖ಮ川ゲ獫Ȇ改䀒ᝀ⺍官㪴խ屦㣔㦱因溌ᯝ㖹\u3103恜Є倠䘖ಬ䍀㤱慥䫨巑ଫ嚶์ಂ᠗〮扜ࣜ⡰㘖漮嶗㘴慬䫎䷉\u086bዣ䜆䲋ᢖ〮扜᳀⬠ᙦຬ崛ᢂ〮恜ࠄ(ڗ䲮䌞\u1718㠱摜䒴ॱ勣æᥙコ汵૨㣄熁ጂ怀婁㊱敢令Ѝ䩲\x15ು幛㐻敥Ә㐘猋䝆䲭ుᲗ㈮\u0e6eᖸ㮣⛷\u2d6eీ\x00攉廆㶱䬻㘶₮䮌\u171bȳ戊ו宓ぶ䗆䭌᪙и䋚㦥ࠋ\u2003ƀ塞㤲浯峒㖥̋⁷䙆䱋\u1718б䋚㦥ࠛˣ&ƀ㒸灧峊怕űዣ⁆如㦰扴峊\u218d〫ˣ䗆䇌㐱湡䫜ᖱ熠换★䂀㠄汯嫲䦽䎃Ⴖ◆ฌᤗ〭桜ა୨暖\u202d\x0cԀ畡廨ᗉ挻⚖\u20cc䮌᚛㌵ᰄ凌፻瘗ಬ岙㮰牥೦䃄ᅱዣↆ塛㜴损䋐㦹挫ဖ\x06̀㘳硵䫜巑፻㚷惮\u0b8d\u1718⸷p㠨笫㛦⹌ᦘ᤺㈃摜\u2008猨♖Ɱᬙζ⸰ᱠ㤽㨪因溌ᯝ㖹々恜䂸ခ႐ฌ嬜㦲楫ᣜ㣈熡㌂涥ౘᢗи狦ඹࠋဓ䅠ᥙ㤹瑩䛊䦽ጫ僠෭ᵙザ牲櫞ᗑᮓႇ◇䮌ᚘ㌹娘▅筳ص䰭宛㘲㈁\x00䡐㌫暖ಭ᳙㞺慲䫎ᆅ笣㛦®\u0b8c\u171c2帔ᗁ捳ᛶⲌᲙᢃ⸲屠ࣄ⁈嚇䯬塝㘺ᅴ屢惄ᅱ⋓׆䮌᠘㠮牬㠜⌫睷湍ƚ\u1718㘲恜Ѐ梨䛶䲬宜㒺昺櫘㧡⌫睷湍峚ᮁ㜰\x00", From 4e408b661c20437173b75854b4dbcc5e5066714e Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 14:10:24 -0500 Subject: [PATCH 08/67] Apply suggestions from code review Co-authored-by: Perchun Pak --- mcstatus/forge_data.py | 6 ++---- mcstatus/status_response.py | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 62b10a50..f21498ee 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -18,7 +18,7 @@ VERSION_FLAG_IGNORESERVERONLY: Final = 0b1 # IGNORESERVERONLY: Final = 'OHNOES\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31' # noqa -IGNORESERVERONLY: Final = "" +IGNORE_SERVER_ONLY: Final = "" if TYPE_CHECKING: @@ -33,7 +33,6 @@ class ForgeDataChannel(TypedDict): class ForgeDataMod(TypedDict): modid: str - """Mod ID""" modmarker: str """Mod version""" @@ -86,8 +85,7 @@ def read() -> int: size = read() | (read() << 15) buffer = Connection() - value = 0 - bits = 0 + value, bits = 0, 0 for _ in range(len(string) - 2): while bits >= 8: buffer.receive((value & 0xFF).to_bytes(length=1, byteorder="big", signed=False)) diff --git a/mcstatus/status_response.py b/mcstatus/status_response.py index 9043d9a1..395ce164 100644 --- a/mcstatus/status_response.py +++ b/mcstatus/status_response.py @@ -145,7 +145,7 @@ def build(cls, raw: RawJavaResponse, latency: float = 0) -> Self: motd=Motd.parse(raw["description"], bedrock=False), icon=raw.get("favicon"), latency=latency, - forge_data=forge_data, + forge_data=JavaForgeData.build(raw["forgeData"]) if "forgeData" in raw else None, ) @property From d74df882f20418d2029f947a50d3a086fcc7a5bc Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 14:28:11 -0500 Subject: [PATCH 09/67] Complete more fixes from @PerchunPak 's review --- mcstatus/forge_data.py | 22 +++++++++++----------- mcstatus/status_response.py | 4 ---- tests/status_response/test_java.py | 22 +++++----------------- tests/test_forge_data.py | 15 --------------- 4 files changed, 16 insertions(+), 47 deletions(-) delete mode 100644 tests/test_forge_data.py diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index f21498ee..73cd7b85 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -6,7 +6,7 @@ and a list of mods the server has. For more information see this file from forge itself: -https://github.com/MinecraftForge/MinecraftForge/blob/42115d37d6a46856e3dc914b54a1ce6d33b9872a/src/main/java/net/minecraftforge/network/ServerStatusPing.java""" # noqa: E501 +https://github.com/MinecraftForge/MinecraftForge/blob/42115d37d6a46856e3dc914b54a1ce6d33b9872a/src/main/java/net/minecraftforge/network/ServerStatusPing.java""" from __future__ import annotations @@ -16,8 +16,8 @@ from mcstatus.protocol.connection import Connection -VERSION_FLAG_IGNORESERVERONLY: Final = 0b1 -# IGNORESERVERONLY: Final = 'OHNOES\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31' # noqa +VERSION_FLAG_IGNORE_SERVER_ONLY: Final = 0b1 +# IGNORE_SERVER_ONLY: Final = 'OHNOES\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31' # noqa IGNORE_SERVER_ONLY: Final = "" @@ -51,9 +51,9 @@ class RawForgeData(TypedDict): @dataclass class ForgeData: fml_network_version: int - """Forge Mod Loader network version""" + """Forge Mod Loader network version.""" channels: list[ForgeDataChannel] - """List of channels, both for mods and non-mods""" + """List of channels, both for mods and non-mods.""" mods: list[ForgeDataMod] """List of mods""" truncated: bool @@ -73,7 +73,7 @@ def build(cls, raw: RawForgeData) -> Self: def decode_optimized(string: str) -> Connection: - """Decode buffer UTF-16 optimized binary data from `string`""" + """Decode buffer UTF-16 optimized binary data from `string`.""" text = io.StringIO(string) def read() -> int: @@ -102,7 +102,7 @@ def read() -> int: def decode_forge_data(response: RawForgeData) -> ForgeData: - "Return decoded forgeData if present or None" + """Decode the encoded forge data if it exists.""" if "d" not in response: return ForgeData( @@ -124,10 +124,10 @@ def decode_forge_data(response: RawForgeData) -> ForgeData: channel_version_flags = buffer.read_varint() channel_size = channel_version_flags >> 1 - is_server = channel_version_flags & VERSION_FLAG_IGNORESERVERONLY != 0 + is_server = channel_version_flags & VERSION_FLAG_IGNORE_SERVER_ONLY != 0 mod_id = buffer.read_utf() - mod_version = IGNORESERVERONLY + mod_version = IGNORE_SERVER_ONLY if not is_server: mod_version = buffer.read_utf() @@ -168,10 +168,10 @@ def decode_forge_data(response: RawForgeData) -> ForgeData: } ) ) - except Exception: + except IOError: if not truncated: raise - # Semi-expect errors if truncated + # Semi-expect errors if truncated, we are missing data return ForgeData( fml_network_version=response["fmlNetworkVersion"], diff --git a/mcstatus/status_response.py b/mcstatus/status_response.py index 395ce164..ba13c943 100644 --- a/mcstatus/status_response.py +++ b/mcstatus/status_response.py @@ -134,10 +134,6 @@ def build(cls, raw: RawJavaResponse, latency: float = 0) -> Self: ``description`` - :class:`str`) are not of the expected type. :return: :class:`JavaStatusResponse` object. """ - forge_data = None - raw_forge_data = raw.get("forgeData") - if raw_forge_data: - forge_data = ForgeData.build(raw_forge_data) return cls( raw=raw, players=JavaStatusPlayers.build(raw["players"]), diff --git a/tests/status_response/test_java.py b/tests/status_response/test_java.py index 55a369ec..6ceda2d5 100644 --- a/tests/status_response/test_java.py +++ b/tests/status_response/test_java.py @@ -66,18 +66,9 @@ def build(self): "max": 20, "online": 0, "sample": [ - { - "name": "foo", - "id": "0b3717c4-f45d-47c8-b8e2-3d9ff6f93a89", - }, - { - "name": "bar", - "id": "61699b2e-d327-4a01-9f1e-0ea8c3f06bc6", - }, - { - "name": "baz", - "id": "40e8d003-8872-412d-b09a-4431a5afcbd4", - }, + {"name": "foo", "id": "0b3717c4-f45d-47c8-b8e2-3d9ff6f93a89"}, + {"name": "bar""id": "61699b2e-d327-4a01-9f1e-0ea8c3f06bc6"}, + {"name": "baz", "id": "40e8d003-8872-412d-b09a-4431a5afcbd4"}, ], } ) @@ -88,10 +79,7 @@ def test_empty_sample_turns_into_empty_list(self): @BaseStatusResponseTest.construct class TestJavaStatusPlayer(BaseStatusResponseTest): - EXPECTED_VALUES = [ - ("name", "foo"), - ("id", "0b3717c4-f45d-47c8-b8e2-3d9ff6f93a89"), - ] + EXPECTED_VALUES = [("name", "foo"), ("id", "0b3717c4-f45d-47c8-b8e2-3d9ff6f93a89")] @fixture(scope="class") def build(self): @@ -534,7 +522,7 @@ def build(self): return ForgeData.build( { "channels": [], - "d": "\u0e8b\x00\x00Ą䠰\u139bᙗ⺮᳙㒺祦搊䢸ű〣ⱡᣞ㞶獰廆ᗉ࠳ዣ䚦ోㆆ慨峜㆕櫻ᘖⷍు᠗〮\x02И⮫ᙇⷭు᠗㌮Ḁ善䯃ᛆ䰭Ṝ㘱捯曖䐵ॱ掃♅ఋ᠗ㄮѨ䱠Ϋ♗ⶮᲘ㒺湪桬ೈ獻ᙦ೭ᩛʱ⸱屢ヘ䮘㛧毬ᯘ㌷杩˦Ä䠐䘐ಭ峞㞶獢戌䒸燁䍢ⶡᩘ⾷档峂ᖹୣ̐䀀ᡄㆹ楨䫨再箛ᜅⶌᴙ㊺ㄅ扜䢸䀁ᘰⳬ岙㪴౭屢惄ᅱዓ◆\u0b8c\x18洊滆◝⍳盶\u2e6eಁ᠗㌮∄㷌䎃㚖⺎壚㨰摥廆ᗉࢋዣ䜆䲋᠖㔮晜㣈㦉玓ౠᡚ㜷汥戂\x00‸嚇⹌ᡛж⸱屬㣌䆑〣乁崙㞷獬䋄ᗍࡓዣ✆ೋ᠗㤮搖写筻㛆ⱎ峘Ʋ⸱ɠ䀀獈䚖\u2d2e嬘㜴敶棜䦽⯋捠䘅ซ܁物峞ᖝ⭳ᜦ溌岛ʹ⸲屠㣄ፈ曷Ⳮ宙㤲瑡擞\u05cdƈ倠⼁ᥘ㞹潷壤㖑̋ၧ䗆ൌᢗ洄勂ඹ熈ጂ@壅㞷楫仜㶙᎓盆汭娚ゲ獤戌㣈熁猢ⷀ崙㞻歲戆䂸ࠁグ䷬ᴛ㞹汬峒ঝ䀠囧二ూᢗⴸ屨㣀↩枀ಭ䃝\u1718İค㇀ᬋ♖ⷬඁᨗㄮ怎ֱ⬛瘦₭\u0b8c\u1718İค▌ண噆䶌ుᢗ⸱ᡦִ獋㗶ⴌᮘ㊷Ŭb᐀简\u1776䴌ೂ᠗ㄮ䑚冕̋ₐ淬嫛㐹汥໌䳄ᅱ勣؆ɀ㞶瑯䫄㖅㎛挐إ䮎Ę猖惞□⎛㚗బᥝㄲ捡惖අ᭛ᄧ◆ฌᤗ㌭扜㣠⦙狣䚦䇌㐱湡䫜ֱƈ倀満婝㦳ㄓ扜傸ũ䘗౮䱚ᢕㄮ屰ࣈၸ\u1756ඍᩙ㎷慧仈冕䎛挱春\u0b8cᚘ畢壒㦑妩㛒䘬ో\u171c紲娈▅୳̀\u2000夂㤰畫勨䶱࠳挃䘅ോЀ捭䣮㶽ᮓၗ׆\u0b8c\x1b眇䣂㆑ᬫთ◆ฌᤗ〭灜䒸ᇉ儠沭ᡚ㒷浳䫎ᖹஓ睆湍䆜᠘㈮橜㑈嬫昖洭孜㊳敮䋤㷑ᮓၧ䘆ಋ᪗\x00䐈ㆅ㭫挰䙅䰋᠕ԃ䋮ㆥ匋因溌ᯝ㖹湩\u0ace㣄熁ጂ怀媂㤲獥櫞\u0dc9ᬫ§◆ഌᢗㄮ扮〄挘䛶洎壗㜷楦ӎ䰸⭃ᝆญ婚㜰潣䫤䰝ॱ挃إ䌌ザ湩䚾֡獳䙖₭\u0b8c\u17180ሄ喐歫囖ⶭṛᢅㄮ婰㣄熩䌢ⲁ孝㲶档峂ᖹୣ̐恀峃㠺汰嫊㦕ணᜦ沭䍜\u1718㠱摜䒴⥱ዣ晦宁㨲潷囤䐅ခ⃠䲮ᩙ㊷獤廨\u05c9⬻ၦ◆ఌᤗ洌勂綹䌚昖ⷍ嬙ᢀ\x00嘐㦽\u135b䙗Ⲯుᦗ㌮᠀֔䮛\u05f7洮嬙㜴\u0c73屢惄ᅱዓ׆\u0b8cĘ挆擞䷁挫挐إஎᚙ⸱屠\u1cc8⬠ᙦຬ崛ᢂ〮恜Є@㘗\u2d6cᥛ㪷\u0a00䛚ঢ়䮓癆沬Ŝ\u1719⸰f倬፻طⶭ᳘㊺ٲ灢䒸ű〃污᭛㤸獥勦㗕ࢳ䋣䗆ୌ㪱汩峈ⳤ᭩挖إஎę瀄峒⦝熈̒▧\u0b8c\u171cర勠ᶹ\u1afbᚆ䷌ᥛʶ䥐ຜӅ怐⚐䷮妛㤺慮䫆ᗍ熘挲إᩅ㞹普擪ֹ⬛眶ⷋ崙㞻歲戆䂸\t傰汭ᴝ㠹潤擞ᗍ熈挂ۅ䉀ㆶ晷峊ᖍ⮛挐䘅ോ\u0b00畳䫠㗉ጋᝇ䵍ඛᤚ潣䫤▱㌓挐䘅䱋\x1c猋嫒㇁揋皖ഌ䕝\u1718㠱摜䒴ⅱ⋣䖦嵘㘴\u2e64扦ᰈ笐ᝆⷌᡚᢅㄮ屰㓈ᦡ䍃ⶠᩘ·0ᘀ■䌻ᛆ೭崚㤲䄃㊜ᐅΘ☗䵮䆀㪱楲曞䐹ॱ掃♅ോ᠗㜮扜㐐䬋ᛦؠ䂀㠄瑡僆喽䭣Ⴖ◆ฌᤗ㜭屢Ⴤ୨暖\u202d\x0ć慣䫚\u05c9ࡣዣ䜆䲋ᢖ〮桜လ㌫嘖ඎ䅝\u1718⸰ɠ㠀挐㛶浬ᡘ㠹湥擨⧥熈֧̒䮌\u17190栤ᖡ殓䘖䯭寙㜺慤勨㦽ࡃ拣旆\u0b8cᰙᄀ僨䦕୫盆ಫ尞㜰楳峞䐡ㅱ㋣◆ೌց楬峄㦽毋囶\u2e6eಁᢗ〮䘎֡獳䙖\u206d\u0b8c\x98ਂ壊妕⌋⛷മ䌙\u1718㠱摜䒴䅱䋣ↆ塛㜴损䋐㦹挫ဖ\x06ǀ㪹敮勘ᦍঈˣ◆䅌㮄牯䣘ᆕ⍋〷⺬䁚\x98椈棜䦕୳ᛆ☠䂀ㆁ浦渖䂸ű˓⹎䲙Μ敮滨䦽\u0b5b̐@ᡃㆹ楨䫨再Ꭻ林䚀๋ᰗܴ䫜巑፻ᚷ☠\x00㮇楥䣤㦥㬻䘖ⳬᴙᤃ㈮扜Ä桨瘶ⳎᲝ㒷畴䫤ᗍ熘挂䘅ɀ㤺獡䛐㦅㎛挐䘅䱋Ț慭峒䐅\x01傐汭嬝㎴瑨૦㣄熁̲愀嵘㪱扭擊吕ॱ⋣\x06᳁シቤ屢惄ᅱዓ䗆ಌ᠗⸴橢\u0984倘ᙖℭ䮎\u171b⸰恤᳤䌘昖ⷍ嬙ᢂ〮恜ࠄ࠘♖\u20c6ౌᢗ㐮娈▅୳ጐ@孂㖲湡曒ᦵƈ⋣◆䈍㊶慫勜㗍࠳挃䙅ോȀ戅壈থࡃዣ䜦ೋᮗ洊壪◑挓㛶\u2d6cಀȀ業䛦䐅ခだ⹌ᡙ㊺〇橜䂸ⅱ偆Ⱝ定ᢀȀ渒斅⎛曷沭䆜᠘ㄮ恜㠜⌫睷湍䃚\u17180ఀㆌ殫㜆Ďஎ\u1718⬰恢栀䎘䝖ຮᥜ㠼牥嫒㦕ண㛆ಮ崝㜴獧戊䂸⥱#污᭛㞳瑲᳦㣄䆉⋣▦\u0b8d\u1718⸰ࡨִ獋ဖ䀆\u0380シ畴䫤\u0dcd死ᜆ湬䒜\u1718㠱摜䒴䥱狣䖦ᯙ㎹\u0e65䋜嗑⮓㜶ⷬ尛㦰ͳ屢Ӏ瀐䜰䷮塜㊳敮滨䦽捛挐إஎᚙ⸱屬ツ୨暖毭娘㜰敮˘Ä\u2000♡Ⱞᥛㆲ浯䋠再ጣ瘗䲮᳜ᢅㄮ婰㣐熉̂Ƞ奙㞱慲勨ᗙዻ盆汭峚ᤂㄮ恜⠀笐ᝆⷌ尞㨷ٳ屰㣀ᆉ〃ುᢝケ正惪䧍࠱ˣ◆\u0dccҁ潣僌ൽ፻ٗ䘡උᨗ㈮\u0e62ᖜ⭳ᜦⶌ䱀Ā洈哆旑䭣㘦䘡ో᚜⸶屠哄桁☶⺍嬞ㄴ\u3103恜\x04䡀ܶ氮宝㤲\u3103恜␀㌨♗漮寘㠶ㄌ扜㣠榑挒䚥\u0dcbԀ敪棒ᗝ嬋♖惮\u0b8c\u1718⸰p値ጫᜧⶌᴚδ⸰ᱠ㤽ሪ僐䴭ᩛ㎷慧仈冕㎛挐☥\u0b8cਘ慭峒㥽⌫睷湍埚㐱湡䫜ֱƐ䀠䱡ᡜ㨳睴䋊ᖭ㮓掐䘥䱋ᮜ洄勂ᖹ熈挂\u0605䂀ゅ慫僦ඥ箣囖\u20cc䮌ᚚ〲娈▅୳̐₀妁㤷敧Ȇ改\u2062嚗湌峗㤷楴仜䐍ű倃\u0e60嬜㨴\u3103扜ࠄᡰ䛶淭峜㘰档曊䷑ࠫˣ旇䌌㐱湡䫜綱୪暖₭\u0b8c\u1718İఄᗌ⭣囦↬䮌ᰘ㈮扚䒸熹玒ⷀ崙㞻歲戂\x00ₘᜦญṜ㞶摡峒䶝ጛ噗ⷌుᬗ㐮ᰆ䦌㌋ᝆ淍崙㊻歡\u0ee6ᖸ㮣⛷浮ీ᠗Ѐ娒㦥ᬫᜦೌ䆝\u1718㠱摜吨፳癗洬崜㤲䘄ᢚӍ၀癗洬崜㤲䘄ᢚӍ怀址乌ᡜ㘱湥䫈䇉熈̒䗇䭌\u1718⸱屠䃄Ƒㆀ෮娜㦴楴䋆ᗑጣ㘖൬塜㖱癳Ố㣄䆉⋣▦\u0b8c\u1718⸴摢Ⰰ筨㝖ಮ川ゲ獫Ȇ改䀒ᝀ⺍官㪴խ屦㣔㦱因溌ᯝ㖹\u3103恜Є倠䘖ಬ䍀㤱慥䫨巑ଫ嚶์ಂ᠗〮扜ࣜ⡰㘖漮嶗㘴慬䫎䷉\u086bዣ䜆䲋ᢖ〮扜᳀⬠ᙦຬ崛ᢂ〮恜ࠄ(ڗ䲮䌞\u1718㠱摜䒴ॱ勣æᥙコ汵૨㣄熁ጂ怀婁㊱敢令Ѝ䩲\x15ು幛㐻敥Ә㐘猋䝆䲭ుᲗ㈮\u0e6eᖸ㮣⛷\u2d6eీ\x00攉廆㶱䬻㘶₮䮌\u171bȳ戊ו宓ぶ䗆䭌᪙и䋚㦥ࠋ\u2003ƀ塞㤲浯峒㖥̋⁷䙆䱋\u1718б䋚㦥ࠛˣ&ƀ㒸灧峊怕űዣ⁆如㦰扴峊\u218d〫ˣ䗆䇌㐱湡䫜ᖱ熠换★䂀㠄汯嫲䦽䎃Ⴖ◆ฌᤗ〭桜ა୨暖\u202d\x0cԀ畡廨ᗉ挻⚖\u20cc䮌᚛㌵ᰄ凌፻瘗ಬ岙㮰牥೦䃄ᅱዣↆ塛㜴损䋐㦹挫ဖ\x06̀㘳硵䫜巑፻㚷惮\u0b8d\u1718⸷p㠨笫㛦⹌ᦘ᤺㈃摜\u2008猨♖Ɱᬙζ⸰ᱠ㤽㨪因溌ᯝ㖹々恜䂸ခ႐ฌ嬜㦲楫ᣜ㣈熡㌂涥ౘᢗи狦ඹࠋဓ䅠ᥙ㤹瑩䛊䦽ጫ僠෭ᵙザ牲櫞ᗑᮓႇ◇䮌ᚘ㌹娘▅筳ص䰭宛㘲㈁\x00䡐㌫暖ಭ᳙㞺慲䫎ᆅ笣㛦®\u0b8c\u171c2帔ᗁ捳ᛶⲌᲙᢃ⸲屠ࣄ⁈嚇䯬塝㘺ᅴ屢惄ᅱ⋓׆䮌᠘㠮牬㠜⌫睷湍ƚ\u1718㘲恜Ѐ梨䛶䲬宜㒺昺櫘㧡⌫睷湍峚ᮁ㜰\x00", + "d": bytes.fromhex('e0ba8b0000c484e4a0b0e18e9be19997e2baaee1b399e392bae7a5a6e6908ae4a2b8c5b1e380a3e2b1a1e1a39ee39eb6e78db0e5bb86e19789e0a0b3e18ba3e49aa6e0b18be38686e685a8e5b39ce38695e6abbbe19896e2b78de0b181e1a097e380ae02d098e2aeabe19987e2b7ade0b181e1a097e38caee1b880e59684e4af83e19b86e4b0ade1b99ce398b1e68dafe69b96e490b5e0a5b1e68e83e29985e0b08be1a097e384aed1a8e4b1a0ceabe29997e2b6aee1b298e392bae6b9aae6a1ace0b388e78dbbe199a6e0b3ade1a99bcab1e2b8b1e5b1a2e38398e4ae98e39ba7e6aface1af98e38cb7e69da9cba6c384e4a090e49890e0b2ade5b39ee39eb6e78da2e6888ce492b8e78781e48da2e2b6a1e1a998e2beb7e6a1a3e5b382e196b9e0ada3cc90e48080e1a184e386b9e6a5a8e4aba8e5868de7ae9be19c85e2b68ce1b499e38abae38485e6899ce4a2b8e48081e198b0e2b3ace5b299e3aab4e0b1ade5b1a2e68384e185b1e18b93e29786e0ae8c18e6b48ae6bb86e2979de28db3e79bb6e2b9aee0b281e1a097e38caee28884e3b78ce48e83e39a96e2ba8ee5a39ae3a8b0e691a5e5bb86e19789e0a28be18ba3e49c86e4b28be1a096e394aee6999ce3a388e3a689e78e93e0b1a0e1a19ae39cb7e6b1a5e6888200e280b8e59a87e2b98ce1a19bd0b6e2b8b1e5b1ace3a38ce48691e380a3e4b981e5b499e39eb7e78dace48b84e1978de0a193e18ba3e29c86e0b38be1a097e3a4aee69096e58699e7adbbe39b86e2b18ee5b398c6b2e2b8b1c9a0e48080e78d88e49a96e2b4aee5ac98e39cb4e695b6e6a39ce4a6bde2af8be68da0e49885e0b88bdc81e789a9e5b39ee1969de2adb3e19ca6e6ba8ce5b29bcab9e2b8b2e5b1a0e3a384e18d88e69bb7e2b3ade5ae99e3a4b2e791a1e6939ed78dc688e580a0e2bc81e1a598e39eb9e6bdb7e5a3a4e39691cc8be181a7e49786e0b58ce1a297e6b484e58b82e0b6b9e78688e18c8240e5a385e39eb7e6a5abe4bb9ce3b699e18e93e79b86e6b1ade5a89ae382b2e78da4e6888ce3a388e78681e78ca2e2b780e5b499e39ebbe6adb2e68886e482b8e0a081e382b0e4b7ace1b49be39eb9e6b1ace5b392e0a69de480a0e59ba7e4ba8ce0b182e1a297e2b4b8e5b1a8e3a380e286a9e69e80e0b2ade4839de19c98c4b0e0b884e38780e1ac8be29996e2b7ace0b681e1a897e384aee6808ed6b1e2ac9be798a6e282ade0ae8ce19c98c4b0e0b884e2968ce0aea3e59986e4b68ce0b181e1a297e2b8b1e1a1a6d6b4e78d8be397b6e2b48ce1ae98e38ab7c5ac62e19080e7ae80e19db6e4b48ce0b382e1a097e384aee4919ae58695cc8be28290e6b7ace5ab9be390b9e6b1a5e0bb8ce4b384e185b1e58ba3d886c980e39eb6e791afe4ab84e39685e38e9be68c90d8a5e4ae8ec498e78c96e6839ee296a1e28e9be39a97e0b0ace1a59de384b2e68da1e68396e0b685e1ad9be184a7e29786e0b88ce1a497e38cade6899ce3a3a0e2a699e78ba3e49aa6e4878ce390b1e6b9a1e4ab9cd6b1c688e58080e6ba80e5a99de3a6b3e38493e6899ce582b8c5a9e49897e0b1aee4b19ae1a295e384aee5b1b0e0a388e181b8e19d96e0b68de1a999e38eb7e685a7e4bb88e58695e48e9be68cb1e698a5e0ae8ce19a98e795a2e5a392e3a691e5a6a9e39b92e498ace0b18be19c9ce7b4b2e5a888e29685e0adb3cd80e28080e5a482e3a4b0e795abe58ba8e4b6b1e0a0b3e68c83e49885e0b58bd080e68dade4a3aee3b6bde1ae93e18197d786e0ae8c1be79c87e4a382e38691e1acabe18397e29786e0b88ce1a497e380ade7819ce492b8e18789e584a0e6b2ade1a19ae392b7e6b5b3e4ab8ee196b9e0ae93e79d86e6b98de4869ce1a098e388aee6a99ce39188e5acabe69896e6b4ade5ad9ce38ab3e695aee48ba4e3b791e1ae93e181a7e49886e0b28be1aa9700e49088e38685e3adabe68cb0e49985e4b08be1a095d483e48baee386a5e58c8be59ba0e6ba8ce1af9de396b9e6b9a9e0ab8ee3a384e78681e18c82e68080e5aa82e3a4b2e78da5e6ab9ee0b789e1acabc2a7e29786e0b48ce1a297e384aee689aee38084e68c98e49bb6e6b48ee5a397e39cb7e6a5a6d38ee4b0b8e2ad83e19d86e0b88de5a99ae39cb0e6bda3e4aba4e4b09de0a5b1e68c83d8a5e48c8ce382b6e6b9a9e49abed6a1e78db3e49996e282ade0ae8ce19c9830e18884e59690e6adabe59b96e2b6ade1b99be1a285e384aee5a9b0e3a384e786a9e48ca2e2b281e5ad9de3b2b6e6a1a3e5b382e196b9e0ada3cc90e68180e5b383e3a0bae6b1b0e5ab8ae3a695e0aea3e19ca6e6b2ade48d9ce19c98e3a0b1e6919ce492b4e2a5b1e18ba3e699a6e5ae81e3a8b2e6bdb7e59ba4e49085e18081e283a0e4b2aee1a999e38ab7e78da4e5bba8d789e2acbbe181a6e29786e0b08ce1a497e6b48ce58b82e7b6b9e48c9ae69896e2b78de5ac99e1a28000e59890e3a6bde18d9be49997e2b2aee0b181e1a697e38caee1a080d694e4ae9bd7b7e6b4aee5ac99e39cb4e0b1b3e5b1a2e68384e185b1e18b93d786e0ae8cc498e68c86e6939ee4b781e68cabe68c90d8a5e0ae8ee19a99e2b8b1e5b1a0e1b388e2aca0e199a6e0baace5b49be1a282e380aee6819cd08440e39897e2b5ace1a59be3aab7e0a880e49b9ae0a79de4ae93e79986e6b2acc59ce19c99e2b8b066e580ace18dbbd8b7e2b6ade1b398e38abad9b2e781a2e492b8c5b1e38083e6b1a1e1ad9be3a4b8e78da5e58ba6e39795e0a2b3e48ba3e49786e0ad8ce3aab1e6b1a9e5b388e2b3a4e1ada9e68c96d8a5e0ae8ec499e78084e5b392e2a69de78688cc92e296a7e0ae8ce19c9ce0b0b0e58ba0e1b6b9e1abbbe19a86e4b78ce1a59bcab6e4a590e0ba9cd385e68090e29a90e4b7aee5a69be3a4bae685aee4ab86e1978de78698e68cb2d8a5e1a985e39eb9e699aee693aad6b9e2ac9be79cb6e2b78be5b499e39ebbe6adb2e68886e482b809e582b0e6b1ade1b49de3a0b9e6bda4e6939ee1978de78688e68c82db85e48980e386b6e699b7e5b38ae1968de2ae9be68c90e49885e0b58be0ac80e795b3e4aba0e39789e18c8be19d87e4b58de0b69be1a49ae6bda3e4aba4e296b1e38c93e68c90e49885e4b18b1ce78c8be5ab92e38781e68f8be79a96e0b48ce4959de19c98e3a0b1e6919ce492b4e285b1e28ba3e496a6e5b598e398b4e2b9a4e689a6e1b088e7ac90e19d86e2b78ce1a19ae1a285e384aee5b1b0e39388e1a6a1e48d83e2b6a0e1a998c2b730e19880e296a0e48cbbe19b86e0b3ade5b49ae3a4b2e48483e38a9ce19085ce98e29897e4b5aee48680e3aab1e6a5b2e69b9ee490b9e0a5b1e68e83e29985e0b58be1a097e39caee6899ce39090e4ac8be19ba6d8a0e48280e3a084e791a1e58386e596bde4ada3e182b6e29786e0b88ce1a497e39cade5b1a2e18384e0ada8e69a96e280ad0ccc81e685a3e4ab9ad789e0a1a3e18ba3e49c86e4b28be1a296e380aee6a19ce1809ce38cabe59896e0b68ee4859de19c98e2b8b0c9a0e3a080e68c90e39bb6e6b5ace1a198e3a0b9e6b9a5e693a8e2a7a5e78688cc92d6a7e4ae8ce19c9930e6a0a4e196a1e6ae93e49896e4afade5af99e39cbae685a4e58ba8e3a6bde0a183e68ba3e69786e0ae8ce1b099e18480e583a8e4a695e0adabe79b86e0b2abe5b09ee39cb0e6a5b3e5b39ee490a1e385b1e38ba3e29786e0b38cd681e6a5ace5b384e3a6bde6af8be59bb6e2b9aee0b281e1a297e380aee4988ed6a1e78db3e49996e281ade0ae8cc298e0a882e5a38ae5a695e28c8be29bb7e0b4aee48c99e19c98e3a0b1e6919ce492b4e485b1e48ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606c780e3aab9e695aee58b98e1a68de0a688cba3e29786e4858ce3ae84e789afe4a398e18695e28d8be380b7e2baace4819ac298e6a488e6a39ce4a695e0adb3e19b86e298a0e48280e38681e6b5a6e6b896e482b8c5b1cb93e2b98ee4b299ce9ce695aee6bba8e4a6bde0ad9bcc9040e1a183e386b9e6a5a8e4aba8e5868de18eabe69e97e49a80e0b98be1b097dcb4e4ab9ce5b791e18dbbe19ab7e298a000e3ae87e6a5a5e4a3a4e3a6a5e3acbbe49896e2b3ace1b499e1a483e388aee6899cc384e6a1a8e798b6e2b38ee1b29de392b7e795b4e4aba4e1978de78698e68c82e49885c980e3a4bae78da1e49b90e3a685e38e9be68c90e49885e4b18bc89ae685ade5b392e4908501e58290e6b1ade5ac9de38eb4e791a8e0aba6e3a384e78681ccb2e68480e5b598e3aab1e689ade6938ae59095e0a5b1e28ba306e1b381e382b7e189a4e5b1a2e68384e185b1e18b93e49786e0b28ce1a097e2b8b4e6a9a2e0a684e58098e19996e284ade4ae8ee19c9be2b8b0e681a4e1b3a4e48c98e69896e2b78de5ac99e1a282e380aee6819ce0a084e0a098e29996e28386e0b18ce1a297e390aee5a888e29685e0adb3e18c9040e5ad82e396b2e6b9a1e69b92e1a6b5c688e28ba3e29786e4888de38ab6e685abe58b9ce3978de0a0b3e68c83e49985e0b58bc880e68885e5a388e0a6a5e0a183e18ba3e49ca6e0b38be1ae97e6b48ae5a3aae29791e68c93e39bb6e2b5ace0b280c880e6a5ade49ba6e49085e18081e381a0e2b98ce1a199e38abae38087e6a99ce482b8e285b1e58186e2b0ade5ae9ae1a280c880e6b892e69685e28e9be69bb7e6b2ade4869ce1a098e384aee6819ce3a09ce28cabe79db7e6b98de4839ae19c9830e0b080e3868ce6aeabe39c86c48ee0ae8ee19c98e2acb0e681a2e6a080e48e98e49d96e0baaee1a59ce3a0bce789a5e5ab92e3a695e0aea3e39b86e0b2aee5b49de39cb4e78da7e6888ae482b8e2a5b123e6b1a1e1ad9be39eb3e791b2e1b3a6e3a384e48689e28ba3e296a6e0ae8de19c98e2b8b0e0a1a8d6b4e78d8be18096e48086ce80e382b7e795b4e4aba4e0b78de6adbbe19c86e6b9ace4929ce19c98e3a0b1e6919ce492b4e4a5b1e78ba3e496a6e1af99e38eb9e0b9a5e48b9ce59791e2ae93e39cb6e2b7ace5b09be3a6b0cdb3e5b1a2d380e78090e49cb0e4b7aee5a19ce38ab3e695aee6bba8e4a6bde68d9be68c90d8a5e0ae8ee19a99e2b8b1e5b1ace38384e0ada8e69a96e6afade5a898e39cb0e695aecb98c384e28080e299a1e2b0aee1a59be386b2e6b5afe48ba0e5868de18ca3e79897e4b2aee1b39ce1a285e384aee5a9b0e3a390e78689cc82c8a0e5a599e39eb1e685b2e58ba8e19799e18bbbe79b86e6b1ade5b39ae1a482e384aee6819ce2a080e7ac90e19d86e2b78ce5b09ee3a8b7d9b3e5b1b0e3a380e18689e38083e0b381e1a29de382b1e6ada3e683aae4a78de0a0b1cba3e29786e0b78cd281e6bda3e5838ce0b5bde18dbbd997e498a1e0b68be1a897e388aee0b9a2e1969ce2adb3e19ca6e2b68ce4b180c480e6b488e59386e69791e4ada3e398a6e498a1e0b18be19a9ce2b8b6e5b1a0e59384e6a181e298b6e2ba8de5ac9ee384b4e38483e6819c04e4a180dcb6e6b0aee5ae9de3a4b2e38483e6819ce29080e38ca8e29997e6bcaee5af98e3a0b6e3848ce6899ce3a3a0e6a691e68c92e49aa5e0b78bd480e695aae6a392e1979de5ac8be29996e683aee0ae8ce19c98e2b8b070e580a4e18cabe19ca7e2b68ce1b49aceb4e2b8b0e1b1a0e3a4bde188aae58390e4b4ade1a99be38eb7e685a7e4bb88e58695e38e9be68c90e298a5e0ae8ce0a898e685ade5b392e3a5bde28cabe79db7e6b98de59f9ae390b1e6b9a1e4ab9cd6b1c690e480a0e4b1a1e1a19ce3a8b3e79db4e48b8ae196ade3ae93e68e90e498a5e4b18be1ae9ce6b484e58b82e196b9e78688e68c82d885e48280e38285e685abe583a6e0b6a5e7aea3e59b96e2838ce4ae8ce19a9ae380b2e5a888e29685e0adb3cc90e28280e5a681e3a4b7e695a7c886e694b9e281a2e59a97e6b98ce5b397e3a4b7e6a5b4e4bb9ce4908dc5b1e58083e0b9a0e5ac9ce3a8b4e38483e6899ce0a084e1a1b0e49bb6e6b7ade5b39ce398b0e6a1a3e69b8ae4b791e0a0abcba3e69787e48c8ce390b1e6b9a1e4ab9ce7b6b1e0adaae69a96e282ade0ae8ce19c98c4b0e0b084e1978ce2ada3e59ba6e286ace4ae8ce1b098e388aee6899ae492b8e786b9e78e92e2b780e5b499e39ebbe6adb2e6888200e28298e19ca6e0b88de1b99ce39eb6e691a1e5b392e4b69de18c9be59997e2b78ce0b181e1ac97e390aee1b086e4a68ce38c8be19d86e6b78de5b499e38abbe6ada1e0bba6e196b8e3aea3e29bb7e6b5aee0b180e1a097d080e5a892e3a6a5e1acabe19ca6e0b38ce4869de19c98e3a0b1e6919ce590a8e18db3e79997e6b4ace5b49ce3a4b2e49884e1a29ad38de18180e79997e6b4ace5b49ce3a4b2e49884e1a29ad38de68080e59d80e4b98ce1a19ce398b1e6b9a5e4ab88e48789e78688cc92e49787e4ad8ce19c98e2b8b1e5b1a0e48384c691e38680e0b7aee5a89ce3a6b4e6a5b4e48b86e19791e18ca3e39896e0b5ace5a19ce396b1e799b3e1bb90e3a384e48689e28ba3e296a6e0ae8ce19c98e2b8b4e691a2e2b080e7ada8e39d96e0b2aee5b79de382b2e78dabc886e694b9e48092e19d80e2ba8de5ae98e3aab4d5ade5b1a6e3a394e3a6b1e59ba0e6ba8ce1af9de396b9e38483e6819cd084e580a0e49896e0b2ace48d80e3a4b1e685a5e4aba8e5b791e0acabe59ab6e0b98ce0b282e1a097e380aee6899ce0a39ce2a1b0e39896e6bcaee5b697e398b4e685ace4ab8ee4b789e0a1abe18ba3e49c86e4b28be1a296e380aee6899ce1b380e2aca0e199a6e0baace5b49be1a282e380aee6819ce0a08428da97e4b2aee48c9ee19c98e3a0b1e6919ce492b4e0a5b1e58ba3c3a6e1a599e382b3e6b1b5e0aba8e3a384e78681e18c82e68080e5a981e38ab1e695a2e4bba4d08de4a9b215e0b381e5b99be390bbe695a5d398e39098e78c8be49d86e4b2ade0b181e1b297e388aee0b9aee196b8e3aea3e29bb7e2b5aee0b18000e69489e5bb86e3b6b1e4acbbe398b6e282aee4ae8ce19c9bc8b3e6888ad795e5ae93e381b6e49786e4ad8ce1aa99d0b8e48b9ae3a6a5e0a08be28083c680e5a19ee3a4b2e6b5afe5b392e396a5cc8be281b7e49986e4b18be19c98d0b1e48b9ae3a6a5e0a09bcba326c680e392b8e781a7e5b38ae68095c5b1e18ba3e28186e5a682e3a6b0e689b4e5b38ae2868de380abcba3e49786e4878ce390b1e6b9a1e4ab9ce196b1e786a0e68da2e29885e48280e3a084e6b1afe5abb2e4a6bde48e83e182b6e29786e0b88ce1a497e380ade6a19ce18390e0ada8e69a96e280ad0cd480e795a1e5bba8e19789e68cbbe29a96e2838ce4ae8ce19a9be38cb5e1b084e5878ce18dbbe79897e0b2ace5b299e3aeb0e789a5e0b3a6e48384e185b1e18ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606cc80e398b3e7a1b5e4ab9ce5b791e18dbbe39ab7e683aee0ae8de19c98e2b8b770e3a0a8e7acabe39ba6e2b98ce1a698e1a4bae38883e6919ce28088e78ca8e29996e2b1aee1ac99ceb6e2b8b0e1b1a0e3a4bde3a8aae59ba0e6ba8ce1af9de396b9e38085e6819ce482b8e18081e18290e0b88ce5ac9ce3a6b2e6a5abe1a39ce3a388e786a1e38c82e6b6a5e0b198e1a297d0b8e78ba6e0b6b9e0a08be18093e485a0e1a599e3a4b9e791a9e49b8ae4a6bde18cabe583a0e0b7ade1b599e382b6e789b2e6ab9ee19791e1ae93e18287e29787e4ae8ce19a98e38cb9e5a898e29685e7adb3d8b5e4b0ade5ae9be398b2e3888100e4a190e38cabe69a96e0b2ade1b399e39ebae685b2e4ab8ee18685e7aca3e39ba6c2aee0ae8ce19c9c32e5b894e19781e68db3e19bb6e2b28ce1b299e1a283e2b8b2e5b1a0e0a384e28188e59a87e4aface5a19de398bae185b4e5b1a2e68384e185b1e28b93d786e4ae8ce1a098e3a0aee789ace3a09ce28cabe79db7e6b98dc69ae19c98e398b2e6819cd080e6a2a8e49bb6e4b2ace5ae9ce392bae698bae6ab98e3a7a1e28cabe79db7e6b98de5b39ae1ae81e39cb000').decode("utf-8"), "fmlNetworkVersion": 3, "mods": [], "truncated": True, diff --git a/tests/test_forge_data.py b/tests/test_forge_data.py deleted file mode 100644 index 8f625aa3..00000000 --- a/tests/test_forge_data.py +++ /dev/null @@ -1,15 +0,0 @@ -raw_response = { - "description": { - "text": "motd=\u00a74------ \u00a72 Vault Hunters: 1.18.2 \u00a76VER: See Discord \u00a7c \u00a74------\u00a7r\n \u00a74------ \u00a7e vaulthunters.gg \u00a74------" - }, - "favicon": "", - "forgeData": { - "channels": [], - "d": "\u0e8b\x00\x00Ą䠰\u139bᙗ⺮᳙㒺祦搊䢸ű〣ⱡᣞ㞶獰廆ᗉ࠳ዣ䚦ోㆆ慨峜㆕櫻ᘖⷍు᠗〮\x02И⮫ᙇⷭు᠗㌮Ḁ善䯃ᛆ䰭Ṝ㘱捯曖䐵ॱ掃♅ఋ᠗ㄮѨ䱠Ϋ♗ⶮᲘ㒺湪桬ೈ獻ᙦ೭ᩛʱ⸱屢ヘ䮘㛧毬ᯘ㌷杩˦Ä䠐䘐ಭ峞㞶獢戌䒸燁䍢ⶡᩘ⾷档峂ᖹୣ̐䀀ᡄㆹ楨䫨再箛ᜅⶌᴙ㊺ㄅ扜䢸䀁ᘰⳬ岙㪴౭屢惄ᅱዓ◆\u0b8c\x18洊滆◝⍳盶\u2e6eಁ᠗㌮∄㷌䎃㚖⺎壚㨰摥廆ᗉࢋዣ䜆䲋᠖㔮晜㣈㦉玓ౠᡚ㜷汥戂\x00‸嚇⹌ᡛж⸱屬㣌䆑〣乁崙㞷獬䋄ᗍࡓዣ✆ೋ᠗㤮搖写筻㛆ⱎ峘Ʋ⸱ɠ䀀獈䚖\u2d2e嬘㜴敶棜䦽⯋捠䘅ซ܁物峞ᖝ⭳ᜦ溌岛ʹ⸲屠㣄ፈ曷Ⳮ宙㤲瑡擞\u05cdƈ倠⼁ᥘ㞹潷壤㖑̋ၧ䗆ൌᢗ洄勂ඹ熈ጂ@壅㞷楫仜㶙᎓盆汭娚ゲ獤戌㣈熁猢ⷀ崙㞻歲戆䂸ࠁグ䷬ᴛ㞹汬峒ঝ䀠囧二ూᢗⴸ屨㣀↩枀ಭ䃝\u1718İค㇀ᬋ♖ⷬඁᨗㄮ怎ֱ⬛瘦₭\u0b8c\u1718İค▌ண噆䶌ుᢗ⸱ᡦִ獋㗶ⴌᮘ㊷Ŭb᐀简\u1776䴌ೂ᠗ㄮ䑚冕̋ₐ淬嫛㐹汥໌䳄ᅱ勣؆ɀ㞶瑯䫄㖅㎛挐إ䮎Ę猖惞□⎛㚗బᥝㄲ捡惖අ᭛ᄧ◆ฌᤗ㌭扜㣠⦙狣䚦䇌㐱湡䫜ֱƈ倀満婝㦳ㄓ扜傸ũ䘗౮䱚ᢕㄮ屰ࣈၸ\u1756ඍᩙ㎷慧仈冕䎛挱春\u0b8cᚘ畢壒㦑妩㛒䘬ో\u171c紲娈▅୳̀\u2000夂㤰畫勨䶱࠳挃䘅ോЀ捭䣮㶽ᮓၗ׆\u0b8c\x1b眇䣂㆑ᬫთ◆ฌᤗ〭灜䒸ᇉ儠沭ᡚ㒷浳䫎ᖹஓ睆湍䆜᠘㈮橜㑈嬫昖洭孜㊳敮䋤㷑ᮓၧ䘆ಋ᪗\x00䐈ㆅ㭫挰䙅䰋᠕ԃ䋮ㆥ匋因溌ᯝ㖹湩\u0ace㣄熁ጂ怀媂㤲獥櫞\u0dc9ᬫ§◆ഌᢗㄮ扮〄挘䛶洎壗㜷楦ӎ䰸⭃ᝆญ婚㜰潣䫤䰝ॱ挃إ䌌ザ湩䚾֡獳䙖₭\u0b8c\u17180ሄ喐歫囖ⶭṛᢅㄮ婰㣄熩䌢ⲁ孝㲶档峂ᖹୣ̐恀峃㠺汰嫊㦕ணᜦ沭䍜\u1718㠱摜䒴⥱ዣ晦宁㨲潷囤䐅ခ⃠䲮ᩙ㊷獤廨\u05c9⬻ၦ◆ఌᤗ洌勂綹䌚昖ⷍ嬙ᢀ\x00嘐㦽\u135b䙗Ⲯుᦗ㌮᠀֔䮛\u05f7洮嬙㜴\u0c73屢惄ᅱዓ׆\u0b8cĘ挆擞䷁挫挐إஎᚙ⸱屠\u1cc8⬠ᙦຬ崛ᢂ〮恜Є@㘗\u2d6cᥛ㪷\u0a00䛚ঢ়䮓癆沬Ŝ\u1719⸰f倬፻طⶭ᳘㊺ٲ灢䒸ű〃污᭛㤸獥勦㗕ࢳ䋣䗆ୌ㪱汩峈ⳤ᭩挖إஎę瀄峒⦝熈̒▧\u0b8c\u171cర勠ᶹ\u1afbᚆ䷌ᥛʶ䥐ຜӅ怐⚐䷮妛㤺慮䫆ᗍ熘挲إᩅ㞹普擪ֹ⬛眶ⷋ崙㞻歲戆䂸\t傰汭ᴝ㠹潤擞ᗍ熈挂ۅ䉀ㆶ晷峊ᖍ⮛挐䘅ോ\u0b00畳䫠㗉ጋᝇ䵍ඛᤚ潣䫤▱㌓挐䘅䱋\x1c猋嫒㇁揋皖ഌ䕝\u1718㠱摜䒴ⅱ⋣䖦嵘㘴\u2e64扦ᰈ笐ᝆⷌᡚᢅㄮ屰㓈ᦡ䍃ⶠᩘ·0ᘀ■䌻ᛆ೭崚㤲䄃㊜ᐅΘ☗䵮䆀㪱楲曞䐹ॱ掃♅ോ᠗㜮扜㐐䬋ᛦؠ䂀㠄瑡僆喽䭣Ⴖ◆ฌᤗ㜭屢Ⴤ୨暖\u202d\x0ć慣䫚\u05c9ࡣዣ䜆䲋ᢖ〮桜လ㌫嘖ඎ䅝\u1718⸰ɠ㠀挐㛶浬ᡘ㠹湥擨⧥熈֧̒䮌\u17190栤ᖡ殓䘖䯭寙㜺慤勨㦽ࡃ拣旆\u0b8cᰙᄀ僨䦕୫盆ಫ尞㜰楳峞䐡ㅱ㋣◆ೌց楬峄㦽毋囶\u2e6eಁᢗ〮䘎֡獳䙖\u206d\u0b8c\x98ਂ壊妕⌋⛷മ䌙\u1718㠱摜䒴䅱䋣ↆ塛㜴损䋐㦹挫ဖ\x06ǀ㪹敮勘ᦍঈˣ◆䅌㮄牯䣘ᆕ⍋〷⺬䁚\x98椈棜䦕୳ᛆ☠䂀ㆁ浦渖䂸ű˓⹎䲙Μ敮滨䦽\u0b5b̐@ᡃㆹ楨䫨再Ꭻ林䚀๋ᰗܴ䫜巑፻ᚷ☠\x00㮇楥䣤㦥㬻䘖ⳬᴙᤃ㈮扜Ä桨瘶ⳎᲝ㒷畴䫤ᗍ熘挂䘅ɀ㤺獡䛐㦅㎛挐䘅䱋Ț慭峒䐅\x01傐汭嬝㎴瑨૦㣄熁̲愀嵘㪱扭擊吕ॱ⋣\x06᳁シቤ屢惄ᅱዓ䗆ಌ᠗⸴橢\u0984倘ᙖℭ䮎\u171b⸰恤᳤䌘昖ⷍ嬙ᢂ〮恜ࠄ࠘♖\u20c6ౌᢗ㐮娈▅୳ጐ@孂㖲湡曒ᦵƈ⋣◆䈍㊶慫勜㗍࠳挃䙅ോȀ戅壈থࡃዣ䜦ೋᮗ洊壪◑挓㛶\u2d6cಀȀ業䛦䐅ခだ⹌ᡙ㊺〇橜䂸ⅱ偆Ⱝ定ᢀȀ渒斅⎛曷沭䆜᠘ㄮ恜㠜⌫睷湍䃚\u17180ఀㆌ殫㜆Ďஎ\u1718⬰恢栀䎘䝖ຮᥜ㠼牥嫒㦕ண㛆ಮ崝㜴獧戊䂸⥱#污᭛㞳瑲᳦㣄䆉⋣▦\u0b8d\u1718⸰ࡨִ獋ဖ䀆\u0380シ畴䫤\u0dcd死ᜆ湬䒜\u1718㠱摜䒴䥱狣䖦ᯙ㎹\u0e65䋜嗑⮓㜶ⷬ尛㦰ͳ屢Ӏ瀐䜰䷮塜㊳敮滨䦽捛挐إஎᚙ⸱屬ツ୨暖毭娘㜰敮˘Ä\u2000♡Ⱞᥛㆲ浯䋠再ጣ瘗䲮᳜ᢅㄮ婰㣐熉̂Ƞ奙㞱慲勨ᗙዻ盆汭峚ᤂㄮ恜⠀笐ᝆⷌ尞㨷ٳ屰㣀ᆉ〃ುᢝケ正惪䧍࠱ˣ◆\u0dccҁ潣僌ൽ፻ٗ䘡උᨗ㈮\u0e62ᖜ⭳ᜦⶌ䱀Ā洈哆旑䭣㘦䘡ో᚜⸶屠哄桁☶⺍嬞ㄴ\u3103恜\x04䡀ܶ氮宝㤲\u3103恜␀㌨♗漮寘㠶ㄌ扜㣠榑挒䚥\u0dcbԀ敪棒ᗝ嬋♖惮\u0b8c\u1718⸰p値ጫᜧⶌᴚδ⸰ᱠ㤽ሪ僐䴭ᩛ㎷慧仈冕㎛挐☥\u0b8cਘ慭峒㥽⌫睷湍埚㐱湡䫜ֱƐ䀠䱡ᡜ㨳睴䋊ᖭ㮓掐䘥䱋ᮜ洄勂ᖹ熈挂\u0605䂀ゅ慫僦ඥ箣囖\u20cc䮌ᚚ〲娈▅୳̐₀妁㤷敧Ȇ改\u2062嚗湌峗㤷楴仜䐍ű倃\u0e60嬜㨴\u3103扜ࠄᡰ䛶淭峜㘰档曊䷑ࠫˣ旇䌌㐱湡䫜綱୪暖₭\u0b8c\u1718İఄᗌ⭣囦↬䮌ᰘ㈮扚䒸熹玒ⷀ崙㞻歲戂\x00ₘᜦญṜ㞶摡峒䶝ጛ噗ⷌుᬗ㐮ᰆ䦌㌋ᝆ淍崙㊻歡\u0ee6ᖸ㮣⛷浮ీ᠗Ѐ娒㦥ᬫᜦೌ䆝\u1718㠱摜吨፳癗洬崜㤲䘄ᢚӍ၀癗洬崜㤲䘄ᢚӍ怀址乌ᡜ㘱湥䫈䇉熈̒䗇䭌\u1718⸱屠䃄Ƒㆀ෮娜㦴楴䋆ᗑጣ㘖൬塜㖱癳Ố㣄䆉⋣▦\u0b8c\u1718⸴摢Ⰰ筨㝖ಮ川ゲ獫Ȇ改䀒ᝀ⺍官㪴խ屦㣔㦱因溌ᯝ㖹\u3103恜Є倠䘖ಬ䍀㤱慥䫨巑ଫ嚶์ಂ᠗〮扜ࣜ⡰㘖漮嶗㘴慬䫎䷉\u086bዣ䜆䲋ᢖ〮扜᳀⬠ᙦຬ崛ᢂ〮恜ࠄ(ڗ䲮䌞\u1718㠱摜䒴ॱ勣æᥙコ汵૨㣄熁ጂ怀婁㊱敢令Ѝ䩲\x15ು幛㐻敥Ә㐘猋䝆䲭ుᲗ㈮\u0e6eᖸ㮣⛷\u2d6eీ\x00攉廆㶱䬻㘶₮䮌\u171bȳ戊ו宓ぶ䗆䭌᪙и䋚㦥ࠋ\u2003ƀ塞㤲浯峒㖥̋⁷䙆䱋\u1718б䋚㦥ࠛˣ&ƀ㒸灧峊怕űዣ⁆如㦰扴峊\u218d〫ˣ䗆䇌㐱湡䫜ᖱ熠换★䂀㠄汯嫲䦽䎃Ⴖ◆ฌᤗ〭桜ა୨暖\u202d\x0cԀ畡廨ᗉ挻⚖\u20cc䮌᚛㌵ᰄ凌፻瘗ಬ岙㮰牥೦䃄ᅱዣↆ塛㜴损䋐㦹挫ဖ\x06̀㘳硵䫜巑፻㚷惮\u0b8d\u1718⸷p㠨笫㛦⹌ᦘ᤺㈃摜\u2008猨♖Ɱᬙζ⸰ᱠ㤽㨪因溌ᯝ㖹々恜䂸ခ႐ฌ嬜㦲楫ᣜ㣈熡㌂涥ౘᢗи狦ඹࠋဓ䅠ᥙ㤹瑩䛊䦽ጫ僠෭ᵙザ牲櫞ᗑᮓႇ◇䮌ᚘ㌹娘▅筳ص䰭宛㘲㈁\x00䡐㌫暖ಭ᳙㞺慲䫎ᆅ笣㛦®\u0b8c\u171c2帔ᗁ捳ᛶⲌᲙᢃ⸲屠ࣄ⁈嚇䯬塝㘺ᅴ屢惄ᅱ⋓׆䮌᠘㠮牬㠜⌫睷湍ƚ\u1718㘲恜Ѐ梨䛶䲬宜㒺昺櫘㧡⌫睷湍峚ᮁ㜰\x00", - "fmlNetworkVersion": 3, - "mods": [], - "truncated": True, - }, - "players": {"max": 20, "online": 0}, - "version": {"name": "1.18.2", "protocol": 758}, -} From 77d47c5b77be2dc09badfe13493047c597401f1e Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 14:53:33 -0500 Subject: [PATCH 10/67] Try to raise coverage --- tests/status_response/test_java.py | 6 +- tests/test_forge_data.py | 438 +++++++++++++++++++++++++++++ 2 files changed, 442 insertions(+), 2 deletions(-) create mode 100644 tests/test_forge_data.py diff --git a/tests/status_response/test_java.py b/tests/status_response/test_java.py index 6ceda2d5..5ec66cd6 100644 --- a/tests/status_response/test_java.py +++ b/tests/status_response/test_java.py @@ -67,7 +67,7 @@ def build(self): "online": 0, "sample": [ {"name": "foo", "id": "0b3717c4-f45d-47c8-b8e2-3d9ff6f93a89"}, - {"name": "bar""id": "61699b2e-d327-4a01-9f1e-0ea8c3f06bc6"}, + {"name": "bar", "id": "61699b2e-d327-4a01-9f1e-0ea8c3f06bc6"}, {"name": "baz", "id": "40e8d003-8872-412d-b09a-4431a5afcbd4"}, ], } @@ -522,7 +522,9 @@ def build(self): return ForgeData.build( { "channels": [], - "d": bytes.fromhex('e0ba8b0000c484e4a0b0e18e9be19997e2baaee1b399e392bae7a5a6e6908ae4a2b8c5b1e380a3e2b1a1e1a39ee39eb6e78db0e5bb86e19789e0a0b3e18ba3e49aa6e0b18be38686e685a8e5b39ce38695e6abbbe19896e2b78de0b181e1a097e380ae02d098e2aeabe19987e2b7ade0b181e1a097e38caee1b880e59684e4af83e19b86e4b0ade1b99ce398b1e68dafe69b96e490b5e0a5b1e68e83e29985e0b08be1a097e384aed1a8e4b1a0ceabe29997e2b6aee1b298e392bae6b9aae6a1ace0b388e78dbbe199a6e0b3ade1a99bcab1e2b8b1e5b1a2e38398e4ae98e39ba7e6aface1af98e38cb7e69da9cba6c384e4a090e49890e0b2ade5b39ee39eb6e78da2e6888ce492b8e78781e48da2e2b6a1e1a998e2beb7e6a1a3e5b382e196b9e0ada3cc90e48080e1a184e386b9e6a5a8e4aba8e5868de7ae9be19c85e2b68ce1b499e38abae38485e6899ce4a2b8e48081e198b0e2b3ace5b299e3aab4e0b1ade5b1a2e68384e185b1e18b93e29786e0ae8c18e6b48ae6bb86e2979de28db3e79bb6e2b9aee0b281e1a097e38caee28884e3b78ce48e83e39a96e2ba8ee5a39ae3a8b0e691a5e5bb86e19789e0a28be18ba3e49c86e4b28be1a096e394aee6999ce3a388e3a689e78e93e0b1a0e1a19ae39cb7e6b1a5e6888200e280b8e59a87e2b98ce1a19bd0b6e2b8b1e5b1ace3a38ce48691e380a3e4b981e5b499e39eb7e78dace48b84e1978de0a193e18ba3e29c86e0b38be1a097e3a4aee69096e58699e7adbbe39b86e2b18ee5b398c6b2e2b8b1c9a0e48080e78d88e49a96e2b4aee5ac98e39cb4e695b6e6a39ce4a6bde2af8be68da0e49885e0b88bdc81e789a9e5b39ee1969de2adb3e19ca6e6ba8ce5b29bcab9e2b8b2e5b1a0e3a384e18d88e69bb7e2b3ade5ae99e3a4b2e791a1e6939ed78dc688e580a0e2bc81e1a598e39eb9e6bdb7e5a3a4e39691cc8be181a7e49786e0b58ce1a297e6b484e58b82e0b6b9e78688e18c8240e5a385e39eb7e6a5abe4bb9ce3b699e18e93e79b86e6b1ade5a89ae382b2e78da4e6888ce3a388e78681e78ca2e2b780e5b499e39ebbe6adb2e68886e482b8e0a081e382b0e4b7ace1b49be39eb9e6b1ace5b392e0a69de480a0e59ba7e4ba8ce0b182e1a297e2b4b8e5b1a8e3a380e286a9e69e80e0b2ade4839de19c98c4b0e0b884e38780e1ac8be29996e2b7ace0b681e1a897e384aee6808ed6b1e2ac9be798a6e282ade0ae8ce19c98c4b0e0b884e2968ce0aea3e59986e4b68ce0b181e1a297e2b8b1e1a1a6d6b4e78d8be397b6e2b48ce1ae98e38ab7c5ac62e19080e7ae80e19db6e4b48ce0b382e1a097e384aee4919ae58695cc8be28290e6b7ace5ab9be390b9e6b1a5e0bb8ce4b384e185b1e58ba3d886c980e39eb6e791afe4ab84e39685e38e9be68c90d8a5e4ae8ec498e78c96e6839ee296a1e28e9be39a97e0b0ace1a59de384b2e68da1e68396e0b685e1ad9be184a7e29786e0b88ce1a497e38cade6899ce3a3a0e2a699e78ba3e49aa6e4878ce390b1e6b9a1e4ab9cd6b1c688e58080e6ba80e5a99de3a6b3e38493e6899ce582b8c5a9e49897e0b1aee4b19ae1a295e384aee5b1b0e0a388e181b8e19d96e0b68de1a999e38eb7e685a7e4bb88e58695e48e9be68cb1e698a5e0ae8ce19a98e795a2e5a392e3a691e5a6a9e39b92e498ace0b18be19c9ce7b4b2e5a888e29685e0adb3cd80e28080e5a482e3a4b0e795abe58ba8e4b6b1e0a0b3e68c83e49885e0b58bd080e68dade4a3aee3b6bde1ae93e18197d786e0ae8c1be79c87e4a382e38691e1acabe18397e29786e0b88ce1a497e380ade7819ce492b8e18789e584a0e6b2ade1a19ae392b7e6b5b3e4ab8ee196b9e0ae93e79d86e6b98de4869ce1a098e388aee6a99ce39188e5acabe69896e6b4ade5ad9ce38ab3e695aee48ba4e3b791e1ae93e181a7e49886e0b28be1aa9700e49088e38685e3adabe68cb0e49985e4b08be1a095d483e48baee386a5e58c8be59ba0e6ba8ce1af9de396b9e6b9a9e0ab8ee3a384e78681e18c82e68080e5aa82e3a4b2e78da5e6ab9ee0b789e1acabc2a7e29786e0b48ce1a297e384aee689aee38084e68c98e49bb6e6b48ee5a397e39cb7e6a5a6d38ee4b0b8e2ad83e19d86e0b88de5a99ae39cb0e6bda3e4aba4e4b09de0a5b1e68c83d8a5e48c8ce382b6e6b9a9e49abed6a1e78db3e49996e282ade0ae8ce19c9830e18884e59690e6adabe59b96e2b6ade1b99be1a285e384aee5a9b0e3a384e786a9e48ca2e2b281e5ad9de3b2b6e6a1a3e5b382e196b9e0ada3cc90e68180e5b383e3a0bae6b1b0e5ab8ae3a695e0aea3e19ca6e6b2ade48d9ce19c98e3a0b1e6919ce492b4e2a5b1e18ba3e699a6e5ae81e3a8b2e6bdb7e59ba4e49085e18081e283a0e4b2aee1a999e38ab7e78da4e5bba8d789e2acbbe181a6e29786e0b08ce1a497e6b48ce58b82e7b6b9e48c9ae69896e2b78de5ac99e1a28000e59890e3a6bde18d9be49997e2b2aee0b181e1a697e38caee1a080d694e4ae9bd7b7e6b4aee5ac99e39cb4e0b1b3e5b1a2e68384e185b1e18b93d786e0ae8cc498e68c86e6939ee4b781e68cabe68c90d8a5e0ae8ee19a99e2b8b1e5b1a0e1b388e2aca0e199a6e0baace5b49be1a282e380aee6819cd08440e39897e2b5ace1a59be3aab7e0a880e49b9ae0a79de4ae93e79986e6b2acc59ce19c99e2b8b066e580ace18dbbd8b7e2b6ade1b398e38abad9b2e781a2e492b8c5b1e38083e6b1a1e1ad9be3a4b8e78da5e58ba6e39795e0a2b3e48ba3e49786e0ad8ce3aab1e6b1a9e5b388e2b3a4e1ada9e68c96d8a5e0ae8ec499e78084e5b392e2a69de78688cc92e296a7e0ae8ce19c9ce0b0b0e58ba0e1b6b9e1abbbe19a86e4b78ce1a59bcab6e4a590e0ba9cd385e68090e29a90e4b7aee5a69be3a4bae685aee4ab86e1978de78698e68cb2d8a5e1a985e39eb9e699aee693aad6b9e2ac9be79cb6e2b78be5b499e39ebbe6adb2e68886e482b809e582b0e6b1ade1b49de3a0b9e6bda4e6939ee1978de78688e68c82db85e48980e386b6e699b7e5b38ae1968de2ae9be68c90e49885e0b58be0ac80e795b3e4aba0e39789e18c8be19d87e4b58de0b69be1a49ae6bda3e4aba4e296b1e38c93e68c90e49885e4b18b1ce78c8be5ab92e38781e68f8be79a96e0b48ce4959de19c98e3a0b1e6919ce492b4e285b1e28ba3e496a6e5b598e398b4e2b9a4e689a6e1b088e7ac90e19d86e2b78ce1a19ae1a285e384aee5b1b0e39388e1a6a1e48d83e2b6a0e1a998c2b730e19880e296a0e48cbbe19b86e0b3ade5b49ae3a4b2e48483e38a9ce19085ce98e29897e4b5aee48680e3aab1e6a5b2e69b9ee490b9e0a5b1e68e83e29985e0b58be1a097e39caee6899ce39090e4ac8be19ba6d8a0e48280e3a084e791a1e58386e596bde4ada3e182b6e29786e0b88ce1a497e39cade5b1a2e18384e0ada8e69a96e280ad0ccc81e685a3e4ab9ad789e0a1a3e18ba3e49c86e4b28be1a296e380aee6a19ce1809ce38cabe59896e0b68ee4859de19c98e2b8b0c9a0e3a080e68c90e39bb6e6b5ace1a198e3a0b9e6b9a5e693a8e2a7a5e78688cc92d6a7e4ae8ce19c9930e6a0a4e196a1e6ae93e49896e4afade5af99e39cbae685a4e58ba8e3a6bde0a183e68ba3e69786e0ae8ce1b099e18480e583a8e4a695e0adabe79b86e0b2abe5b09ee39cb0e6a5b3e5b39ee490a1e385b1e38ba3e29786e0b38cd681e6a5ace5b384e3a6bde6af8be59bb6e2b9aee0b281e1a297e380aee4988ed6a1e78db3e49996e281ade0ae8cc298e0a882e5a38ae5a695e28c8be29bb7e0b4aee48c99e19c98e3a0b1e6919ce492b4e485b1e48ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606c780e3aab9e695aee58b98e1a68de0a688cba3e29786e4858ce3ae84e789afe4a398e18695e28d8be380b7e2baace4819ac298e6a488e6a39ce4a695e0adb3e19b86e298a0e48280e38681e6b5a6e6b896e482b8c5b1cb93e2b98ee4b299ce9ce695aee6bba8e4a6bde0ad9bcc9040e1a183e386b9e6a5a8e4aba8e5868de18eabe69e97e49a80e0b98be1b097dcb4e4ab9ce5b791e18dbbe19ab7e298a000e3ae87e6a5a5e4a3a4e3a6a5e3acbbe49896e2b3ace1b499e1a483e388aee6899cc384e6a1a8e798b6e2b38ee1b29de392b7e795b4e4aba4e1978de78698e68c82e49885c980e3a4bae78da1e49b90e3a685e38e9be68c90e49885e4b18bc89ae685ade5b392e4908501e58290e6b1ade5ac9de38eb4e791a8e0aba6e3a384e78681ccb2e68480e5b598e3aab1e689ade6938ae59095e0a5b1e28ba306e1b381e382b7e189a4e5b1a2e68384e185b1e18b93e49786e0b28ce1a097e2b8b4e6a9a2e0a684e58098e19996e284ade4ae8ee19c9be2b8b0e681a4e1b3a4e48c98e69896e2b78de5ac99e1a282e380aee6819ce0a084e0a098e29996e28386e0b18ce1a297e390aee5a888e29685e0adb3e18c9040e5ad82e396b2e6b9a1e69b92e1a6b5c688e28ba3e29786e4888de38ab6e685abe58b9ce3978de0a0b3e68c83e49985e0b58bc880e68885e5a388e0a6a5e0a183e18ba3e49ca6e0b38be1ae97e6b48ae5a3aae29791e68c93e39bb6e2b5ace0b280c880e6a5ade49ba6e49085e18081e381a0e2b98ce1a199e38abae38087e6a99ce482b8e285b1e58186e2b0ade5ae9ae1a280c880e6b892e69685e28e9be69bb7e6b2ade4869ce1a098e384aee6819ce3a09ce28cabe79db7e6b98de4839ae19c9830e0b080e3868ce6aeabe39c86c48ee0ae8ee19c98e2acb0e681a2e6a080e48e98e49d96e0baaee1a59ce3a0bce789a5e5ab92e3a695e0aea3e39b86e0b2aee5b49de39cb4e78da7e6888ae482b8e2a5b123e6b1a1e1ad9be39eb3e791b2e1b3a6e3a384e48689e28ba3e296a6e0ae8de19c98e2b8b0e0a1a8d6b4e78d8be18096e48086ce80e382b7e795b4e4aba4e0b78de6adbbe19c86e6b9ace4929ce19c98e3a0b1e6919ce492b4e4a5b1e78ba3e496a6e1af99e38eb9e0b9a5e48b9ce59791e2ae93e39cb6e2b7ace5b09be3a6b0cdb3e5b1a2d380e78090e49cb0e4b7aee5a19ce38ab3e695aee6bba8e4a6bde68d9be68c90d8a5e0ae8ee19a99e2b8b1e5b1ace38384e0ada8e69a96e6afade5a898e39cb0e695aecb98c384e28080e299a1e2b0aee1a59be386b2e6b5afe48ba0e5868de18ca3e79897e4b2aee1b39ce1a285e384aee5a9b0e3a390e78689cc82c8a0e5a599e39eb1e685b2e58ba8e19799e18bbbe79b86e6b1ade5b39ae1a482e384aee6819ce2a080e7ac90e19d86e2b78ce5b09ee3a8b7d9b3e5b1b0e3a380e18689e38083e0b381e1a29de382b1e6ada3e683aae4a78de0a0b1cba3e29786e0b78cd281e6bda3e5838ce0b5bde18dbbd997e498a1e0b68be1a897e388aee0b9a2e1969ce2adb3e19ca6e2b68ce4b180c480e6b488e59386e69791e4ada3e398a6e498a1e0b18be19a9ce2b8b6e5b1a0e59384e6a181e298b6e2ba8de5ac9ee384b4e38483e6819c04e4a180dcb6e6b0aee5ae9de3a4b2e38483e6819ce29080e38ca8e29997e6bcaee5af98e3a0b6e3848ce6899ce3a3a0e6a691e68c92e49aa5e0b78bd480e695aae6a392e1979de5ac8be29996e683aee0ae8ce19c98e2b8b070e580a4e18cabe19ca7e2b68ce1b49aceb4e2b8b0e1b1a0e3a4bde188aae58390e4b4ade1a99be38eb7e685a7e4bb88e58695e38e9be68c90e298a5e0ae8ce0a898e685ade5b392e3a5bde28cabe79db7e6b98de59f9ae390b1e6b9a1e4ab9cd6b1c690e480a0e4b1a1e1a19ce3a8b3e79db4e48b8ae196ade3ae93e68e90e498a5e4b18be1ae9ce6b484e58b82e196b9e78688e68c82d885e48280e38285e685abe583a6e0b6a5e7aea3e59b96e2838ce4ae8ce19a9ae380b2e5a888e29685e0adb3cc90e28280e5a681e3a4b7e695a7c886e694b9e281a2e59a97e6b98ce5b397e3a4b7e6a5b4e4bb9ce4908dc5b1e58083e0b9a0e5ac9ce3a8b4e38483e6899ce0a084e1a1b0e49bb6e6b7ade5b39ce398b0e6a1a3e69b8ae4b791e0a0abcba3e69787e48c8ce390b1e6b9a1e4ab9ce7b6b1e0adaae69a96e282ade0ae8ce19c98c4b0e0b084e1978ce2ada3e59ba6e286ace4ae8ce1b098e388aee6899ae492b8e786b9e78e92e2b780e5b499e39ebbe6adb2e6888200e28298e19ca6e0b88de1b99ce39eb6e691a1e5b392e4b69de18c9be59997e2b78ce0b181e1ac97e390aee1b086e4a68ce38c8be19d86e6b78de5b499e38abbe6ada1e0bba6e196b8e3aea3e29bb7e6b5aee0b180e1a097d080e5a892e3a6a5e1acabe19ca6e0b38ce4869de19c98e3a0b1e6919ce590a8e18db3e79997e6b4ace5b49ce3a4b2e49884e1a29ad38de18180e79997e6b4ace5b49ce3a4b2e49884e1a29ad38de68080e59d80e4b98ce1a19ce398b1e6b9a5e4ab88e48789e78688cc92e49787e4ad8ce19c98e2b8b1e5b1a0e48384c691e38680e0b7aee5a89ce3a6b4e6a5b4e48b86e19791e18ca3e39896e0b5ace5a19ce396b1e799b3e1bb90e3a384e48689e28ba3e296a6e0ae8ce19c98e2b8b4e691a2e2b080e7ada8e39d96e0b2aee5b79de382b2e78dabc886e694b9e48092e19d80e2ba8de5ae98e3aab4d5ade5b1a6e3a394e3a6b1e59ba0e6ba8ce1af9de396b9e38483e6819cd084e580a0e49896e0b2ace48d80e3a4b1e685a5e4aba8e5b791e0acabe59ab6e0b98ce0b282e1a097e380aee6899ce0a39ce2a1b0e39896e6bcaee5b697e398b4e685ace4ab8ee4b789e0a1abe18ba3e49c86e4b28be1a296e380aee6899ce1b380e2aca0e199a6e0baace5b49be1a282e380aee6819ce0a08428da97e4b2aee48c9ee19c98e3a0b1e6919ce492b4e0a5b1e58ba3c3a6e1a599e382b3e6b1b5e0aba8e3a384e78681e18c82e68080e5a981e38ab1e695a2e4bba4d08de4a9b215e0b381e5b99be390bbe695a5d398e39098e78c8be49d86e4b2ade0b181e1b297e388aee0b9aee196b8e3aea3e29bb7e2b5aee0b18000e69489e5bb86e3b6b1e4acbbe398b6e282aee4ae8ce19c9bc8b3e6888ad795e5ae93e381b6e49786e4ad8ce1aa99d0b8e48b9ae3a6a5e0a08be28083c680e5a19ee3a4b2e6b5afe5b392e396a5cc8be281b7e49986e4b18be19c98d0b1e48b9ae3a6a5e0a09bcba326c680e392b8e781a7e5b38ae68095c5b1e18ba3e28186e5a682e3a6b0e689b4e5b38ae2868de380abcba3e49786e4878ce390b1e6b9a1e4ab9ce196b1e786a0e68da2e29885e48280e3a084e6b1afe5abb2e4a6bde48e83e182b6e29786e0b88ce1a497e380ade6a19ce18390e0ada8e69a96e280ad0cd480e795a1e5bba8e19789e68cbbe29a96e2838ce4ae8ce19a9be38cb5e1b084e5878ce18dbbe79897e0b2ace5b299e3aeb0e789a5e0b3a6e48384e185b1e18ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606cc80e398b3e7a1b5e4ab9ce5b791e18dbbe39ab7e683aee0ae8de19c98e2b8b770e3a0a8e7acabe39ba6e2b98ce1a698e1a4bae38883e6919ce28088e78ca8e29996e2b1aee1ac99ceb6e2b8b0e1b1a0e3a4bde3a8aae59ba0e6ba8ce1af9de396b9e38085e6819ce482b8e18081e18290e0b88ce5ac9ce3a6b2e6a5abe1a39ce3a388e786a1e38c82e6b6a5e0b198e1a297d0b8e78ba6e0b6b9e0a08be18093e485a0e1a599e3a4b9e791a9e49b8ae4a6bde18cabe583a0e0b7ade1b599e382b6e789b2e6ab9ee19791e1ae93e18287e29787e4ae8ce19a98e38cb9e5a898e29685e7adb3d8b5e4b0ade5ae9be398b2e3888100e4a190e38cabe69a96e0b2ade1b399e39ebae685b2e4ab8ee18685e7aca3e39ba6c2aee0ae8ce19c9c32e5b894e19781e68db3e19bb6e2b28ce1b299e1a283e2b8b2e5b1a0e0a384e28188e59a87e4aface5a19de398bae185b4e5b1a2e68384e185b1e28b93d786e4ae8ce1a098e3a0aee789ace3a09ce28cabe79db7e6b98dc69ae19c98e398b2e6819cd080e6a2a8e49bb6e4b2ace5ae9ce392bae698bae6ab98e3a7a1e28cabe79db7e6b98de5b39ae1ae81e39cb000').decode("utf-8"), + "d": bytes.fromhex( + "e0ba8b0000c484e4a0b0e18e9be19997e2baaee1b399e392bae7a5a6e6908ae4a2b8c5b1e380a3e2b1a1e1a39ee39eb6e78db0e5bb86e19789e0a0b3e18ba3e49aa6e0b18be38686e685a8e5b39ce38695e6abbbe19896e2b78de0b181e1a097e380ae02d098e2aeabe19987e2b7ade0b181e1a097e38caee1b880e59684e4af83e19b86e4b0ade1b99ce398b1e68dafe69b96e490b5e0a5b1e68e83e29985e0b08be1a097e384aed1a8e4b1a0ceabe29997e2b6aee1b298e392bae6b9aae6a1ace0b388e78dbbe199a6e0b3ade1a99bcab1e2b8b1e5b1a2e38398e4ae98e39ba7e6aface1af98e38cb7e69da9cba6c384e4a090e49890e0b2ade5b39ee39eb6e78da2e6888ce492b8e78781e48da2e2b6a1e1a998e2beb7e6a1a3e5b382e196b9e0ada3cc90e48080e1a184e386b9e6a5a8e4aba8e5868de7ae9be19c85e2b68ce1b499e38abae38485e6899ce4a2b8e48081e198b0e2b3ace5b299e3aab4e0b1ade5b1a2e68384e185b1e18b93e29786e0ae8c18e6b48ae6bb86e2979de28db3e79bb6e2b9aee0b281e1a097e38caee28884e3b78ce48e83e39a96e2ba8ee5a39ae3a8b0e691a5e5bb86e19789e0a28be18ba3e49c86e4b28be1a096e394aee6999ce3a388e3a689e78e93e0b1a0e1a19ae39cb7e6b1a5e6888200e280b8e59a87e2b98ce1a19bd0b6e2b8b1e5b1ace3a38ce48691e380a3e4b981e5b499e39eb7e78dace48b84e1978de0a193e18ba3e29c86e0b38be1a097e3a4aee69096e58699e7adbbe39b86e2b18ee5b398c6b2e2b8b1c9a0e48080e78d88e49a96e2b4aee5ac98e39cb4e695b6e6a39ce4a6bde2af8be68da0e49885e0b88bdc81e789a9e5b39ee1969de2adb3e19ca6e6ba8ce5b29bcab9e2b8b2e5b1a0e3a384e18d88e69bb7e2b3ade5ae99e3a4b2e791a1e6939ed78dc688e580a0e2bc81e1a598e39eb9e6bdb7e5a3a4e39691cc8be181a7e49786e0b58ce1a297e6b484e58b82e0b6b9e78688e18c8240e5a385e39eb7e6a5abe4bb9ce3b699e18e93e79b86e6b1ade5a89ae382b2e78da4e6888ce3a388e78681e78ca2e2b780e5b499e39ebbe6adb2e68886e482b8e0a081e382b0e4b7ace1b49be39eb9e6b1ace5b392e0a69de480a0e59ba7e4ba8ce0b182e1a297e2b4b8e5b1a8e3a380e286a9e69e80e0b2ade4839de19c98c4b0e0b884e38780e1ac8be29996e2b7ace0b681e1a897e384aee6808ed6b1e2ac9be798a6e282ade0ae8ce19c98c4b0e0b884e2968ce0aea3e59986e4b68ce0b181e1a297e2b8b1e1a1a6d6b4e78d8be397b6e2b48ce1ae98e38ab7c5ac62e19080e7ae80e19db6e4b48ce0b382e1a097e384aee4919ae58695cc8be28290e6b7ace5ab9be390b9e6b1a5e0bb8ce4b384e185b1e58ba3d886c980e39eb6e791afe4ab84e39685e38e9be68c90d8a5e4ae8ec498e78c96e6839ee296a1e28e9be39a97e0b0ace1a59de384b2e68da1e68396e0b685e1ad9be184a7e29786e0b88ce1a497e38cade6899ce3a3a0e2a699e78ba3e49aa6e4878ce390b1e6b9a1e4ab9cd6b1c688e58080e6ba80e5a99de3a6b3e38493e6899ce582b8c5a9e49897e0b1aee4b19ae1a295e384aee5b1b0e0a388e181b8e19d96e0b68de1a999e38eb7e685a7e4bb88e58695e48e9be68cb1e698a5e0ae8ce19a98e795a2e5a392e3a691e5a6a9e39b92e498ace0b18be19c9ce7b4b2e5a888e29685e0adb3cd80e28080e5a482e3a4b0e795abe58ba8e4b6b1e0a0b3e68c83e49885e0b58bd080e68dade4a3aee3b6bde1ae93e18197d786e0ae8c1be79c87e4a382e38691e1acabe18397e29786e0b88ce1a497e380ade7819ce492b8e18789e584a0e6b2ade1a19ae392b7e6b5b3e4ab8ee196b9e0ae93e79d86e6b98de4869ce1a098e388aee6a99ce39188e5acabe69896e6b4ade5ad9ce38ab3e695aee48ba4e3b791e1ae93e181a7e49886e0b28be1aa9700e49088e38685e3adabe68cb0e49985e4b08be1a095d483e48baee386a5e58c8be59ba0e6ba8ce1af9de396b9e6b9a9e0ab8ee3a384e78681e18c82e68080e5aa82e3a4b2e78da5e6ab9ee0b789e1acabc2a7e29786e0b48ce1a297e384aee689aee38084e68c98e49bb6e6b48ee5a397e39cb7e6a5a6d38ee4b0b8e2ad83e19d86e0b88de5a99ae39cb0e6bda3e4aba4e4b09de0a5b1e68c83d8a5e48c8ce382b6e6b9a9e49abed6a1e78db3e49996e282ade0ae8ce19c9830e18884e59690e6adabe59b96e2b6ade1b99be1a285e384aee5a9b0e3a384e786a9e48ca2e2b281e5ad9de3b2b6e6a1a3e5b382e196b9e0ada3cc90e68180e5b383e3a0bae6b1b0e5ab8ae3a695e0aea3e19ca6e6b2ade48d9ce19c98e3a0b1e6919ce492b4e2a5b1e18ba3e699a6e5ae81e3a8b2e6bdb7e59ba4e49085e18081e283a0e4b2aee1a999e38ab7e78da4e5bba8d789e2acbbe181a6e29786e0b08ce1a497e6b48ce58b82e7b6b9e48c9ae69896e2b78de5ac99e1a28000e59890e3a6bde18d9be49997e2b2aee0b181e1a697e38caee1a080d694e4ae9bd7b7e6b4aee5ac99e39cb4e0b1b3e5b1a2e68384e185b1e18b93d786e0ae8cc498e68c86e6939ee4b781e68cabe68c90d8a5e0ae8ee19a99e2b8b1e5b1a0e1b388e2aca0e199a6e0baace5b49be1a282e380aee6819cd08440e39897e2b5ace1a59be3aab7e0a880e49b9ae0a79de4ae93e79986e6b2acc59ce19c99e2b8b066e580ace18dbbd8b7e2b6ade1b398e38abad9b2e781a2e492b8c5b1e38083e6b1a1e1ad9be3a4b8e78da5e58ba6e39795e0a2b3e48ba3e49786e0ad8ce3aab1e6b1a9e5b388e2b3a4e1ada9e68c96d8a5e0ae8ec499e78084e5b392e2a69de78688cc92e296a7e0ae8ce19c9ce0b0b0e58ba0e1b6b9e1abbbe19a86e4b78ce1a59bcab6e4a590e0ba9cd385e68090e29a90e4b7aee5a69be3a4bae685aee4ab86e1978de78698e68cb2d8a5e1a985e39eb9e699aee693aad6b9e2ac9be79cb6e2b78be5b499e39ebbe6adb2e68886e482b809e582b0e6b1ade1b49de3a0b9e6bda4e6939ee1978de78688e68c82db85e48980e386b6e699b7e5b38ae1968de2ae9be68c90e49885e0b58be0ac80e795b3e4aba0e39789e18c8be19d87e4b58de0b69be1a49ae6bda3e4aba4e296b1e38c93e68c90e49885e4b18b1ce78c8be5ab92e38781e68f8be79a96e0b48ce4959de19c98e3a0b1e6919ce492b4e285b1e28ba3e496a6e5b598e398b4e2b9a4e689a6e1b088e7ac90e19d86e2b78ce1a19ae1a285e384aee5b1b0e39388e1a6a1e48d83e2b6a0e1a998c2b730e19880e296a0e48cbbe19b86e0b3ade5b49ae3a4b2e48483e38a9ce19085ce98e29897e4b5aee48680e3aab1e6a5b2e69b9ee490b9e0a5b1e68e83e29985e0b58be1a097e39caee6899ce39090e4ac8be19ba6d8a0e48280e3a084e791a1e58386e596bde4ada3e182b6e29786e0b88ce1a497e39cade5b1a2e18384e0ada8e69a96e280ad0ccc81e685a3e4ab9ad789e0a1a3e18ba3e49c86e4b28be1a296e380aee6a19ce1809ce38cabe59896e0b68ee4859de19c98e2b8b0c9a0e3a080e68c90e39bb6e6b5ace1a198e3a0b9e6b9a5e693a8e2a7a5e78688cc92d6a7e4ae8ce19c9930e6a0a4e196a1e6ae93e49896e4afade5af99e39cbae685a4e58ba8e3a6bde0a183e68ba3e69786e0ae8ce1b099e18480e583a8e4a695e0adabe79b86e0b2abe5b09ee39cb0e6a5b3e5b39ee490a1e385b1e38ba3e29786e0b38cd681e6a5ace5b384e3a6bde6af8be59bb6e2b9aee0b281e1a297e380aee4988ed6a1e78db3e49996e281ade0ae8cc298e0a882e5a38ae5a695e28c8be29bb7e0b4aee48c99e19c98e3a0b1e6919ce492b4e485b1e48ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606c780e3aab9e695aee58b98e1a68de0a688cba3e29786e4858ce3ae84e789afe4a398e18695e28d8be380b7e2baace4819ac298e6a488e6a39ce4a695e0adb3e19b86e298a0e48280e38681e6b5a6e6b896e482b8c5b1cb93e2b98ee4b299ce9ce695aee6bba8e4a6bde0ad9bcc9040e1a183e386b9e6a5a8e4aba8e5868de18eabe69e97e49a80e0b98be1b097dcb4e4ab9ce5b791e18dbbe19ab7e298a000e3ae87e6a5a5e4a3a4e3a6a5e3acbbe49896e2b3ace1b499e1a483e388aee6899cc384e6a1a8e798b6e2b38ee1b29de392b7e795b4e4aba4e1978de78698e68c82e49885c980e3a4bae78da1e49b90e3a685e38e9be68c90e49885e4b18bc89ae685ade5b392e4908501e58290e6b1ade5ac9de38eb4e791a8e0aba6e3a384e78681ccb2e68480e5b598e3aab1e689ade6938ae59095e0a5b1e28ba306e1b381e382b7e189a4e5b1a2e68384e185b1e18b93e49786e0b28ce1a097e2b8b4e6a9a2e0a684e58098e19996e284ade4ae8ee19c9be2b8b0e681a4e1b3a4e48c98e69896e2b78de5ac99e1a282e380aee6819ce0a084e0a098e29996e28386e0b18ce1a297e390aee5a888e29685e0adb3e18c9040e5ad82e396b2e6b9a1e69b92e1a6b5c688e28ba3e29786e4888de38ab6e685abe58b9ce3978de0a0b3e68c83e49985e0b58bc880e68885e5a388e0a6a5e0a183e18ba3e49ca6e0b38be1ae97e6b48ae5a3aae29791e68c93e39bb6e2b5ace0b280c880e6a5ade49ba6e49085e18081e381a0e2b98ce1a199e38abae38087e6a99ce482b8e285b1e58186e2b0ade5ae9ae1a280c880e6b892e69685e28e9be69bb7e6b2ade4869ce1a098e384aee6819ce3a09ce28cabe79db7e6b98de4839ae19c9830e0b080e3868ce6aeabe39c86c48ee0ae8ee19c98e2acb0e681a2e6a080e48e98e49d96e0baaee1a59ce3a0bce789a5e5ab92e3a695e0aea3e39b86e0b2aee5b49de39cb4e78da7e6888ae482b8e2a5b123e6b1a1e1ad9be39eb3e791b2e1b3a6e3a384e48689e28ba3e296a6e0ae8de19c98e2b8b0e0a1a8d6b4e78d8be18096e48086ce80e382b7e795b4e4aba4e0b78de6adbbe19c86e6b9ace4929ce19c98e3a0b1e6919ce492b4e4a5b1e78ba3e496a6e1af99e38eb9e0b9a5e48b9ce59791e2ae93e39cb6e2b7ace5b09be3a6b0cdb3e5b1a2d380e78090e49cb0e4b7aee5a19ce38ab3e695aee6bba8e4a6bde68d9be68c90d8a5e0ae8ee19a99e2b8b1e5b1ace38384e0ada8e69a96e6afade5a898e39cb0e695aecb98c384e28080e299a1e2b0aee1a59be386b2e6b5afe48ba0e5868de18ca3e79897e4b2aee1b39ce1a285e384aee5a9b0e3a390e78689cc82c8a0e5a599e39eb1e685b2e58ba8e19799e18bbbe79b86e6b1ade5b39ae1a482e384aee6819ce2a080e7ac90e19d86e2b78ce5b09ee3a8b7d9b3e5b1b0e3a380e18689e38083e0b381e1a29de382b1e6ada3e683aae4a78de0a0b1cba3e29786e0b78cd281e6bda3e5838ce0b5bde18dbbd997e498a1e0b68be1a897e388aee0b9a2e1969ce2adb3e19ca6e2b68ce4b180c480e6b488e59386e69791e4ada3e398a6e498a1e0b18be19a9ce2b8b6e5b1a0e59384e6a181e298b6e2ba8de5ac9ee384b4e38483e6819c04e4a180dcb6e6b0aee5ae9de3a4b2e38483e6819ce29080e38ca8e29997e6bcaee5af98e3a0b6e3848ce6899ce3a3a0e6a691e68c92e49aa5e0b78bd480e695aae6a392e1979de5ac8be29996e683aee0ae8ce19c98e2b8b070e580a4e18cabe19ca7e2b68ce1b49aceb4e2b8b0e1b1a0e3a4bde188aae58390e4b4ade1a99be38eb7e685a7e4bb88e58695e38e9be68c90e298a5e0ae8ce0a898e685ade5b392e3a5bde28cabe79db7e6b98de59f9ae390b1e6b9a1e4ab9cd6b1c690e480a0e4b1a1e1a19ce3a8b3e79db4e48b8ae196ade3ae93e68e90e498a5e4b18be1ae9ce6b484e58b82e196b9e78688e68c82d885e48280e38285e685abe583a6e0b6a5e7aea3e59b96e2838ce4ae8ce19a9ae380b2e5a888e29685e0adb3cc90e28280e5a681e3a4b7e695a7c886e694b9e281a2e59a97e6b98ce5b397e3a4b7e6a5b4e4bb9ce4908dc5b1e58083e0b9a0e5ac9ce3a8b4e38483e6899ce0a084e1a1b0e49bb6e6b7ade5b39ce398b0e6a1a3e69b8ae4b791e0a0abcba3e69787e48c8ce390b1e6b9a1e4ab9ce7b6b1e0adaae69a96e282ade0ae8ce19c98c4b0e0b084e1978ce2ada3e59ba6e286ace4ae8ce1b098e388aee6899ae492b8e786b9e78e92e2b780e5b499e39ebbe6adb2e6888200e28298e19ca6e0b88de1b99ce39eb6e691a1e5b392e4b69de18c9be59997e2b78ce0b181e1ac97e390aee1b086e4a68ce38c8be19d86e6b78de5b499e38abbe6ada1e0bba6e196b8e3aea3e29bb7e6b5aee0b180e1a097d080e5a892e3a6a5e1acabe19ca6e0b38ce4869de19c98e3a0b1e6919ce590a8e18db3e79997e6b4ace5b49ce3a4b2e49884e1a29ad38de18180e79997e6b4ace5b49ce3a4b2e49884e1a29ad38de68080e59d80e4b98ce1a19ce398b1e6b9a5e4ab88e48789e78688cc92e49787e4ad8ce19c98e2b8b1e5b1a0e48384c691e38680e0b7aee5a89ce3a6b4e6a5b4e48b86e19791e18ca3e39896e0b5ace5a19ce396b1e799b3e1bb90e3a384e48689e28ba3e296a6e0ae8ce19c98e2b8b4e691a2e2b080e7ada8e39d96e0b2aee5b79de382b2e78dabc886e694b9e48092e19d80e2ba8de5ae98e3aab4d5ade5b1a6e3a394e3a6b1e59ba0e6ba8ce1af9de396b9e38483e6819cd084e580a0e49896e0b2ace48d80e3a4b1e685a5e4aba8e5b791e0acabe59ab6e0b98ce0b282e1a097e380aee6899ce0a39ce2a1b0e39896e6bcaee5b697e398b4e685ace4ab8ee4b789e0a1abe18ba3e49c86e4b28be1a296e380aee6899ce1b380e2aca0e199a6e0baace5b49be1a282e380aee6819ce0a08428da97e4b2aee48c9ee19c98e3a0b1e6919ce492b4e0a5b1e58ba3c3a6e1a599e382b3e6b1b5e0aba8e3a384e78681e18c82e68080e5a981e38ab1e695a2e4bba4d08de4a9b215e0b381e5b99be390bbe695a5d398e39098e78c8be49d86e4b2ade0b181e1b297e388aee0b9aee196b8e3aea3e29bb7e2b5aee0b18000e69489e5bb86e3b6b1e4acbbe398b6e282aee4ae8ce19c9bc8b3e6888ad795e5ae93e381b6e49786e4ad8ce1aa99d0b8e48b9ae3a6a5e0a08be28083c680e5a19ee3a4b2e6b5afe5b392e396a5cc8be281b7e49986e4b18be19c98d0b1e48b9ae3a6a5e0a09bcba326c680e392b8e781a7e5b38ae68095c5b1e18ba3e28186e5a682e3a6b0e689b4e5b38ae2868de380abcba3e49786e4878ce390b1e6b9a1e4ab9ce196b1e786a0e68da2e29885e48280e3a084e6b1afe5abb2e4a6bde48e83e182b6e29786e0b88ce1a497e380ade6a19ce18390e0ada8e69a96e280ad0cd480e795a1e5bba8e19789e68cbbe29a96e2838ce4ae8ce19a9be38cb5e1b084e5878ce18dbbe79897e0b2ace5b299e3aeb0e789a5e0b3a6e48384e185b1e18ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606cc80e398b3e7a1b5e4ab9ce5b791e18dbbe39ab7e683aee0ae8de19c98e2b8b770e3a0a8e7acabe39ba6e2b98ce1a698e1a4bae38883e6919ce28088e78ca8e29996e2b1aee1ac99ceb6e2b8b0e1b1a0e3a4bde3a8aae59ba0e6ba8ce1af9de396b9e38085e6819ce482b8e18081e18290e0b88ce5ac9ce3a6b2e6a5abe1a39ce3a388e786a1e38c82e6b6a5e0b198e1a297d0b8e78ba6e0b6b9e0a08be18093e485a0e1a599e3a4b9e791a9e49b8ae4a6bde18cabe583a0e0b7ade1b599e382b6e789b2e6ab9ee19791e1ae93e18287e29787e4ae8ce19a98e38cb9e5a898e29685e7adb3d8b5e4b0ade5ae9be398b2e3888100e4a190e38cabe69a96e0b2ade1b399e39ebae685b2e4ab8ee18685e7aca3e39ba6c2aee0ae8ce19c9c32e5b894e19781e68db3e19bb6e2b28ce1b299e1a283e2b8b2e5b1a0e0a384e28188e59a87e4aface5a19de398bae185b4e5b1a2e68384e185b1e28b93d786e4ae8ce1a098e3a0aee789ace3a09ce28cabe79db7e6b98dc69ae19c98e398b2e6819cd080e6a2a8e49bb6e4b2ace5ae9ce392bae698bae6ab98e3a7a1e28cabe79db7e6b98de5b39ae1ae81e39cb000" + ).decode("utf-8"), "fmlNetworkVersion": 3, "mods": [], "truncated": True, diff --git a/tests/test_forge_data.py b/tests/test_forge_data.py new file mode 100644 index 00000000..3ad53dac --- /dev/null +++ b/tests/test_forge_data.py @@ -0,0 +1,438 @@ +import pytest + +from mcstatus.forge_data import ForgeData, decode_forge_data, decode_optimized + +ENCODED_STRING = bytes.fromhex( + "e0ba8b0000c484e4a0b0e18e9be19997e2baaee1b399e392bae7a5a6e6908ae4a2b8c5b1e380a3e2b1a1e1a39ee39eb6e78db0e5bb86e19789e0a0b3e18ba3e49aa6e0b18be38686e685a8e5b39ce38695e6abbbe19896e2b78de0b181e1a097e380ae02d098e2aeabe19987e2b7ade0b181e1a097e38caee1b880e59684e4af83e19b86e4b0ade1b99ce398b1e68dafe69b96e490b5e0a5b1e68e83e29985e0b08be1a097e384aed1a8e4b1a0ceabe29997e2b6aee1b298e392bae6b9aae6a1ace0b388e78dbbe199a6e0b3ade1a99bcab1e2b8b1e5b1a2e38398e4ae98e39ba7e6aface1af98e38cb7e69da9cba6c384e4a090e49890e0b2ade5b39ee39eb6e78da2e6888ce492b8e78781e48da2e2b6a1e1a998e2beb7e6a1a3e5b382e196b9e0ada3cc90e48080e1a184e386b9e6a5a8e4aba8e5868de7ae9be19c85e2b68ce1b499e38abae38485e6899ce4a2b8e48081e198b0e2b3ace5b299e3aab4e0b1ade5b1a2e68384e185b1e18b93e29786e0ae8c18e6b48ae6bb86e2979de28db3e79bb6e2b9aee0b281e1a097e38caee28884e3b78ce48e83e39a96e2ba8ee5a39ae3a8b0e691a5e5bb86e19789e0a28be18ba3e49c86e4b28be1a096e394aee6999ce3a388e3a689e78e93e0b1a0e1a19ae39cb7e6b1a5e6888200e280b8e59a87e2b98ce1a19bd0b6e2b8b1e5b1ace3a38ce48691e380a3e4b981e5b499e39eb7e78dace48b84e1978de0a193e18ba3e29c86e0b38be1a097e3a4aee69096e58699e7adbbe39b86e2b18ee5b398c6b2e2b8b1c9a0e48080e78d88e49a96e2b4aee5ac98e39cb4e695b6e6a39ce4a6bde2af8be68da0e49885e0b88bdc81e789a9e5b39ee1969de2adb3e19ca6e6ba8ce5b29bcab9e2b8b2e5b1a0e3a384e18d88e69bb7e2b3ade5ae99e3a4b2e791a1e6939ed78dc688e580a0e2bc81e1a598e39eb9e6bdb7e5a3a4e39691cc8be181a7e49786e0b58ce1a297e6b484e58b82e0b6b9e78688e18c8240e5a385e39eb7e6a5abe4bb9ce3b699e18e93e79b86e6b1ade5a89ae382b2e78da4e6888ce3a388e78681e78ca2e2b780e5b499e39ebbe6adb2e68886e482b8e0a081e382b0e4b7ace1b49be39eb9e6b1ace5b392e0a69de480a0e59ba7e4ba8ce0b182e1a297e2b4b8e5b1a8e3a380e286a9e69e80e0b2ade4839de19c98c4b0e0b884e38780e1ac8be29996e2b7ace0b681e1a897e384aee6808ed6b1e2ac9be798a6e282ade0ae8ce19c98c4b0e0b884e2968ce0aea3e59986e4b68ce0b181e1a297e2b8b1e1a1a6d6b4e78d8be397b6e2b48ce1ae98e38ab7c5ac62e19080e7ae80e19db6e4b48ce0b382e1a097e384aee4919ae58695cc8be28290e6b7ace5ab9be390b9e6b1a5e0bb8ce4b384e185b1e58ba3d886c980e39eb6e791afe4ab84e39685e38e9be68c90d8a5e4ae8ec498e78c96e6839ee296a1e28e9be39a97e0b0ace1a59de384b2e68da1e68396e0b685e1ad9be184a7e29786e0b88ce1a497e38cade6899ce3a3a0e2a699e78ba3e49aa6e4878ce390b1e6b9a1e4ab9cd6b1c688e58080e6ba80e5a99de3a6b3e38493e6899ce582b8c5a9e49897e0b1aee4b19ae1a295e384aee5b1b0e0a388e181b8e19d96e0b68de1a999e38eb7e685a7e4bb88e58695e48e9be68cb1e698a5e0ae8ce19a98e795a2e5a392e3a691e5a6a9e39b92e498ace0b18be19c9ce7b4b2e5a888e29685e0adb3cd80e28080e5a482e3a4b0e795abe58ba8e4b6b1e0a0b3e68c83e49885e0b58bd080e68dade4a3aee3b6bde1ae93e18197d786e0ae8c1be79c87e4a382e38691e1acabe18397e29786e0b88ce1a497e380ade7819ce492b8e18789e584a0e6b2ade1a19ae392b7e6b5b3e4ab8ee196b9e0ae93e79d86e6b98de4869ce1a098e388aee6a99ce39188e5acabe69896e6b4ade5ad9ce38ab3e695aee48ba4e3b791e1ae93e181a7e49886e0b28be1aa9700e49088e38685e3adabe68cb0e49985e4b08be1a095d483e48baee386a5e58c8be59ba0e6ba8ce1af9de396b9e6b9a9e0ab8ee3a384e78681e18c82e68080e5aa82e3a4b2e78da5e6ab9ee0b789e1acabc2a7e29786e0b48ce1a297e384aee689aee38084e68c98e49bb6e6b48ee5a397e39cb7e6a5a6d38ee4b0b8e2ad83e19d86e0b88de5a99ae39cb0e6bda3e4aba4e4b09de0a5b1e68c83d8a5e48c8ce382b6e6b9a9e49abed6a1e78db3e49996e282ade0ae8ce19c9830e18884e59690e6adabe59b96e2b6ade1b99be1a285e384aee5a9b0e3a384e786a9e48ca2e2b281e5ad9de3b2b6e6a1a3e5b382e196b9e0ada3cc90e68180e5b383e3a0bae6b1b0e5ab8ae3a695e0aea3e19ca6e6b2ade48d9ce19c98e3a0b1e6919ce492b4e2a5b1e18ba3e699a6e5ae81e3a8b2e6bdb7e59ba4e49085e18081e283a0e4b2aee1a999e38ab7e78da4e5bba8d789e2acbbe181a6e29786e0b08ce1a497e6b48ce58b82e7b6b9e48c9ae69896e2b78de5ac99e1a28000e59890e3a6bde18d9be49997e2b2aee0b181e1a697e38caee1a080d694e4ae9bd7b7e6b4aee5ac99e39cb4e0b1b3e5b1a2e68384e185b1e18b93d786e0ae8cc498e68c86e6939ee4b781e68cabe68c90d8a5e0ae8ee19a99e2b8b1e5b1a0e1b388e2aca0e199a6e0baace5b49be1a282e380aee6819cd08440e39897e2b5ace1a59be3aab7e0a880e49b9ae0a79de4ae93e79986e6b2acc59ce19c99e2b8b066e580ace18dbbd8b7e2b6ade1b398e38abad9b2e781a2e492b8c5b1e38083e6b1a1e1ad9be3a4b8e78da5e58ba6e39795e0a2b3e48ba3e49786e0ad8ce3aab1e6b1a9e5b388e2b3a4e1ada9e68c96d8a5e0ae8ec499e78084e5b392e2a69de78688cc92e296a7e0ae8ce19c9ce0b0b0e58ba0e1b6b9e1abbbe19a86e4b78ce1a59bcab6e4a590e0ba9cd385e68090e29a90e4b7aee5a69be3a4bae685aee4ab86e1978de78698e68cb2d8a5e1a985e39eb9e699aee693aad6b9e2ac9be79cb6e2b78be5b499e39ebbe6adb2e68886e482b809e582b0e6b1ade1b49de3a0b9e6bda4e6939ee1978de78688e68c82db85e48980e386b6e699b7e5b38ae1968de2ae9be68c90e49885e0b58be0ac80e795b3e4aba0e39789e18c8be19d87e4b58de0b69be1a49ae6bda3e4aba4e296b1e38c93e68c90e49885e4b18b1ce78c8be5ab92e38781e68f8be79a96e0b48ce4959de19c98e3a0b1e6919ce492b4e285b1e28ba3e496a6e5b598e398b4e2b9a4e689a6e1b088e7ac90e19d86e2b78ce1a19ae1a285e384aee5b1b0e39388e1a6a1e48d83e2b6a0e1a998c2b730e19880e296a0e48cbbe19b86e0b3ade5b49ae3a4b2e48483e38a9ce19085ce98e29897e4b5aee48680e3aab1e6a5b2e69b9ee490b9e0a5b1e68e83e29985e0b58be1a097e39caee6899ce39090e4ac8be19ba6d8a0e48280e3a084e791a1e58386e596bde4ada3e182b6e29786e0b88ce1a497e39cade5b1a2e18384e0ada8e69a96e280ad0ccc81e685a3e4ab9ad789e0a1a3e18ba3e49c86e4b28be1a296e380aee6a19ce1809ce38cabe59896e0b68ee4859de19c98e2b8b0c9a0e3a080e68c90e39bb6e6b5ace1a198e3a0b9e6b9a5e693a8e2a7a5e78688cc92d6a7e4ae8ce19c9930e6a0a4e196a1e6ae93e49896e4afade5af99e39cbae685a4e58ba8e3a6bde0a183e68ba3e69786e0ae8ce1b099e18480e583a8e4a695e0adabe79b86e0b2abe5b09ee39cb0e6a5b3e5b39ee490a1e385b1e38ba3e29786e0b38cd681e6a5ace5b384e3a6bde6af8be59bb6e2b9aee0b281e1a297e380aee4988ed6a1e78db3e49996e281ade0ae8cc298e0a882e5a38ae5a695e28c8be29bb7e0b4aee48c99e19c98e3a0b1e6919ce492b4e485b1e48ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606c780e3aab9e695aee58b98e1a68de0a688cba3e29786e4858ce3ae84e789afe4a398e18695e28d8be380b7e2baace4819ac298e6a488e6a39ce4a695e0adb3e19b86e298a0e48280e38681e6b5a6e6b896e482b8c5b1cb93e2b98ee4b299ce9ce695aee6bba8e4a6bde0ad9bcc9040e1a183e386b9e6a5a8e4aba8e5868de18eabe69e97e49a80e0b98be1b097dcb4e4ab9ce5b791e18dbbe19ab7e298a000e3ae87e6a5a5e4a3a4e3a6a5e3acbbe49896e2b3ace1b499e1a483e388aee6899cc384e6a1a8e798b6e2b38ee1b29de392b7e795b4e4aba4e1978de78698e68c82e49885c980e3a4bae78da1e49b90e3a685e38e9be68c90e49885e4b18bc89ae685ade5b392e4908501e58290e6b1ade5ac9de38eb4e791a8e0aba6e3a384e78681ccb2e68480e5b598e3aab1e689ade6938ae59095e0a5b1e28ba306e1b381e382b7e189a4e5b1a2e68384e185b1e18b93e49786e0b28ce1a097e2b8b4e6a9a2e0a684e58098e19996e284ade4ae8ee19c9be2b8b0e681a4e1b3a4e48c98e69896e2b78de5ac99e1a282e380aee6819ce0a084e0a098e29996e28386e0b18ce1a297e390aee5a888e29685e0adb3e18c9040e5ad82e396b2e6b9a1e69b92e1a6b5c688e28ba3e29786e4888de38ab6e685abe58b9ce3978de0a0b3e68c83e49985e0b58bc880e68885e5a388e0a6a5e0a183e18ba3e49ca6e0b38be1ae97e6b48ae5a3aae29791e68c93e39bb6e2b5ace0b280c880e6a5ade49ba6e49085e18081e381a0e2b98ce1a199e38abae38087e6a99ce482b8e285b1e58186e2b0ade5ae9ae1a280c880e6b892e69685e28e9be69bb7e6b2ade4869ce1a098e384aee6819ce3a09ce28cabe79db7e6b98de4839ae19c9830e0b080e3868ce6aeabe39c86c48ee0ae8ee19c98e2acb0e681a2e6a080e48e98e49d96e0baaee1a59ce3a0bce789a5e5ab92e3a695e0aea3e39b86e0b2aee5b49de39cb4e78da7e6888ae482b8e2a5b123e6b1a1e1ad9be39eb3e791b2e1b3a6e3a384e48689e28ba3e296a6e0ae8de19c98e2b8b0e0a1a8d6b4e78d8be18096e48086ce80e382b7e795b4e4aba4e0b78de6adbbe19c86e6b9ace4929ce19c98e3a0b1e6919ce492b4e4a5b1e78ba3e496a6e1af99e38eb9e0b9a5e48b9ce59791e2ae93e39cb6e2b7ace5b09be3a6b0cdb3e5b1a2d380e78090e49cb0e4b7aee5a19ce38ab3e695aee6bba8e4a6bde68d9be68c90d8a5e0ae8ee19a99e2b8b1e5b1ace38384e0ada8e69a96e6afade5a898e39cb0e695aecb98c384e28080e299a1e2b0aee1a59be386b2e6b5afe48ba0e5868de18ca3e79897e4b2aee1b39ce1a285e384aee5a9b0e3a390e78689cc82c8a0e5a599e39eb1e685b2e58ba8e19799e18bbbe79b86e6b1ade5b39ae1a482e384aee6819ce2a080e7ac90e19d86e2b78ce5b09ee3a8b7d9b3e5b1b0e3a380e18689e38083e0b381e1a29de382b1e6ada3e683aae4a78de0a0b1cba3e29786e0b78cd281e6bda3e5838ce0b5bde18dbbd997e498a1e0b68be1a897e388aee0b9a2e1969ce2adb3e19ca6e2b68ce4b180c480e6b488e59386e69791e4ada3e398a6e498a1e0b18be19a9ce2b8b6e5b1a0e59384e6a181e298b6e2ba8de5ac9ee384b4e38483e6819c04e4a180dcb6e6b0aee5ae9de3a4b2e38483e6819ce29080e38ca8e29997e6bcaee5af98e3a0b6e3848ce6899ce3a3a0e6a691e68c92e49aa5e0b78bd480e695aae6a392e1979de5ac8be29996e683aee0ae8ce19c98e2b8b070e580a4e18cabe19ca7e2b68ce1b49aceb4e2b8b0e1b1a0e3a4bde188aae58390e4b4ade1a99be38eb7e685a7e4bb88e58695e38e9be68c90e298a5e0ae8ce0a898e685ade5b392e3a5bde28cabe79db7e6b98de59f9ae390b1e6b9a1e4ab9cd6b1c690e480a0e4b1a1e1a19ce3a8b3e79db4e48b8ae196ade3ae93e68e90e498a5e4b18be1ae9ce6b484e58b82e196b9e78688e68c82d885e48280e38285e685abe583a6e0b6a5e7aea3e59b96e2838ce4ae8ce19a9ae380b2e5a888e29685e0adb3cc90e28280e5a681e3a4b7e695a7c886e694b9e281a2e59a97e6b98ce5b397e3a4b7e6a5b4e4bb9ce4908dc5b1e58083e0b9a0e5ac9ce3a8b4e38483e6899ce0a084e1a1b0e49bb6e6b7ade5b39ce398b0e6a1a3e69b8ae4b791e0a0abcba3e69787e48c8ce390b1e6b9a1e4ab9ce7b6b1e0adaae69a96e282ade0ae8ce19c98c4b0e0b084e1978ce2ada3e59ba6e286ace4ae8ce1b098e388aee6899ae492b8e786b9e78e92e2b780e5b499e39ebbe6adb2e6888200e28298e19ca6e0b88de1b99ce39eb6e691a1e5b392e4b69de18c9be59997e2b78ce0b181e1ac97e390aee1b086e4a68ce38c8be19d86e6b78de5b499e38abbe6ada1e0bba6e196b8e3aea3e29bb7e6b5aee0b180e1a097d080e5a892e3a6a5e1acabe19ca6e0b38ce4869de19c98e3a0b1e6919ce590a8e18db3e79997e6b4ace5b49ce3a4b2e49884e1a29ad38de18180e79997e6b4ace5b49ce3a4b2e49884e1a29ad38de68080e59d80e4b98ce1a19ce398b1e6b9a5e4ab88e48789e78688cc92e49787e4ad8ce19c98e2b8b1e5b1a0e48384c691e38680e0b7aee5a89ce3a6b4e6a5b4e48b86e19791e18ca3e39896e0b5ace5a19ce396b1e799b3e1bb90e3a384e48689e28ba3e296a6e0ae8ce19c98e2b8b4e691a2e2b080e7ada8e39d96e0b2aee5b79de382b2e78dabc886e694b9e48092e19d80e2ba8de5ae98e3aab4d5ade5b1a6e3a394e3a6b1e59ba0e6ba8ce1af9de396b9e38483e6819cd084e580a0e49896e0b2ace48d80e3a4b1e685a5e4aba8e5b791e0acabe59ab6e0b98ce0b282e1a097e380aee6899ce0a39ce2a1b0e39896e6bcaee5b697e398b4e685ace4ab8ee4b789e0a1abe18ba3e49c86e4b28be1a296e380aee6899ce1b380e2aca0e199a6e0baace5b49be1a282e380aee6819ce0a08428da97e4b2aee48c9ee19c98e3a0b1e6919ce492b4e0a5b1e58ba3c3a6e1a599e382b3e6b1b5e0aba8e3a384e78681e18c82e68080e5a981e38ab1e695a2e4bba4d08de4a9b215e0b381e5b99be390bbe695a5d398e39098e78c8be49d86e4b2ade0b181e1b297e388aee0b9aee196b8e3aea3e29bb7e2b5aee0b18000e69489e5bb86e3b6b1e4acbbe398b6e282aee4ae8ce19c9bc8b3e6888ad795e5ae93e381b6e49786e4ad8ce1aa99d0b8e48b9ae3a6a5e0a08be28083c680e5a19ee3a4b2e6b5afe5b392e396a5cc8be281b7e49986e4b18be19c98d0b1e48b9ae3a6a5e0a09bcba326c680e392b8e781a7e5b38ae68095c5b1e18ba3e28186e5a682e3a6b0e689b4e5b38ae2868de380abcba3e49786e4878ce390b1e6b9a1e4ab9ce196b1e786a0e68da2e29885e48280e3a084e6b1afe5abb2e4a6bde48e83e182b6e29786e0b88ce1a497e380ade6a19ce18390e0ada8e69a96e280ad0cd480e795a1e5bba8e19789e68cbbe29a96e2838ce4ae8ce19a9be38cb5e1b084e5878ce18dbbe79897e0b2ace5b299e3aeb0e789a5e0b3a6e48384e185b1e18ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606cc80e398b3e7a1b5e4ab9ce5b791e18dbbe39ab7e683aee0ae8de19c98e2b8b770e3a0a8e7acabe39ba6e2b98ce1a698e1a4bae38883e6919ce28088e78ca8e29996e2b1aee1ac99ceb6e2b8b0e1b1a0e3a4bde3a8aae59ba0e6ba8ce1af9de396b9e38085e6819ce482b8e18081e18290e0b88ce5ac9ce3a6b2e6a5abe1a39ce3a388e786a1e38c82e6b6a5e0b198e1a297d0b8e78ba6e0b6b9e0a08be18093e485a0e1a599e3a4b9e791a9e49b8ae4a6bde18cabe583a0e0b7ade1b599e382b6e789b2e6ab9ee19791e1ae93e18287e29787e4ae8ce19a98e38cb9e5a898e29685e7adb3d8b5e4b0ade5ae9be398b2e3888100e4a190e38cabe69a96e0b2ade1b399e39ebae685b2e4ab8ee18685e7aca3e39ba6c2aee0ae8ce19c9c32e5b894e19781e68db3e19bb6e2b28ce1b299e1a283e2b8b2e5b1a0e0a384e28188e59a87e4aface5a19de398bae185b4e5b1a2e68384e185b1e28b93d786e4ae8ce1a098e3a0aee789ace3a09ce28cabe79db7e6b98dc69ae19c98e398b2e6819cd080e6a2a8e49bb6e4b2ace5ae9ce392bae698bae6ab98e3a7a1e28cabe79db7e6b98de5b39ae1ae81e39cb000" +).decode("utf-8") + + +def test_forge_data_build() -> None: + assert ForgeData.build({"fmlNetworkVersion": 3, "channels": [], "mods": []}) == ForgeData( + fml_network_version=3, channels=[], mods=[], truncated=False + ) + + +def test_decode_optimized() -> None: + buffer = decode_optimized(ENCODED_STRING) + assert buffer.received == bytearray.fromhex( + "000082000c72737265717565737469667905322e322e30020b6379636c6f7073636f726506312e31352e310c6368616e6e656c5f6d61696e05312e302e3001000661757564696f05312e302e33000f617578696c69617279626c6f636b730d312e31382e322d302e302e3134021873757065726d617274696a6e363432636f6e6669676c696205312e312e360c73796e635f636f6e666967730131000209616c6578736d6f627306312e31382e360c6d61696e5f6368616e6e656c0131000012617263686974656374735f70616c6574746505312e312e320008636167657269756d0c312e31382e322d312e312e30000a6d637777696e646f777305322e302e330211736f7068697374696361746564636f726511312e31382e322d302e352e33322e313739076368616e6e656c0131000007746865726d616c08312e362e332e3238020b7266746f6f6c73626173650a312e31382d332e302e390b7266746f6f6c736261736503312e30010010696e697469616c696e76656e746f727905362e302e38020e69726f6e67656e657261746f727305322e302e310e69726f6e67656e657261746f7273013100020d786165726f776f726c646d617006312e32352e31046d61696e03312e30010214636f6f6b696e67666f72626c6f636b68656164730631322e302e32076e6574776f726b03312e3000010b636f6e74726f6c6c696e670204786e65740a312e31382d342e302e3504786e657403312e30010207706c616365626f05362e342e3107706c616365626f05312e302e300102076369746164656c06312e31312e330c6d61696e5f6368616e6e656c0131000005706f7761680a332e302e312d626574610009626f6f6b7368656c660731332e322e353000096c6f6f746265616d7306312e31382e310216736f70686973746963617465646261636b7061636b7312312e31382e322d332e31382e33352e373532076368616e6e656c0131000005747769677313312e312e342d7061746368312b312e31382e32020f6275696c64696e676761646765747318332e31332e302d6275696c642e352b6d63312e31382e327d046d61696e01340000096461726b7574696c730631302e302e3500086d6377646f6f727305312e302e360007776164646c65730d312e31382e322d302e382e313902126d656b616e69736d67656e657261746f72730631302e322e35126d656b616e69736d67656e657261746f72730631302e322e3500000462616c6d07332e322e302b3003057761696c610a6e6574776f726b696e6705312e302e3001000b6a657265736f75726365730a302e31342e312e313731010c636c6f74685f636f6e666967020e7368657469706869616e636f726507332e31302e31300c6d61696e5f6368616e6e656c05312e302e3000020964756d6d6d6d6d6d790a312e31382d312e352e320c64756d6d796368616e6e656c013100020f737570706c656d656e7461726965730d312e31382e322d312e352e3133076e6574776f726b013100020e726566696e656473746f7261676506312e31302e320c6d61696e5f6368616e6e656c01310000086b6f6e6b7265746505312e332e33000c656173795f7069676c696e730c312e31382e322d312e302e300206636f727073650c312e31382e322d312e302e320764656661756c7405312e302e300101087061636b6d656e75000a6d63776272696467657305322e302e33000b746f7263686d61737465720631382e312e30000b636f6d707265737369756d16312e342e322d6275696c642e392b6d63312e31382e32020470696e670a312e31382d312e382e300c70696e675f6368616e6e656c0550494e473101020c69726f6e6675726e6163657305332e332e311469726f6e6675726e616365735f6e6574776f726b03312e3001000b6d6377747270646f6f727305312e302e3600096d637766656e63657305312e302e35001673757065726d617274696a6e363432636f72656c696206312e302e3139000b73696d706c796c6967687415312e31382e322d312e342e322d6275696c642e33310207626f74616e69610a312e31382e322d343334046d61696e013000000b686967686c69676874657203414e590105737061726b0206637572696f730e312e31382e322d352e302e372e31046d61696e013100020970617463686f756c690b312e31382e322d37312e31046d61696e013100020663616d6572610c312e31382e322d312e302e340764656661756c7405312e302e3001000e626c6f636b63617270656e7472790a312e31382d302e332e300012746865726d616c5f666f756e646174696f6e08312e362e332e32380011746865726d616c5f657870616e73696f6e08312e362e332e3133020b6c69626e6f6e796d6f757305322e312e30076368616e6e656c03312e3001020a656c657661746f7269640c312e31382e322d312e382e340c6d61696e5f6368616e6e656c013100000772756e656c69630631312e302e310509776f726c64656469740363756901310108696e7465726e616c013101020363666d0b372e302e302d7072653239076e6574776f726b013100020c61726368697465637475727906342e392e3834076e6574776f726b013101000e7765697264696e6767616467657406322e322e3131000d6d63776675726e69747572657305332e302e300209747261736863616e7306312e302e3135046d61696e01310000096d63776c696768747305312e302e330008637563756d62657205352e312e320004736e616412312e31382e322d312e32322e30342e31356102036a656909392e372e302e323039076368616e6e656c05312e302e300102036165320631312e312e34046d61696e01310102086d656b616e69736d0631302e322e35086d656b616e69736d0631302e322e3500040562646c696208312e31392e332e370a6d756c7469626c6f636b013200046d697363013100020663726561746507302e352e302e64046d61696e013100020977617973746f6e65730631302e312e30076e6574776f726b03312e30000006636c756d707308382e302e302b3130001a7368757475706578706572696d656e74616c73657474696e677305312e302e350208636f6d666f7274730e312e31382e322d352e302e302e34046d61696e013100020e6e617475726573636f6d7061737312312e31382e322d312e392e372d666f7267650e6e617475726573636f6d7061737303312e3001020e73746f726167656e6574776f726b0c312e31382e322d312e362e310c6d61696e5f6368616e6e656c01310000146672616d6564636f6d70616374647261776572730a312e31382d342e312e3000116465636f7261746976655f626c6f636b7305322e312e30000a626f74616e79706f747306382e302e3132000b6674626261636b7570733206312e302e31370209636f66685f636f726508312e362e342e32310767656e6572616c01310102086d636a74796c69620b312e31382d362e302e3135086d636a74796c696203312e3001000869737061776e657203312e3000096576657279636f6d700c312e31382e322d312e352e37000a6a6569747765616b657207332e302e302e38000974657272616c69746807302e304e4f4e45020d6d696e696e676761646765747306312e31312e30146d61696e5f6e6574776f726b5f6368616e6e656c013200020c6372616674747765616b657207392e312e313937046d61696e05312e302e3000020b616b6173686963746f6d6506312e352d3230046d61696e0131000405666f72676503414e590c746965725f736f7274696e6703312e30000573706c697403312e3101020e636f6c6f7373616c63686573747305312e382e330c6368616e6e656c5f6d61696e05312e302e3001020673656c656e650d312e31382e322d312e31372e39076e6574776f726b01310000136472697070796c6f6164696e6773637265656e05312e362e34030e6372616674696e67747765616b73076e6574776f726b03312e300004096d696e65637261667406312e31382e320a756e726567697374657204464d4c330108726567697374657204464d4c3301000c7465727261626c656e64657210312e31382e322d312e312e302e3130320018736f70686973746963617465646261636b7061636b7376680f312e31382e322d312e302e342e3132000b6d6f757365747765616b7303414e590208746974616e69756d05332e352e36076e6574776f726b03312e300101046a616465000d637265617465747765616b657208322e302e302e3137020e656173795f76696c6c61676572730d312e31382e322d312e302e31300764656661756c7405312e302e30010205706970657a0c312e31382e322d312e312e350764656661756c7405312e302e300100076963656265726703414e590108666c79776865656c02066d616e746c6506312e392e3237076e6574776f726b013100000965636f6c6f6769637305312e372e330205717561726b07332e322d333538046d61696e013100020c786165726f6d696e696d61700732322e31312e31046d61696e03312e3001000670696770656e05382e302e3102096661737462656e636805362e302e32076368616e6e656c05342e362e30010209706f6c796d6f7270680b312e31382e322d302e3434046d61696e013100000a6175746f7265676c696206312e372d3533020e73746f72616765647261776572730631302e322e310c6d61696e5f6368616e6e656c013100000c666c75786e6574776f726b7307372e302e372e38000a6e656f6e63726166743203322e320208656e657263656c6c07302e304e4f4e45076e6574776f726b05302e302e300002096170706c65736b696e0c322e342e302b6d63312e31380473796e63013101010b66657272697465636f7265020e6d6f64756c6172726f757465727308392e312e312d39330c6d61696e5f6368616e6e656c0132000014726566696e656473746f726167656164646f6e7305302e382e32000a6f70656e6c6f616465720631322e302e3102097468655f7661756c7411312e31382e322d322e302e31302e383639076e6574776f726b06302e32362e300001156d6f6465726e75693a666c75786e6574776f726b730337303700" + ) + + +def test_decode_forge_data() -> None: + forge_data = decode_forge_data( + { + "channels": [], + "d": ENCODED_STRING, + "fmlNetworkVersion": 3, + "mods": [], + "truncated": True, + } + ) + assert forge_data == { + "fml_network_version": 3, + "channels": [ + { + "res": "cyclopscore:channel_main", + "version": "1.0.0", + "required": True, + }, + { + "res": "supermartijn642configlib:sync_configs", + "version": "1", + "required": False, + }, + { + "res": "alexsmobs:main_channel", + "version": "1", + "required": False, + }, + { + "res": "sophisticatedcore:channel", + "version": "1", + "required": False, + }, + { + "res": "rftoolsbase:rftoolsbase", + "version": "1.0", + "required": True, + }, + { + "res": "irongenerators:irongenerators", + "version": "1", + "required": False, + }, + { + "res": "xaeroworldmap:main", + "version": "1.0", + "required": True, + }, + { + "res": "cookingforblockheads:network", + "version": "1.0", + "required": False, + }, + {"res": "xnet:xnet", "version": "1.0", "required": True}, + { + "res": "placebo:placebo", + "version": "1.0.0", + "required": True, + }, + { + "res": "citadel:main_channel", + "version": "1", + "required": False, + }, + { + "res": "sophisticatedbackpacks:channel", + "version": "1", + "required": False, + }, + { + "res": "buildinggadgets:main", + "version": "4", + "required": False, + }, + { + "res": "mekanismgenerators:mekanismgenerators", + "version": "10.2.5", + "required": False, + }, + { + "res": "waila:networking", + "version": "1.0.0", + "required": True, + }, + { + "res": "shetiphiancore:main_channel", + "version": "1.0.0", + "required": False, + }, + { + "res": "dummmmmmy:dummychannel", + "version": "1", + "required": False, + }, + { + "res": "supplementaries:network", + "version": "1", + "required": False, + }, + { + "res": "refinedstorage:main_channel", + "version": "1", + "required": False, + }, + {"res": "corpse:default", "version": "1.0.0", "required": True}, + { + "res": "ping:ping_channel", + "version": "PING1", + "required": True, + }, + { + "res": "ironfurnaces:ironfurnaces_network", + "version": "1.0", + "required": True, + }, + {"res": "botania:main", "version": "0", "required": False}, + {"res": "curios:main", "version": "1", "required": False}, + {"res": "patchouli:main", "version": "1", "required": False}, + {"res": "camera:default", "version": "1.0.0", "required": True}, + { + "res": "libnonymous:channel", + "version": "1.0", + "required": True, + }, + { + "res": "elevatorid:main_channel", + "version": "1", + "required": False, + }, + {"res": "worldedit:cui", "version": "1", "required": True}, + {"res": "worldedit:internal", "version": "1", "required": True}, + {"res": "cfm:network", "version": "1", "required": False}, + { + "res": "architectury:network", + "version": "1", + "required": True, + }, + {"res": "trashcans:main", "version": "1", "required": False}, + {"res": "jei:channel", "version": "1.0.0", "required": True}, + {"res": "ae2:main", "version": "1", "required": True}, + { + "res": "mekanism:mekanism", + "version": "10.2.5", + "required": False, + }, + {"res": "bdlib:multiblock", "version": "2", "required": False}, + {"res": "bdlib:misc", "version": "1", "required": False}, + {"res": "create:main", "version": "1", "required": False}, + { + "res": "waystones:network", + "version": "1.0", + "required": False, + }, + {"res": "comforts:main", "version": "1", "required": False}, + { + "res": "naturescompass:naturescompass", + "version": "1.0", + "required": True, + }, + { + "res": "storagenetwork:main_channel", + "version": "1", + "required": False, + }, + {"res": "cofh_core:general", "version": "1", "required": True}, + { + "res": "mcjtylib:mcjtylib", + "version": "1.0", + "required": True, + }, + { + "res": "mininggadgets:main_network_channel", + "version": "2", + "required": False, + }, + { + "res": "crafttweaker:main", + "version": "1.0.0", + "required": False, + }, + {"res": "akashictome:main", "version": "1", "required": False}, + { + "res": "forge:tier_sorting", + "version": "1.0", + "required": False, + }, + {"res": "forge:split", "version": "1.1", "required": True}, + { + "res": "colossalchests:channel_main", + "version": "1.0.0", + "required": True, + }, + {"res": "selene:network", "version": "1", "required": False}, + { + "res": "craftingtweaks:network", + "version": "1.0", + "required": False, + }, + { + "res": "minecraft:unregister", + "version": "FML3", + "required": True, + }, + { + "res": "minecraft:register", + "version": "FML3", + "required": True, + }, + {"res": "titanium:network", "version": "1.0", "required": True}, + { + "res": "easy_villagers:default", + "version": "1.0.0", + "required": True, + }, + {"res": "pipez:default", "version": "1.0.0", "required": True}, + {"res": "mantle:network", "version": "1", "required": False}, + {"res": "quark:main", "version": "1", "required": False}, + { + "res": "xaerominimap:main", + "version": "1.0", + "required": True, + }, + { + "res": "fastbench:channel", + "version": "4.6.0", + "required": True, + }, + {"res": "polymorph:main", "version": "1", "required": False}, + { + "res": "storagedrawers:main_channel", + "version": "1", + "required": False, + }, + { + "res": "enercell:network", + "version": "0.0.0", + "required": False, + }, + {"res": "appleskin:sync", "version": "1", "required": True}, + { + "res": "modularrouters:main_channel", + "version": "2", + "required": False, + }, + { + "res": "the_vault:network", + "version": "0.26.0", + "required": False, + }, + { + "res": "modernui:fluxnetworks", + "version": "707", + "required": False, + }, + ], + "mods": [ + {"modid": "rsrequestify", "modmarker": "2.2.0"}, + {"modid": "cyclopscore", "modmarker": "1.15.1"}, + {"modid": "auudio", "modmarker": "1.0.3"}, + {"modid": "auxiliaryblocks", "modmarker": "1.18.2-0.0.14"}, + {"modid": "supermartijn642configlib", "modmarker": "1.1.6"}, + {"modid": "alexsmobs", "modmarker": "1.18.6"}, + {"modid": "architects_palette", "modmarker": "1.1.2"}, + {"modid": "cagerium", "modmarker": "1.18.2-1.1.0"}, + {"modid": "mcwwindows", "modmarker": "2.0.3"}, + { + "modid": "sophisticatedcore", + "modmarker": "1.18.2-0.5.32.179", + }, + {"modid": "thermal", "modmarker": "1.6.3.28"}, + {"modid": "rftoolsbase", "modmarker": "1.18-3.0.9"}, + {"modid": "initialinventory", "modmarker": "6.0.8"}, + {"modid": "irongenerators", "modmarker": "2.0.1"}, + {"modid": "xaeroworldmap", "modmarker": "1.25.1"}, + {"modid": "cookingforblockheads", "modmarker": "12.0.2"}, + { + "modid": "controlling", + "modmarker": "", + }, + {"modid": "xnet", "modmarker": "1.18-4.0.5"}, + {"modid": "placebo", "modmarker": "6.4.1"}, + {"modid": "citadel", "modmarker": "1.11.3"}, + {"modid": "powah", "modmarker": "3.0.1-beta"}, + {"modid": "bookshelf", "modmarker": "13.2.50"}, + {"modid": "lootbeams", "modmarker": "1.18.1"}, + { + "modid": "sophisticatedbackpacks", + "modmarker": "1.18.2-3.18.35.752", + }, + {"modid": "twigs", "modmarker": "1.1.4-patch1+1.18.2"}, + { + "modid": "buildinggadgets", + "modmarker": "3.13.0-build.5+mc1.18.2}", + }, + {"modid": "darkutils", "modmarker": "10.0.5"}, + {"modid": "mcwdoors", "modmarker": "1.0.6"}, + {"modid": "waddles", "modmarker": "1.18.2-0.8.19"}, + {"modid": "mekanismgenerators", "modmarker": "10.2.5"}, + {"modid": "balm", "modmarker": "3.2.0+0"}, + {"modid": "waila", "modmarker": ""}, + {"modid": "jeresources", "modmarker": "0.14.1.171"}, + { + "modid": "cloth_config", + "modmarker": "", + }, + {"modid": "shetiphiancore", "modmarker": "3.10.10"}, + {"modid": "dummmmmmy", "modmarker": "1.18-1.5.2"}, + {"modid": "supplementaries", "modmarker": "1.18.2-1.5.13"}, + {"modid": "refinedstorage", "modmarker": "1.10.2"}, + {"modid": "konkrete", "modmarker": "1.3.3"}, + {"modid": "easy_piglins", "modmarker": "1.18.2-1.0.0"}, + {"modid": "corpse", "modmarker": "1.18.2-1.0.2"}, + {"modid": "packmenu", "modmarker": ""}, + {"modid": "mcwbridges", "modmarker": "2.0.3"}, + {"modid": "torchmaster", "modmarker": "18.1.0"}, + {"modid": "compressium", "modmarker": "1.4.2-build.9+mc1.18.2"}, + {"modid": "ping", "modmarker": "1.18-1.8.0"}, + {"modid": "ironfurnaces", "modmarker": "3.3.1"}, + {"modid": "mcwtrpdoors", "modmarker": "1.0.6"}, + {"modid": "mcwfences", "modmarker": "1.0.5"}, + {"modid": "supermartijn642corelib", "modmarker": "1.0.19"}, + {"modid": "simplylight", "modmarker": "1.18.2-1.4.2-build.31"}, + {"modid": "botania", "modmarker": "1.18.2-434"}, + {"modid": "highlighter", "modmarker": "ANY"}, + {"modid": "spark", "modmarker": ""}, + {"modid": "curios", "modmarker": "1.18.2-5.0.7.1"}, + {"modid": "patchouli", "modmarker": "1.18.2-71.1"}, + {"modid": "camera", "modmarker": "1.18.2-1.0.4"}, + {"modid": "blockcarpentry", "modmarker": "1.18-0.3.0"}, + {"modid": "thermal_foundation", "modmarker": "1.6.3.28"}, + {"modid": "thermal_expansion", "modmarker": "1.6.3.13"}, + {"modid": "libnonymous", "modmarker": "2.1.0"}, + {"modid": "elevatorid", "modmarker": "1.18.2-1.8.4"}, + {"modid": "runelic", "modmarker": "11.0.1"}, + { + "modid": "worldedit", + "modmarker": "", + }, + {"modid": "cfm", "modmarker": "7.0.0-pre29"}, + {"modid": "architectury", "modmarker": "4.9.84"}, + {"modid": "weirdinggadget", "modmarker": "2.2.11"}, + {"modid": "mcwfurnitures", "modmarker": "3.0.0"}, + {"modid": "trashcans", "modmarker": "1.0.15"}, + {"modid": "mcwlights", "modmarker": "1.0.3"}, + {"modid": "cucumber", "modmarker": "5.1.2"}, + {"modid": "snad", "modmarker": "1.18.2-1.22.04.15a"}, + {"modid": "jei", "modmarker": "9.7.0.209"}, + {"modid": "ae2", "modmarker": "11.1.4"}, + {"modid": "mekanism", "modmarker": "10.2.5"}, + {"modid": "bdlib", "modmarker": "1.19.3.7"}, + {"modid": "create", "modmarker": "0.5.0.d"}, + {"modid": "waystones", "modmarker": "10.1.0"}, + {"modid": "clumps", "modmarker": "8.0.0+10"}, + {"modid": "shutupexperimentalsettings", "modmarker": "1.0.5"}, + {"modid": "comforts", "modmarker": "1.18.2-5.0.0.4"}, + {"modid": "naturescompass", "modmarker": "1.18.2-1.9.7-forge"}, + {"modid": "storagenetwork", "modmarker": "1.18.2-1.6.1"}, + {"modid": "framedcompactdrawers", "modmarker": "1.18-4.1.0"}, + {"modid": "decorative_blocks", "modmarker": "2.1.0"}, + {"modid": "botanypots", "modmarker": "8.0.12"}, + {"modid": "ftbbackups2", "modmarker": "1.0.17"}, + {"modid": "cofh_core", "modmarker": "1.6.4.21"}, + {"modid": "mcjtylib", "modmarker": "1.18-6.0.15"}, + {"modid": "ispawner", "modmarker": "1.0"}, + {"modid": "everycomp", "modmarker": "1.18.2-1.5.7"}, + {"modid": "jeitweaker", "modmarker": "3.0.0.8"}, + {"modid": "terralith", "modmarker": "0.0NONE"}, + {"modid": "mininggadgets", "modmarker": "1.11.0"}, + {"modid": "crafttweaker", "modmarker": "9.1.197"}, + {"modid": "akashictome", "modmarker": "1.5-20"}, + {"modid": "forge", "modmarker": "ANY"}, + {"modid": "colossalchests", "modmarker": "1.8.3"}, + {"modid": "selene", "modmarker": "1.18.2-1.17.9"}, + {"modid": "drippyloadingscreen", "modmarker": "1.6.4"}, + { + "modid": "craftingtweaks", + "modmarker": "", + }, + {"modid": "minecraft", "modmarker": "1.18.2"}, + {"modid": "terrablender", "modmarker": "1.18.2-1.1.0.102"}, + { + "modid": "sophisticatedbackpacksvh", + "modmarker": "1.18.2-1.0.4.12", + }, + {"modid": "mousetweaks", "modmarker": "ANY"}, + {"modid": "titanium", "modmarker": "3.5.6"}, + {"modid": "jade", "modmarker": ""}, + {"modid": "createtweaker", "modmarker": "2.0.0.17"}, + {"modid": "easy_villagers", "modmarker": "1.18.2-1.0.10"}, + {"modid": "pipez", "modmarker": "1.18.2-1.1.5"}, + {"modid": "iceberg", "modmarker": "ANY"}, + {"modid": "flywheel", "modmarker": ""}, + {"modid": "mantle", "modmarker": "1.9.27"}, + {"modid": "ecologics", "modmarker": "1.7.3"}, + {"modid": "quark", "modmarker": "3.2-358"}, + {"modid": "xaerominimap", "modmarker": "22.11.1"}, + {"modid": "pigpen", "modmarker": "8.0.1"}, + {"modid": "fastbench", "modmarker": "6.0.2"}, + {"modid": "polymorph", "modmarker": "1.18.2-0.44"}, + {"modid": "autoreglib", "modmarker": "1.7-53"}, + {"modid": "storagedrawers", "modmarker": "10.2.1"}, + {"modid": "fluxnetworks", "modmarker": "7.0.7.8"}, + {"modid": "neoncraft2", "modmarker": "2.2"}, + {"modid": "enercell", "modmarker": "0.0NONE"}, + {"modid": "appleskin", "modmarker": "2.4.0+mc1.18"}, + { + "modid": "ferritecore", + "modmarker": "", + }, + {"modid": "modularrouters", "modmarker": "9.1.1-93"}, + {"modid": "refinedstorageaddons", "modmarker": "0.8.2"}, + {"modid": "openloader", "modmarker": "12.0.1"}, + {"modid": "the_vault", "modmarker": "1.18.2-2.0.10.869"}, + ], + "truncated": False, + } From ee2a7fe36e6a66041092a8ae87a7de2d33bb6d57 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 14:58:37 -0500 Subject: [PATCH 11/67] Fix test forge data --- tests/test_forge_data.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/test_forge_data.py b/tests/test_forge_data.py index 3ad53dac..b05a050d 100644 --- a/tests/test_forge_data.py +++ b/tests/test_forge_data.py @@ -30,9 +30,9 @@ def test_decode_forge_data() -> None: "truncated": True, } ) - assert forge_data == { - "fml_network_version": 3, - "channels": [ + assert forge_data == ForgeData( + fml_network_version=3, + channels=[ { "res": "cyclopscore:channel_main", "version": "1.0.0", @@ -275,7 +275,7 @@ def test_decode_forge_data() -> None: "required": False, }, ], - "mods": [ + mods=[ {"modid": "rsrequestify", "modmarker": "2.2.0"}, {"modid": "cyclopscore", "modmarker": "1.15.1"}, {"modid": "auudio", "modmarker": "1.0.3"}, @@ -434,5 +434,5 @@ def test_decode_forge_data() -> None: {"modid": "openloader", "modmarker": "12.0.1"}, {"modid": "the_vault", "modmarker": "1.18.2-2.0.10.869"}, ], - "truncated": False, - } + truncated=False, + ) From efce932c3aafbc8d26e8a51aa0d71d5675da98eb Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 15:02:19 -0500 Subject: [PATCH 12/67] Fix for python 3.8 --- mcstatus/forge_data.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 73cd7b85..96ee3989 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -12,7 +12,7 @@ import io from dataclasses import dataclass -from typing import Final, NotRequired, Self, TYPE_CHECKING, TypedDict +from typing import Final from mcstatus.protocol.connection import Connection @@ -22,6 +22,7 @@ if TYPE_CHECKING: + from typing_extensions import NotRequired, Self, TypeAlias, TypedDict class ForgeDataChannel(TypedDict): res: str From b4a552fd76c163f2c0e8a65f468d627ccd68bf62 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 15:04:46 -0500 Subject: [PATCH 13/67] Remove old code comment --- mcstatus/forge_data.py | 1 - 1 file changed, 1 deletion(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 96ee3989..5131bbf7 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -17,7 +17,6 @@ from mcstatus.protocol.connection import Connection VERSION_FLAG_IGNORE_SERVER_ONLY: Final = 0b1 -# IGNORE_SERVER_ONLY: Final = 'OHNOES\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31' # noqa IGNORE_SERVER_ONLY: Final = "" From 95c738a244c5c0ecbd2c845aa8aebfafceaa273f Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 15:06:58 -0500 Subject: [PATCH 14/67] Add missing `TYPE_CHECKING` import --- mcstatus/forge_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 5131bbf7..b2d749d4 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -12,7 +12,7 @@ import io from dataclasses import dataclass -from typing import Final +from typing import Final, TYPE_CHECKING from mcstatus.protocol.connection import Connection From 8fb287ba9a71c29d33a4f0faae0748b4b89ccf4e Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 15:18:06 -0500 Subject: [PATCH 15/67] Fix type issues --- mcstatus/forge_data.py | 1 + mcstatus/status_response.py | 4 ++-- tests/status_response/test_java.py | 21 ++++++++++++--------- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index b2d749d4..cbd5e3f2 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -41,6 +41,7 @@ class RawForgeData(TypedDict): channels: list[ForgeDataChannel] mods: list[ForgeDataMod] d: NotRequired[str] + truncated: NotRequired[bool] else: ForgeDataChannel = dict diff --git a/mcstatus/status_response.py b/mcstatus/status_response.py index ba13c943..1e08dedb 100644 --- a/mcstatus/status_response.py +++ b/mcstatus/status_response.py @@ -45,7 +45,7 @@ class RawJavaResponse(TypedDict): players: RawJavaResponsePlayers version: RawJavaResponseVersion favicon: NotRequired[str] - forge_data: NotRequired[RawForgeData] + forgeData: NotRequired[RawForgeData] else: RawJavaResponsePlayer = dict @@ -141,7 +141,7 @@ def build(cls, raw: RawJavaResponse, latency: float = 0) -> Self: motd=Motd.parse(raw["description"], bedrock=False), icon=raw.get("favicon"), latency=latency, - forge_data=JavaForgeData.build(raw["forgeData"]) if "forgeData" in raw else None, + forge_data=ForgeData.build(raw["forgeData"]) if "forgeData" in raw else None, ) @property diff --git a/tests/status_response/test_java.py b/tests/status_response/test_java.py index 5ec66cd6..797817ba 100644 --- a/tests/status_response/test_java.py +++ b/tests/status_response/test_java.py @@ -1,3 +1,4 @@ +from mcstaus.forge_data import RawForgeData from pytest import fixture from mcstatus.motd import Motd @@ -520,13 +521,15 @@ class TestJavaStatusVersion(BaseStatusResponseTest): @fixture(scope="class") def build(self): return ForgeData.build( - { - "channels": [], - "d": bytes.fromhex( - "e0ba8b0000c484e4a0b0e18e9be19997e2baaee1b399e392bae7a5a6e6908ae4a2b8c5b1e380a3e2b1a1e1a39ee39eb6e78db0e5bb86e19789e0a0b3e18ba3e49aa6e0b18be38686e685a8e5b39ce38695e6abbbe19896e2b78de0b181e1a097e380ae02d098e2aeabe19987e2b7ade0b181e1a097e38caee1b880e59684e4af83e19b86e4b0ade1b99ce398b1e68dafe69b96e490b5e0a5b1e68e83e29985e0b08be1a097e384aed1a8e4b1a0ceabe29997e2b6aee1b298e392bae6b9aae6a1ace0b388e78dbbe199a6e0b3ade1a99bcab1e2b8b1e5b1a2e38398e4ae98e39ba7e6aface1af98e38cb7e69da9cba6c384e4a090e49890e0b2ade5b39ee39eb6e78da2e6888ce492b8e78781e48da2e2b6a1e1a998e2beb7e6a1a3e5b382e196b9e0ada3cc90e48080e1a184e386b9e6a5a8e4aba8e5868de7ae9be19c85e2b68ce1b499e38abae38485e6899ce4a2b8e48081e198b0e2b3ace5b299e3aab4e0b1ade5b1a2e68384e185b1e18b93e29786e0ae8c18e6b48ae6bb86e2979de28db3e79bb6e2b9aee0b281e1a097e38caee28884e3b78ce48e83e39a96e2ba8ee5a39ae3a8b0e691a5e5bb86e19789e0a28be18ba3e49c86e4b28be1a096e394aee6999ce3a388e3a689e78e93e0b1a0e1a19ae39cb7e6b1a5e6888200e280b8e59a87e2b98ce1a19bd0b6e2b8b1e5b1ace3a38ce48691e380a3e4b981e5b499e39eb7e78dace48b84e1978de0a193e18ba3e29c86e0b38be1a097e3a4aee69096e58699e7adbbe39b86e2b18ee5b398c6b2e2b8b1c9a0e48080e78d88e49a96e2b4aee5ac98e39cb4e695b6e6a39ce4a6bde2af8be68da0e49885e0b88bdc81e789a9e5b39ee1969de2adb3e19ca6e6ba8ce5b29bcab9e2b8b2e5b1a0e3a384e18d88e69bb7e2b3ade5ae99e3a4b2e791a1e6939ed78dc688e580a0e2bc81e1a598e39eb9e6bdb7e5a3a4e39691cc8be181a7e49786e0b58ce1a297e6b484e58b82e0b6b9e78688e18c8240e5a385e39eb7e6a5abe4bb9ce3b699e18e93e79b86e6b1ade5a89ae382b2e78da4e6888ce3a388e78681e78ca2e2b780e5b499e39ebbe6adb2e68886e482b8e0a081e382b0e4b7ace1b49be39eb9e6b1ace5b392e0a69de480a0e59ba7e4ba8ce0b182e1a297e2b4b8e5b1a8e3a380e286a9e69e80e0b2ade4839de19c98c4b0e0b884e38780e1ac8be29996e2b7ace0b681e1a897e384aee6808ed6b1e2ac9be798a6e282ade0ae8ce19c98c4b0e0b884e2968ce0aea3e59986e4b68ce0b181e1a297e2b8b1e1a1a6d6b4e78d8be397b6e2b48ce1ae98e38ab7c5ac62e19080e7ae80e19db6e4b48ce0b382e1a097e384aee4919ae58695cc8be28290e6b7ace5ab9be390b9e6b1a5e0bb8ce4b384e185b1e58ba3d886c980e39eb6e791afe4ab84e39685e38e9be68c90d8a5e4ae8ec498e78c96e6839ee296a1e28e9be39a97e0b0ace1a59de384b2e68da1e68396e0b685e1ad9be184a7e29786e0b88ce1a497e38cade6899ce3a3a0e2a699e78ba3e49aa6e4878ce390b1e6b9a1e4ab9cd6b1c688e58080e6ba80e5a99de3a6b3e38493e6899ce582b8c5a9e49897e0b1aee4b19ae1a295e384aee5b1b0e0a388e181b8e19d96e0b68de1a999e38eb7e685a7e4bb88e58695e48e9be68cb1e698a5e0ae8ce19a98e795a2e5a392e3a691e5a6a9e39b92e498ace0b18be19c9ce7b4b2e5a888e29685e0adb3cd80e28080e5a482e3a4b0e795abe58ba8e4b6b1e0a0b3e68c83e49885e0b58bd080e68dade4a3aee3b6bde1ae93e18197d786e0ae8c1be79c87e4a382e38691e1acabe18397e29786e0b88ce1a497e380ade7819ce492b8e18789e584a0e6b2ade1a19ae392b7e6b5b3e4ab8ee196b9e0ae93e79d86e6b98de4869ce1a098e388aee6a99ce39188e5acabe69896e6b4ade5ad9ce38ab3e695aee48ba4e3b791e1ae93e181a7e49886e0b28be1aa9700e49088e38685e3adabe68cb0e49985e4b08be1a095d483e48baee386a5e58c8be59ba0e6ba8ce1af9de396b9e6b9a9e0ab8ee3a384e78681e18c82e68080e5aa82e3a4b2e78da5e6ab9ee0b789e1acabc2a7e29786e0b48ce1a297e384aee689aee38084e68c98e49bb6e6b48ee5a397e39cb7e6a5a6d38ee4b0b8e2ad83e19d86e0b88de5a99ae39cb0e6bda3e4aba4e4b09de0a5b1e68c83d8a5e48c8ce382b6e6b9a9e49abed6a1e78db3e49996e282ade0ae8ce19c9830e18884e59690e6adabe59b96e2b6ade1b99be1a285e384aee5a9b0e3a384e786a9e48ca2e2b281e5ad9de3b2b6e6a1a3e5b382e196b9e0ada3cc90e68180e5b383e3a0bae6b1b0e5ab8ae3a695e0aea3e19ca6e6b2ade48d9ce19c98e3a0b1e6919ce492b4e2a5b1e18ba3e699a6e5ae81e3a8b2e6bdb7e59ba4e49085e18081e283a0e4b2aee1a999e38ab7e78da4e5bba8d789e2acbbe181a6e29786e0b08ce1a497e6b48ce58b82e7b6b9e48c9ae69896e2b78de5ac99e1a28000e59890e3a6bde18d9be49997e2b2aee0b181e1a697e38caee1a080d694e4ae9bd7b7e6b4aee5ac99e39cb4e0b1b3e5b1a2e68384e185b1e18b93d786e0ae8cc498e68c86e6939ee4b781e68cabe68c90d8a5e0ae8ee19a99e2b8b1e5b1a0e1b388e2aca0e199a6e0baace5b49be1a282e380aee6819cd08440e39897e2b5ace1a59be3aab7e0a880e49b9ae0a79de4ae93e79986e6b2acc59ce19c99e2b8b066e580ace18dbbd8b7e2b6ade1b398e38abad9b2e781a2e492b8c5b1e38083e6b1a1e1ad9be3a4b8e78da5e58ba6e39795e0a2b3e48ba3e49786e0ad8ce3aab1e6b1a9e5b388e2b3a4e1ada9e68c96d8a5e0ae8ec499e78084e5b392e2a69de78688cc92e296a7e0ae8ce19c9ce0b0b0e58ba0e1b6b9e1abbbe19a86e4b78ce1a59bcab6e4a590e0ba9cd385e68090e29a90e4b7aee5a69be3a4bae685aee4ab86e1978de78698e68cb2d8a5e1a985e39eb9e699aee693aad6b9e2ac9be79cb6e2b78be5b499e39ebbe6adb2e68886e482b809e582b0e6b1ade1b49de3a0b9e6bda4e6939ee1978de78688e68c82db85e48980e386b6e699b7e5b38ae1968de2ae9be68c90e49885e0b58be0ac80e795b3e4aba0e39789e18c8be19d87e4b58de0b69be1a49ae6bda3e4aba4e296b1e38c93e68c90e49885e4b18b1ce78c8be5ab92e38781e68f8be79a96e0b48ce4959de19c98e3a0b1e6919ce492b4e285b1e28ba3e496a6e5b598e398b4e2b9a4e689a6e1b088e7ac90e19d86e2b78ce1a19ae1a285e384aee5b1b0e39388e1a6a1e48d83e2b6a0e1a998c2b730e19880e296a0e48cbbe19b86e0b3ade5b49ae3a4b2e48483e38a9ce19085ce98e29897e4b5aee48680e3aab1e6a5b2e69b9ee490b9e0a5b1e68e83e29985e0b58be1a097e39caee6899ce39090e4ac8be19ba6d8a0e48280e3a084e791a1e58386e596bde4ada3e182b6e29786e0b88ce1a497e39cade5b1a2e18384e0ada8e69a96e280ad0ccc81e685a3e4ab9ad789e0a1a3e18ba3e49c86e4b28be1a296e380aee6a19ce1809ce38cabe59896e0b68ee4859de19c98e2b8b0c9a0e3a080e68c90e39bb6e6b5ace1a198e3a0b9e6b9a5e693a8e2a7a5e78688cc92d6a7e4ae8ce19c9930e6a0a4e196a1e6ae93e49896e4afade5af99e39cbae685a4e58ba8e3a6bde0a183e68ba3e69786e0ae8ce1b099e18480e583a8e4a695e0adabe79b86e0b2abe5b09ee39cb0e6a5b3e5b39ee490a1e385b1e38ba3e29786e0b38cd681e6a5ace5b384e3a6bde6af8be59bb6e2b9aee0b281e1a297e380aee4988ed6a1e78db3e49996e281ade0ae8cc298e0a882e5a38ae5a695e28c8be29bb7e0b4aee48c99e19c98e3a0b1e6919ce492b4e485b1e48ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606c780e3aab9e695aee58b98e1a68de0a688cba3e29786e4858ce3ae84e789afe4a398e18695e28d8be380b7e2baace4819ac298e6a488e6a39ce4a695e0adb3e19b86e298a0e48280e38681e6b5a6e6b896e482b8c5b1cb93e2b98ee4b299ce9ce695aee6bba8e4a6bde0ad9bcc9040e1a183e386b9e6a5a8e4aba8e5868de18eabe69e97e49a80e0b98be1b097dcb4e4ab9ce5b791e18dbbe19ab7e298a000e3ae87e6a5a5e4a3a4e3a6a5e3acbbe49896e2b3ace1b499e1a483e388aee6899cc384e6a1a8e798b6e2b38ee1b29de392b7e795b4e4aba4e1978de78698e68c82e49885c980e3a4bae78da1e49b90e3a685e38e9be68c90e49885e4b18bc89ae685ade5b392e4908501e58290e6b1ade5ac9de38eb4e791a8e0aba6e3a384e78681ccb2e68480e5b598e3aab1e689ade6938ae59095e0a5b1e28ba306e1b381e382b7e189a4e5b1a2e68384e185b1e18b93e49786e0b28ce1a097e2b8b4e6a9a2e0a684e58098e19996e284ade4ae8ee19c9be2b8b0e681a4e1b3a4e48c98e69896e2b78de5ac99e1a282e380aee6819ce0a084e0a098e29996e28386e0b18ce1a297e390aee5a888e29685e0adb3e18c9040e5ad82e396b2e6b9a1e69b92e1a6b5c688e28ba3e29786e4888de38ab6e685abe58b9ce3978de0a0b3e68c83e49985e0b58bc880e68885e5a388e0a6a5e0a183e18ba3e49ca6e0b38be1ae97e6b48ae5a3aae29791e68c93e39bb6e2b5ace0b280c880e6a5ade49ba6e49085e18081e381a0e2b98ce1a199e38abae38087e6a99ce482b8e285b1e58186e2b0ade5ae9ae1a280c880e6b892e69685e28e9be69bb7e6b2ade4869ce1a098e384aee6819ce3a09ce28cabe79db7e6b98de4839ae19c9830e0b080e3868ce6aeabe39c86c48ee0ae8ee19c98e2acb0e681a2e6a080e48e98e49d96e0baaee1a59ce3a0bce789a5e5ab92e3a695e0aea3e39b86e0b2aee5b49de39cb4e78da7e6888ae482b8e2a5b123e6b1a1e1ad9be39eb3e791b2e1b3a6e3a384e48689e28ba3e296a6e0ae8de19c98e2b8b0e0a1a8d6b4e78d8be18096e48086ce80e382b7e795b4e4aba4e0b78de6adbbe19c86e6b9ace4929ce19c98e3a0b1e6919ce492b4e4a5b1e78ba3e496a6e1af99e38eb9e0b9a5e48b9ce59791e2ae93e39cb6e2b7ace5b09be3a6b0cdb3e5b1a2d380e78090e49cb0e4b7aee5a19ce38ab3e695aee6bba8e4a6bde68d9be68c90d8a5e0ae8ee19a99e2b8b1e5b1ace38384e0ada8e69a96e6afade5a898e39cb0e695aecb98c384e28080e299a1e2b0aee1a59be386b2e6b5afe48ba0e5868de18ca3e79897e4b2aee1b39ce1a285e384aee5a9b0e3a390e78689cc82c8a0e5a599e39eb1e685b2e58ba8e19799e18bbbe79b86e6b1ade5b39ae1a482e384aee6819ce2a080e7ac90e19d86e2b78ce5b09ee3a8b7d9b3e5b1b0e3a380e18689e38083e0b381e1a29de382b1e6ada3e683aae4a78de0a0b1cba3e29786e0b78cd281e6bda3e5838ce0b5bde18dbbd997e498a1e0b68be1a897e388aee0b9a2e1969ce2adb3e19ca6e2b68ce4b180c480e6b488e59386e69791e4ada3e398a6e498a1e0b18be19a9ce2b8b6e5b1a0e59384e6a181e298b6e2ba8de5ac9ee384b4e38483e6819c04e4a180dcb6e6b0aee5ae9de3a4b2e38483e6819ce29080e38ca8e29997e6bcaee5af98e3a0b6e3848ce6899ce3a3a0e6a691e68c92e49aa5e0b78bd480e695aae6a392e1979de5ac8be29996e683aee0ae8ce19c98e2b8b070e580a4e18cabe19ca7e2b68ce1b49aceb4e2b8b0e1b1a0e3a4bde188aae58390e4b4ade1a99be38eb7e685a7e4bb88e58695e38e9be68c90e298a5e0ae8ce0a898e685ade5b392e3a5bde28cabe79db7e6b98de59f9ae390b1e6b9a1e4ab9cd6b1c690e480a0e4b1a1e1a19ce3a8b3e79db4e48b8ae196ade3ae93e68e90e498a5e4b18be1ae9ce6b484e58b82e196b9e78688e68c82d885e48280e38285e685abe583a6e0b6a5e7aea3e59b96e2838ce4ae8ce19a9ae380b2e5a888e29685e0adb3cc90e28280e5a681e3a4b7e695a7c886e694b9e281a2e59a97e6b98ce5b397e3a4b7e6a5b4e4bb9ce4908dc5b1e58083e0b9a0e5ac9ce3a8b4e38483e6899ce0a084e1a1b0e49bb6e6b7ade5b39ce398b0e6a1a3e69b8ae4b791e0a0abcba3e69787e48c8ce390b1e6b9a1e4ab9ce7b6b1e0adaae69a96e282ade0ae8ce19c98c4b0e0b084e1978ce2ada3e59ba6e286ace4ae8ce1b098e388aee6899ae492b8e786b9e78e92e2b780e5b499e39ebbe6adb2e6888200e28298e19ca6e0b88de1b99ce39eb6e691a1e5b392e4b69de18c9be59997e2b78ce0b181e1ac97e390aee1b086e4a68ce38c8be19d86e6b78de5b499e38abbe6ada1e0bba6e196b8e3aea3e29bb7e6b5aee0b180e1a097d080e5a892e3a6a5e1acabe19ca6e0b38ce4869de19c98e3a0b1e6919ce590a8e18db3e79997e6b4ace5b49ce3a4b2e49884e1a29ad38de18180e79997e6b4ace5b49ce3a4b2e49884e1a29ad38de68080e59d80e4b98ce1a19ce398b1e6b9a5e4ab88e48789e78688cc92e49787e4ad8ce19c98e2b8b1e5b1a0e48384c691e38680e0b7aee5a89ce3a6b4e6a5b4e48b86e19791e18ca3e39896e0b5ace5a19ce396b1e799b3e1bb90e3a384e48689e28ba3e296a6e0ae8ce19c98e2b8b4e691a2e2b080e7ada8e39d96e0b2aee5b79de382b2e78dabc886e694b9e48092e19d80e2ba8de5ae98e3aab4d5ade5b1a6e3a394e3a6b1e59ba0e6ba8ce1af9de396b9e38483e6819cd084e580a0e49896e0b2ace48d80e3a4b1e685a5e4aba8e5b791e0acabe59ab6e0b98ce0b282e1a097e380aee6899ce0a39ce2a1b0e39896e6bcaee5b697e398b4e685ace4ab8ee4b789e0a1abe18ba3e49c86e4b28be1a296e380aee6899ce1b380e2aca0e199a6e0baace5b49be1a282e380aee6819ce0a08428da97e4b2aee48c9ee19c98e3a0b1e6919ce492b4e0a5b1e58ba3c3a6e1a599e382b3e6b1b5e0aba8e3a384e78681e18c82e68080e5a981e38ab1e695a2e4bba4d08de4a9b215e0b381e5b99be390bbe695a5d398e39098e78c8be49d86e4b2ade0b181e1b297e388aee0b9aee196b8e3aea3e29bb7e2b5aee0b18000e69489e5bb86e3b6b1e4acbbe398b6e282aee4ae8ce19c9bc8b3e6888ad795e5ae93e381b6e49786e4ad8ce1aa99d0b8e48b9ae3a6a5e0a08be28083c680e5a19ee3a4b2e6b5afe5b392e396a5cc8be281b7e49986e4b18be19c98d0b1e48b9ae3a6a5e0a09bcba326c680e392b8e781a7e5b38ae68095c5b1e18ba3e28186e5a682e3a6b0e689b4e5b38ae2868de380abcba3e49786e4878ce390b1e6b9a1e4ab9ce196b1e786a0e68da2e29885e48280e3a084e6b1afe5abb2e4a6bde48e83e182b6e29786e0b88ce1a497e380ade6a19ce18390e0ada8e69a96e280ad0cd480e795a1e5bba8e19789e68cbbe29a96e2838ce4ae8ce19a9be38cb5e1b084e5878ce18dbbe79897e0b2ace5b299e3aeb0e789a5e0b3a6e48384e185b1e18ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606cc80e398b3e7a1b5e4ab9ce5b791e18dbbe39ab7e683aee0ae8de19c98e2b8b770e3a0a8e7acabe39ba6e2b98ce1a698e1a4bae38883e6919ce28088e78ca8e29996e2b1aee1ac99ceb6e2b8b0e1b1a0e3a4bde3a8aae59ba0e6ba8ce1af9de396b9e38085e6819ce482b8e18081e18290e0b88ce5ac9ce3a6b2e6a5abe1a39ce3a388e786a1e38c82e6b6a5e0b198e1a297d0b8e78ba6e0b6b9e0a08be18093e485a0e1a599e3a4b9e791a9e49b8ae4a6bde18cabe583a0e0b7ade1b599e382b6e789b2e6ab9ee19791e1ae93e18287e29787e4ae8ce19a98e38cb9e5a898e29685e7adb3d8b5e4b0ade5ae9be398b2e3888100e4a190e38cabe69a96e0b2ade1b399e39ebae685b2e4ab8ee18685e7aca3e39ba6c2aee0ae8ce19c9c32e5b894e19781e68db3e19bb6e2b28ce1b299e1a283e2b8b2e5b1a0e0a384e28188e59a87e4aface5a19de398bae185b4e5b1a2e68384e185b1e28b93d786e4ae8ce1a098e3a0aee789ace3a09ce28cabe79db7e6b98dc69ae19c98e398b2e6819cd080e6a2a8e49bb6e4b2ace5ae9ce392bae698bae6ab98e3a7a1e28cabe79db7e6b98de5b39ae1ae81e39cb000" - ).decode("utf-8"), - "fmlNetworkVersion": 3, - "mods": [], - "truncated": True, - } + RawForgeData( + { + "channels": [], + "d": bytes.fromhex( + "e0ba8b0000c484e4a0b0e18e9be19997e2baaee1b399e392bae7a5a6e6908ae4a2b8c5b1e380a3e2b1a1e1a39ee39eb6e78db0e5bb86e19789e0a0b3e18ba3e49aa6e0b18be38686e685a8e5b39ce38695e6abbbe19896e2b78de0b181e1a097e380ae02d098e2aeabe19987e2b7ade0b181e1a097e38caee1b880e59684e4af83e19b86e4b0ade1b99ce398b1e68dafe69b96e490b5e0a5b1e68e83e29985e0b08be1a097e384aed1a8e4b1a0ceabe29997e2b6aee1b298e392bae6b9aae6a1ace0b388e78dbbe199a6e0b3ade1a99bcab1e2b8b1e5b1a2e38398e4ae98e39ba7e6aface1af98e38cb7e69da9cba6c384e4a090e49890e0b2ade5b39ee39eb6e78da2e6888ce492b8e78781e48da2e2b6a1e1a998e2beb7e6a1a3e5b382e196b9e0ada3cc90e48080e1a184e386b9e6a5a8e4aba8e5868de7ae9be19c85e2b68ce1b499e38abae38485e6899ce4a2b8e48081e198b0e2b3ace5b299e3aab4e0b1ade5b1a2e68384e185b1e18b93e29786e0ae8c18e6b48ae6bb86e2979de28db3e79bb6e2b9aee0b281e1a097e38caee28884e3b78ce48e83e39a96e2ba8ee5a39ae3a8b0e691a5e5bb86e19789e0a28be18ba3e49c86e4b28be1a096e394aee6999ce3a388e3a689e78e93e0b1a0e1a19ae39cb7e6b1a5e6888200e280b8e59a87e2b98ce1a19bd0b6e2b8b1e5b1ace3a38ce48691e380a3e4b981e5b499e39eb7e78dace48b84e1978de0a193e18ba3e29c86e0b38be1a097e3a4aee69096e58699e7adbbe39b86e2b18ee5b398c6b2e2b8b1c9a0e48080e78d88e49a96e2b4aee5ac98e39cb4e695b6e6a39ce4a6bde2af8be68da0e49885e0b88bdc81e789a9e5b39ee1969de2adb3e19ca6e6ba8ce5b29bcab9e2b8b2e5b1a0e3a384e18d88e69bb7e2b3ade5ae99e3a4b2e791a1e6939ed78dc688e580a0e2bc81e1a598e39eb9e6bdb7e5a3a4e39691cc8be181a7e49786e0b58ce1a297e6b484e58b82e0b6b9e78688e18c8240e5a385e39eb7e6a5abe4bb9ce3b699e18e93e79b86e6b1ade5a89ae382b2e78da4e6888ce3a388e78681e78ca2e2b780e5b499e39ebbe6adb2e68886e482b8e0a081e382b0e4b7ace1b49be39eb9e6b1ace5b392e0a69de480a0e59ba7e4ba8ce0b182e1a297e2b4b8e5b1a8e3a380e286a9e69e80e0b2ade4839de19c98c4b0e0b884e38780e1ac8be29996e2b7ace0b681e1a897e384aee6808ed6b1e2ac9be798a6e282ade0ae8ce19c98c4b0e0b884e2968ce0aea3e59986e4b68ce0b181e1a297e2b8b1e1a1a6d6b4e78d8be397b6e2b48ce1ae98e38ab7c5ac62e19080e7ae80e19db6e4b48ce0b382e1a097e384aee4919ae58695cc8be28290e6b7ace5ab9be390b9e6b1a5e0bb8ce4b384e185b1e58ba3d886c980e39eb6e791afe4ab84e39685e38e9be68c90d8a5e4ae8ec498e78c96e6839ee296a1e28e9be39a97e0b0ace1a59de384b2e68da1e68396e0b685e1ad9be184a7e29786e0b88ce1a497e38cade6899ce3a3a0e2a699e78ba3e49aa6e4878ce390b1e6b9a1e4ab9cd6b1c688e58080e6ba80e5a99de3a6b3e38493e6899ce582b8c5a9e49897e0b1aee4b19ae1a295e384aee5b1b0e0a388e181b8e19d96e0b68de1a999e38eb7e685a7e4bb88e58695e48e9be68cb1e698a5e0ae8ce19a98e795a2e5a392e3a691e5a6a9e39b92e498ace0b18be19c9ce7b4b2e5a888e29685e0adb3cd80e28080e5a482e3a4b0e795abe58ba8e4b6b1e0a0b3e68c83e49885e0b58bd080e68dade4a3aee3b6bde1ae93e18197d786e0ae8c1be79c87e4a382e38691e1acabe18397e29786e0b88ce1a497e380ade7819ce492b8e18789e584a0e6b2ade1a19ae392b7e6b5b3e4ab8ee196b9e0ae93e79d86e6b98de4869ce1a098e388aee6a99ce39188e5acabe69896e6b4ade5ad9ce38ab3e695aee48ba4e3b791e1ae93e181a7e49886e0b28be1aa9700e49088e38685e3adabe68cb0e49985e4b08be1a095d483e48baee386a5e58c8be59ba0e6ba8ce1af9de396b9e6b9a9e0ab8ee3a384e78681e18c82e68080e5aa82e3a4b2e78da5e6ab9ee0b789e1acabc2a7e29786e0b48ce1a297e384aee689aee38084e68c98e49bb6e6b48ee5a397e39cb7e6a5a6d38ee4b0b8e2ad83e19d86e0b88de5a99ae39cb0e6bda3e4aba4e4b09de0a5b1e68c83d8a5e48c8ce382b6e6b9a9e49abed6a1e78db3e49996e282ade0ae8ce19c9830e18884e59690e6adabe59b96e2b6ade1b99be1a285e384aee5a9b0e3a384e786a9e48ca2e2b281e5ad9de3b2b6e6a1a3e5b382e196b9e0ada3cc90e68180e5b383e3a0bae6b1b0e5ab8ae3a695e0aea3e19ca6e6b2ade48d9ce19c98e3a0b1e6919ce492b4e2a5b1e18ba3e699a6e5ae81e3a8b2e6bdb7e59ba4e49085e18081e283a0e4b2aee1a999e38ab7e78da4e5bba8d789e2acbbe181a6e29786e0b08ce1a497e6b48ce58b82e7b6b9e48c9ae69896e2b78de5ac99e1a28000e59890e3a6bde18d9be49997e2b2aee0b181e1a697e38caee1a080d694e4ae9bd7b7e6b4aee5ac99e39cb4e0b1b3e5b1a2e68384e185b1e18b93d786e0ae8cc498e68c86e6939ee4b781e68cabe68c90d8a5e0ae8ee19a99e2b8b1e5b1a0e1b388e2aca0e199a6e0baace5b49be1a282e380aee6819cd08440e39897e2b5ace1a59be3aab7e0a880e49b9ae0a79de4ae93e79986e6b2acc59ce19c99e2b8b066e580ace18dbbd8b7e2b6ade1b398e38abad9b2e781a2e492b8c5b1e38083e6b1a1e1ad9be3a4b8e78da5e58ba6e39795e0a2b3e48ba3e49786e0ad8ce3aab1e6b1a9e5b388e2b3a4e1ada9e68c96d8a5e0ae8ec499e78084e5b392e2a69de78688cc92e296a7e0ae8ce19c9ce0b0b0e58ba0e1b6b9e1abbbe19a86e4b78ce1a59bcab6e4a590e0ba9cd385e68090e29a90e4b7aee5a69be3a4bae685aee4ab86e1978de78698e68cb2d8a5e1a985e39eb9e699aee693aad6b9e2ac9be79cb6e2b78be5b499e39ebbe6adb2e68886e482b809e582b0e6b1ade1b49de3a0b9e6bda4e6939ee1978de78688e68c82db85e48980e386b6e699b7e5b38ae1968de2ae9be68c90e49885e0b58be0ac80e795b3e4aba0e39789e18c8be19d87e4b58de0b69be1a49ae6bda3e4aba4e296b1e38c93e68c90e49885e4b18b1ce78c8be5ab92e38781e68f8be79a96e0b48ce4959de19c98e3a0b1e6919ce492b4e285b1e28ba3e496a6e5b598e398b4e2b9a4e689a6e1b088e7ac90e19d86e2b78ce1a19ae1a285e384aee5b1b0e39388e1a6a1e48d83e2b6a0e1a998c2b730e19880e296a0e48cbbe19b86e0b3ade5b49ae3a4b2e48483e38a9ce19085ce98e29897e4b5aee48680e3aab1e6a5b2e69b9ee490b9e0a5b1e68e83e29985e0b58be1a097e39caee6899ce39090e4ac8be19ba6d8a0e48280e3a084e791a1e58386e596bde4ada3e182b6e29786e0b88ce1a497e39cade5b1a2e18384e0ada8e69a96e280ad0ccc81e685a3e4ab9ad789e0a1a3e18ba3e49c86e4b28be1a296e380aee6a19ce1809ce38cabe59896e0b68ee4859de19c98e2b8b0c9a0e3a080e68c90e39bb6e6b5ace1a198e3a0b9e6b9a5e693a8e2a7a5e78688cc92d6a7e4ae8ce19c9930e6a0a4e196a1e6ae93e49896e4afade5af99e39cbae685a4e58ba8e3a6bde0a183e68ba3e69786e0ae8ce1b099e18480e583a8e4a695e0adabe79b86e0b2abe5b09ee39cb0e6a5b3e5b39ee490a1e385b1e38ba3e29786e0b38cd681e6a5ace5b384e3a6bde6af8be59bb6e2b9aee0b281e1a297e380aee4988ed6a1e78db3e49996e281ade0ae8cc298e0a882e5a38ae5a695e28c8be29bb7e0b4aee48c99e19c98e3a0b1e6919ce492b4e485b1e48ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606c780e3aab9e695aee58b98e1a68de0a688cba3e29786e4858ce3ae84e789afe4a398e18695e28d8be380b7e2baace4819ac298e6a488e6a39ce4a695e0adb3e19b86e298a0e48280e38681e6b5a6e6b896e482b8c5b1cb93e2b98ee4b299ce9ce695aee6bba8e4a6bde0ad9bcc9040e1a183e386b9e6a5a8e4aba8e5868de18eabe69e97e49a80e0b98be1b097dcb4e4ab9ce5b791e18dbbe19ab7e298a000e3ae87e6a5a5e4a3a4e3a6a5e3acbbe49896e2b3ace1b499e1a483e388aee6899cc384e6a1a8e798b6e2b38ee1b29de392b7e795b4e4aba4e1978de78698e68c82e49885c980e3a4bae78da1e49b90e3a685e38e9be68c90e49885e4b18bc89ae685ade5b392e4908501e58290e6b1ade5ac9de38eb4e791a8e0aba6e3a384e78681ccb2e68480e5b598e3aab1e689ade6938ae59095e0a5b1e28ba306e1b381e382b7e189a4e5b1a2e68384e185b1e18b93e49786e0b28ce1a097e2b8b4e6a9a2e0a684e58098e19996e284ade4ae8ee19c9be2b8b0e681a4e1b3a4e48c98e69896e2b78de5ac99e1a282e380aee6819ce0a084e0a098e29996e28386e0b18ce1a297e390aee5a888e29685e0adb3e18c9040e5ad82e396b2e6b9a1e69b92e1a6b5c688e28ba3e29786e4888de38ab6e685abe58b9ce3978de0a0b3e68c83e49985e0b58bc880e68885e5a388e0a6a5e0a183e18ba3e49ca6e0b38be1ae97e6b48ae5a3aae29791e68c93e39bb6e2b5ace0b280c880e6a5ade49ba6e49085e18081e381a0e2b98ce1a199e38abae38087e6a99ce482b8e285b1e58186e2b0ade5ae9ae1a280c880e6b892e69685e28e9be69bb7e6b2ade4869ce1a098e384aee6819ce3a09ce28cabe79db7e6b98de4839ae19c9830e0b080e3868ce6aeabe39c86c48ee0ae8ee19c98e2acb0e681a2e6a080e48e98e49d96e0baaee1a59ce3a0bce789a5e5ab92e3a695e0aea3e39b86e0b2aee5b49de39cb4e78da7e6888ae482b8e2a5b123e6b1a1e1ad9be39eb3e791b2e1b3a6e3a384e48689e28ba3e296a6e0ae8de19c98e2b8b0e0a1a8d6b4e78d8be18096e48086ce80e382b7e795b4e4aba4e0b78de6adbbe19c86e6b9ace4929ce19c98e3a0b1e6919ce492b4e4a5b1e78ba3e496a6e1af99e38eb9e0b9a5e48b9ce59791e2ae93e39cb6e2b7ace5b09be3a6b0cdb3e5b1a2d380e78090e49cb0e4b7aee5a19ce38ab3e695aee6bba8e4a6bde68d9be68c90d8a5e0ae8ee19a99e2b8b1e5b1ace38384e0ada8e69a96e6afade5a898e39cb0e695aecb98c384e28080e299a1e2b0aee1a59be386b2e6b5afe48ba0e5868de18ca3e79897e4b2aee1b39ce1a285e384aee5a9b0e3a390e78689cc82c8a0e5a599e39eb1e685b2e58ba8e19799e18bbbe79b86e6b1ade5b39ae1a482e384aee6819ce2a080e7ac90e19d86e2b78ce5b09ee3a8b7d9b3e5b1b0e3a380e18689e38083e0b381e1a29de382b1e6ada3e683aae4a78de0a0b1cba3e29786e0b78cd281e6bda3e5838ce0b5bde18dbbd997e498a1e0b68be1a897e388aee0b9a2e1969ce2adb3e19ca6e2b68ce4b180c480e6b488e59386e69791e4ada3e398a6e498a1e0b18be19a9ce2b8b6e5b1a0e59384e6a181e298b6e2ba8de5ac9ee384b4e38483e6819c04e4a180dcb6e6b0aee5ae9de3a4b2e38483e6819ce29080e38ca8e29997e6bcaee5af98e3a0b6e3848ce6899ce3a3a0e6a691e68c92e49aa5e0b78bd480e695aae6a392e1979de5ac8be29996e683aee0ae8ce19c98e2b8b070e580a4e18cabe19ca7e2b68ce1b49aceb4e2b8b0e1b1a0e3a4bde188aae58390e4b4ade1a99be38eb7e685a7e4bb88e58695e38e9be68c90e298a5e0ae8ce0a898e685ade5b392e3a5bde28cabe79db7e6b98de59f9ae390b1e6b9a1e4ab9cd6b1c690e480a0e4b1a1e1a19ce3a8b3e79db4e48b8ae196ade3ae93e68e90e498a5e4b18be1ae9ce6b484e58b82e196b9e78688e68c82d885e48280e38285e685abe583a6e0b6a5e7aea3e59b96e2838ce4ae8ce19a9ae380b2e5a888e29685e0adb3cc90e28280e5a681e3a4b7e695a7c886e694b9e281a2e59a97e6b98ce5b397e3a4b7e6a5b4e4bb9ce4908dc5b1e58083e0b9a0e5ac9ce3a8b4e38483e6899ce0a084e1a1b0e49bb6e6b7ade5b39ce398b0e6a1a3e69b8ae4b791e0a0abcba3e69787e48c8ce390b1e6b9a1e4ab9ce7b6b1e0adaae69a96e282ade0ae8ce19c98c4b0e0b084e1978ce2ada3e59ba6e286ace4ae8ce1b098e388aee6899ae492b8e786b9e78e92e2b780e5b499e39ebbe6adb2e6888200e28298e19ca6e0b88de1b99ce39eb6e691a1e5b392e4b69de18c9be59997e2b78ce0b181e1ac97e390aee1b086e4a68ce38c8be19d86e6b78de5b499e38abbe6ada1e0bba6e196b8e3aea3e29bb7e6b5aee0b180e1a097d080e5a892e3a6a5e1acabe19ca6e0b38ce4869de19c98e3a0b1e6919ce590a8e18db3e79997e6b4ace5b49ce3a4b2e49884e1a29ad38de18180e79997e6b4ace5b49ce3a4b2e49884e1a29ad38de68080e59d80e4b98ce1a19ce398b1e6b9a5e4ab88e48789e78688cc92e49787e4ad8ce19c98e2b8b1e5b1a0e48384c691e38680e0b7aee5a89ce3a6b4e6a5b4e48b86e19791e18ca3e39896e0b5ace5a19ce396b1e799b3e1bb90e3a384e48689e28ba3e296a6e0ae8ce19c98e2b8b4e691a2e2b080e7ada8e39d96e0b2aee5b79de382b2e78dabc886e694b9e48092e19d80e2ba8de5ae98e3aab4d5ade5b1a6e3a394e3a6b1e59ba0e6ba8ce1af9de396b9e38483e6819cd084e580a0e49896e0b2ace48d80e3a4b1e685a5e4aba8e5b791e0acabe59ab6e0b98ce0b282e1a097e380aee6899ce0a39ce2a1b0e39896e6bcaee5b697e398b4e685ace4ab8ee4b789e0a1abe18ba3e49c86e4b28be1a296e380aee6899ce1b380e2aca0e199a6e0baace5b49be1a282e380aee6819ce0a08428da97e4b2aee48c9ee19c98e3a0b1e6919ce492b4e0a5b1e58ba3c3a6e1a599e382b3e6b1b5e0aba8e3a384e78681e18c82e68080e5a981e38ab1e695a2e4bba4d08de4a9b215e0b381e5b99be390bbe695a5d398e39098e78c8be49d86e4b2ade0b181e1b297e388aee0b9aee196b8e3aea3e29bb7e2b5aee0b18000e69489e5bb86e3b6b1e4acbbe398b6e282aee4ae8ce19c9bc8b3e6888ad795e5ae93e381b6e49786e4ad8ce1aa99d0b8e48b9ae3a6a5e0a08be28083c680e5a19ee3a4b2e6b5afe5b392e396a5cc8be281b7e49986e4b18be19c98d0b1e48b9ae3a6a5e0a09bcba326c680e392b8e781a7e5b38ae68095c5b1e18ba3e28186e5a682e3a6b0e689b4e5b38ae2868de380abcba3e49786e4878ce390b1e6b9a1e4ab9ce196b1e786a0e68da2e29885e48280e3a084e6b1afe5abb2e4a6bde48e83e182b6e29786e0b88ce1a497e380ade6a19ce18390e0ada8e69a96e280ad0cd480e795a1e5bba8e19789e68cbbe29a96e2838ce4ae8ce19a9be38cb5e1b084e5878ce18dbbe79897e0b2ace5b299e3aeb0e789a5e0b3a6e48384e185b1e18ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606cc80e398b3e7a1b5e4ab9ce5b791e18dbbe39ab7e683aee0ae8de19c98e2b8b770e3a0a8e7acabe39ba6e2b98ce1a698e1a4bae38883e6919ce28088e78ca8e29996e2b1aee1ac99ceb6e2b8b0e1b1a0e3a4bde3a8aae59ba0e6ba8ce1af9de396b9e38085e6819ce482b8e18081e18290e0b88ce5ac9ce3a6b2e6a5abe1a39ce3a388e786a1e38c82e6b6a5e0b198e1a297d0b8e78ba6e0b6b9e0a08be18093e485a0e1a599e3a4b9e791a9e49b8ae4a6bde18cabe583a0e0b7ade1b599e382b6e789b2e6ab9ee19791e1ae93e18287e29787e4ae8ce19a98e38cb9e5a898e29685e7adb3d8b5e4b0ade5ae9be398b2e3888100e4a190e38cabe69a96e0b2ade1b399e39ebae685b2e4ab8ee18685e7aca3e39ba6c2aee0ae8ce19c9c32e5b894e19781e68db3e19bb6e2b28ce1b299e1a283e2b8b2e5b1a0e0a384e28188e59a87e4aface5a19de398bae185b4e5b1a2e68384e185b1e28b93d786e4ae8ce1a098e3a0aee789ace3a09ce28cabe79db7e6b98dc69ae19c98e398b2e6819cd080e6a2a8e49bb6e4b2ace5ae9ce392bae698bae6ab98e3a7a1e28cabe79db7e6b98de5b39ae1ae81e39cb000" + ).decode("utf-8"), + "fmlNetworkVersion": 3, + "mods": [], + "truncated": True, + } + ) ) From 1cbccc47af58523db1966306aab21be55c5fae55 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 15:22:38 -0500 Subject: [PATCH 16/67] More type fixes --- tests/status_response/test_java.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/status_response/test_java.py b/tests/status_response/test_java.py index 797817ba..3e7fbac7 100644 --- a/tests/status_response/test_java.py +++ b/tests/status_response/test_java.py @@ -1,6 +1,6 @@ -from mcstaus.forge_data import RawForgeData from pytest import fixture +from mcstatus.forge_data import RawForgeData from mcstatus.motd import Motd from mcstatus.status_response import ForgeData, JavaStatusPlayer, JavaStatusPlayers, JavaStatusResponse, JavaStatusVersion from tests.status_response import BaseStatusResponseTest @@ -104,7 +104,7 @@ def build(self): @BaseStatusResponseTest.construct -class TestJavaStatusVersion(BaseStatusResponseTest): +class TestForgeData(BaseStatusResponseTest): EXPECTED_VALUES = [ ("fml_network_version", 3), ( From bd4a34ecef1c5e806c2d9b0e1c8fe677dae8bf8d Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 15:28:28 -0500 Subject: [PATCH 17/67] Flake8 fixes --- mcstatus/forge_data.py | 2 +- mcstatus/status_response.py | 7 ++----- tests/test_forge_data.py | 2 -- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index cbd5e3f2..4876a584 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -21,7 +21,7 @@ if TYPE_CHECKING: - from typing_extensions import NotRequired, Self, TypeAlias, TypedDict + from typing_extensions import NotRequired, Self, TypedDict class ForgeDataChannel(TypedDict): res: str diff --git a/mcstatus/status_response.py b/mcstatus/status_response.py index 1e08dedb..37fe954c 100644 --- a/mcstatus/status_response.py +++ b/mcstatus/status_response.py @@ -4,10 +4,7 @@ from dataclasses import dataclass from typing import Any, TYPE_CHECKING -from mcstatus.forge_data import ForgeData as ForgeData -from mcstatus.forge_data import ForgeDataChannel as ForgeDataChannel -from mcstatus.forge_data import ForgeDataMod as ForgeDataMod -from mcstatus.forge_data import RawForgeData +from mcstatus.forge_data import ForgeData, RawForgeData from mcstatus.motd import Motd if TYPE_CHECKING: @@ -45,7 +42,7 @@ class RawJavaResponse(TypedDict): players: RawJavaResponsePlayers version: RawJavaResponseVersion favicon: NotRequired[str] - forgeData: NotRequired[RawForgeData] + forgeData: NotRequired[RawForgeData] # noqa: N815 else: RawJavaResponsePlayer = dict diff --git a/tests/test_forge_data.py b/tests/test_forge_data.py index b05a050d..1467c844 100644 --- a/tests/test_forge_data.py +++ b/tests/test_forge_data.py @@ -1,5 +1,3 @@ -import pytest - from mcstatus.forge_data import ForgeData, decode_forge_data, decode_optimized ENCODED_STRING = bytes.fromhex( From b7e9020e6c40ecbcdbdf43327b2ff9107f87a011 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 15:55:56 -0500 Subject: [PATCH 18/67] Attempt to fix line too long warnings --- mcstatus/forge_data.py | 5 +- tests/status_response/test_java.py | 119 ++++++++++++++++++++- tests/test_forge_data.py | 161 ++++++++++++++++++++++++++++- 3 files changed, 279 insertions(+), 6 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 4876a584..ccab2bc7 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -6,7 +6,8 @@ and a list of mods the server has. For more information see this file from forge itself: -https://github.com/MinecraftForge/MinecraftForge/blob/42115d37d6a46856e3dc914b54a1ce6d33b9872a/src/main/java/net/minecraftforge/network/ServerStatusPing.java""" +https://github.com/MinecraftForge/MinecraftForge/blob/42115d37d6a46856e3dc914b54a1ce6d33b9872a/src/main/java/net/minecraftforge/network/ServerStatusPing.java +""" from __future__ import annotations @@ -37,7 +38,7 @@ class ForgeDataMod(TypedDict): """Mod version""" class RawForgeData(TypedDict): - fmlNetworkVersion: int + fmlNetworkVersion: int # noqa: N815 channels: list[ForgeDataChannel] mods: list[ForgeDataMod] d: NotRequired[str] diff --git a/tests/status_response/test_java.py b/tests/status_response/test_java.py index 3e7fbac7..39d37f14 100644 --- a/tests/status_response/test_java.py +++ b/tests/status_response/test_java.py @@ -524,8 +524,123 @@ def build(self): RawForgeData( { "channels": [], - "d": bytes.fromhex( - "e0ba8b0000c484e4a0b0e18e9be19997e2baaee1b399e392bae7a5a6e6908ae4a2b8c5b1e380a3e2b1a1e1a39ee39eb6e78db0e5bb86e19789e0a0b3e18ba3e49aa6e0b18be38686e685a8e5b39ce38695e6abbbe19896e2b78de0b181e1a097e380ae02d098e2aeabe19987e2b7ade0b181e1a097e38caee1b880e59684e4af83e19b86e4b0ade1b99ce398b1e68dafe69b96e490b5e0a5b1e68e83e29985e0b08be1a097e384aed1a8e4b1a0ceabe29997e2b6aee1b298e392bae6b9aae6a1ace0b388e78dbbe199a6e0b3ade1a99bcab1e2b8b1e5b1a2e38398e4ae98e39ba7e6aface1af98e38cb7e69da9cba6c384e4a090e49890e0b2ade5b39ee39eb6e78da2e6888ce492b8e78781e48da2e2b6a1e1a998e2beb7e6a1a3e5b382e196b9e0ada3cc90e48080e1a184e386b9e6a5a8e4aba8e5868de7ae9be19c85e2b68ce1b499e38abae38485e6899ce4a2b8e48081e198b0e2b3ace5b299e3aab4e0b1ade5b1a2e68384e185b1e18b93e29786e0ae8c18e6b48ae6bb86e2979de28db3e79bb6e2b9aee0b281e1a097e38caee28884e3b78ce48e83e39a96e2ba8ee5a39ae3a8b0e691a5e5bb86e19789e0a28be18ba3e49c86e4b28be1a096e394aee6999ce3a388e3a689e78e93e0b1a0e1a19ae39cb7e6b1a5e6888200e280b8e59a87e2b98ce1a19bd0b6e2b8b1e5b1ace3a38ce48691e380a3e4b981e5b499e39eb7e78dace48b84e1978de0a193e18ba3e29c86e0b38be1a097e3a4aee69096e58699e7adbbe39b86e2b18ee5b398c6b2e2b8b1c9a0e48080e78d88e49a96e2b4aee5ac98e39cb4e695b6e6a39ce4a6bde2af8be68da0e49885e0b88bdc81e789a9e5b39ee1969de2adb3e19ca6e6ba8ce5b29bcab9e2b8b2e5b1a0e3a384e18d88e69bb7e2b3ade5ae99e3a4b2e791a1e6939ed78dc688e580a0e2bc81e1a598e39eb9e6bdb7e5a3a4e39691cc8be181a7e49786e0b58ce1a297e6b484e58b82e0b6b9e78688e18c8240e5a385e39eb7e6a5abe4bb9ce3b699e18e93e79b86e6b1ade5a89ae382b2e78da4e6888ce3a388e78681e78ca2e2b780e5b499e39ebbe6adb2e68886e482b8e0a081e382b0e4b7ace1b49be39eb9e6b1ace5b392e0a69de480a0e59ba7e4ba8ce0b182e1a297e2b4b8e5b1a8e3a380e286a9e69e80e0b2ade4839de19c98c4b0e0b884e38780e1ac8be29996e2b7ace0b681e1a897e384aee6808ed6b1e2ac9be798a6e282ade0ae8ce19c98c4b0e0b884e2968ce0aea3e59986e4b68ce0b181e1a297e2b8b1e1a1a6d6b4e78d8be397b6e2b48ce1ae98e38ab7c5ac62e19080e7ae80e19db6e4b48ce0b382e1a097e384aee4919ae58695cc8be28290e6b7ace5ab9be390b9e6b1a5e0bb8ce4b384e185b1e58ba3d886c980e39eb6e791afe4ab84e39685e38e9be68c90d8a5e4ae8ec498e78c96e6839ee296a1e28e9be39a97e0b0ace1a59de384b2e68da1e68396e0b685e1ad9be184a7e29786e0b88ce1a497e38cade6899ce3a3a0e2a699e78ba3e49aa6e4878ce390b1e6b9a1e4ab9cd6b1c688e58080e6ba80e5a99de3a6b3e38493e6899ce582b8c5a9e49897e0b1aee4b19ae1a295e384aee5b1b0e0a388e181b8e19d96e0b68de1a999e38eb7e685a7e4bb88e58695e48e9be68cb1e698a5e0ae8ce19a98e795a2e5a392e3a691e5a6a9e39b92e498ace0b18be19c9ce7b4b2e5a888e29685e0adb3cd80e28080e5a482e3a4b0e795abe58ba8e4b6b1e0a0b3e68c83e49885e0b58bd080e68dade4a3aee3b6bde1ae93e18197d786e0ae8c1be79c87e4a382e38691e1acabe18397e29786e0b88ce1a497e380ade7819ce492b8e18789e584a0e6b2ade1a19ae392b7e6b5b3e4ab8ee196b9e0ae93e79d86e6b98de4869ce1a098e388aee6a99ce39188e5acabe69896e6b4ade5ad9ce38ab3e695aee48ba4e3b791e1ae93e181a7e49886e0b28be1aa9700e49088e38685e3adabe68cb0e49985e4b08be1a095d483e48baee386a5e58c8be59ba0e6ba8ce1af9de396b9e6b9a9e0ab8ee3a384e78681e18c82e68080e5aa82e3a4b2e78da5e6ab9ee0b789e1acabc2a7e29786e0b48ce1a297e384aee689aee38084e68c98e49bb6e6b48ee5a397e39cb7e6a5a6d38ee4b0b8e2ad83e19d86e0b88de5a99ae39cb0e6bda3e4aba4e4b09de0a5b1e68c83d8a5e48c8ce382b6e6b9a9e49abed6a1e78db3e49996e282ade0ae8ce19c9830e18884e59690e6adabe59b96e2b6ade1b99be1a285e384aee5a9b0e3a384e786a9e48ca2e2b281e5ad9de3b2b6e6a1a3e5b382e196b9e0ada3cc90e68180e5b383e3a0bae6b1b0e5ab8ae3a695e0aea3e19ca6e6b2ade48d9ce19c98e3a0b1e6919ce492b4e2a5b1e18ba3e699a6e5ae81e3a8b2e6bdb7e59ba4e49085e18081e283a0e4b2aee1a999e38ab7e78da4e5bba8d789e2acbbe181a6e29786e0b08ce1a497e6b48ce58b82e7b6b9e48c9ae69896e2b78de5ac99e1a28000e59890e3a6bde18d9be49997e2b2aee0b181e1a697e38caee1a080d694e4ae9bd7b7e6b4aee5ac99e39cb4e0b1b3e5b1a2e68384e185b1e18b93d786e0ae8cc498e68c86e6939ee4b781e68cabe68c90d8a5e0ae8ee19a99e2b8b1e5b1a0e1b388e2aca0e199a6e0baace5b49be1a282e380aee6819cd08440e39897e2b5ace1a59be3aab7e0a880e49b9ae0a79de4ae93e79986e6b2acc59ce19c99e2b8b066e580ace18dbbd8b7e2b6ade1b398e38abad9b2e781a2e492b8c5b1e38083e6b1a1e1ad9be3a4b8e78da5e58ba6e39795e0a2b3e48ba3e49786e0ad8ce3aab1e6b1a9e5b388e2b3a4e1ada9e68c96d8a5e0ae8ec499e78084e5b392e2a69de78688cc92e296a7e0ae8ce19c9ce0b0b0e58ba0e1b6b9e1abbbe19a86e4b78ce1a59bcab6e4a590e0ba9cd385e68090e29a90e4b7aee5a69be3a4bae685aee4ab86e1978de78698e68cb2d8a5e1a985e39eb9e699aee693aad6b9e2ac9be79cb6e2b78be5b499e39ebbe6adb2e68886e482b809e582b0e6b1ade1b49de3a0b9e6bda4e6939ee1978de78688e68c82db85e48980e386b6e699b7e5b38ae1968de2ae9be68c90e49885e0b58be0ac80e795b3e4aba0e39789e18c8be19d87e4b58de0b69be1a49ae6bda3e4aba4e296b1e38c93e68c90e49885e4b18b1ce78c8be5ab92e38781e68f8be79a96e0b48ce4959de19c98e3a0b1e6919ce492b4e285b1e28ba3e496a6e5b598e398b4e2b9a4e689a6e1b088e7ac90e19d86e2b78ce1a19ae1a285e384aee5b1b0e39388e1a6a1e48d83e2b6a0e1a998c2b730e19880e296a0e48cbbe19b86e0b3ade5b49ae3a4b2e48483e38a9ce19085ce98e29897e4b5aee48680e3aab1e6a5b2e69b9ee490b9e0a5b1e68e83e29985e0b58be1a097e39caee6899ce39090e4ac8be19ba6d8a0e48280e3a084e791a1e58386e596bde4ada3e182b6e29786e0b88ce1a497e39cade5b1a2e18384e0ada8e69a96e280ad0ccc81e685a3e4ab9ad789e0a1a3e18ba3e49c86e4b28be1a296e380aee6a19ce1809ce38cabe59896e0b68ee4859de19c98e2b8b0c9a0e3a080e68c90e39bb6e6b5ace1a198e3a0b9e6b9a5e693a8e2a7a5e78688cc92d6a7e4ae8ce19c9930e6a0a4e196a1e6ae93e49896e4afade5af99e39cbae685a4e58ba8e3a6bde0a183e68ba3e69786e0ae8ce1b099e18480e583a8e4a695e0adabe79b86e0b2abe5b09ee39cb0e6a5b3e5b39ee490a1e385b1e38ba3e29786e0b38cd681e6a5ace5b384e3a6bde6af8be59bb6e2b9aee0b281e1a297e380aee4988ed6a1e78db3e49996e281ade0ae8cc298e0a882e5a38ae5a695e28c8be29bb7e0b4aee48c99e19c98e3a0b1e6919ce492b4e485b1e48ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606c780e3aab9e695aee58b98e1a68de0a688cba3e29786e4858ce3ae84e789afe4a398e18695e28d8be380b7e2baace4819ac298e6a488e6a39ce4a695e0adb3e19b86e298a0e48280e38681e6b5a6e6b896e482b8c5b1cb93e2b98ee4b299ce9ce695aee6bba8e4a6bde0ad9bcc9040e1a183e386b9e6a5a8e4aba8e5868de18eabe69e97e49a80e0b98be1b097dcb4e4ab9ce5b791e18dbbe19ab7e298a000e3ae87e6a5a5e4a3a4e3a6a5e3acbbe49896e2b3ace1b499e1a483e388aee6899cc384e6a1a8e798b6e2b38ee1b29de392b7e795b4e4aba4e1978de78698e68c82e49885c980e3a4bae78da1e49b90e3a685e38e9be68c90e49885e4b18bc89ae685ade5b392e4908501e58290e6b1ade5ac9de38eb4e791a8e0aba6e3a384e78681ccb2e68480e5b598e3aab1e689ade6938ae59095e0a5b1e28ba306e1b381e382b7e189a4e5b1a2e68384e185b1e18b93e49786e0b28ce1a097e2b8b4e6a9a2e0a684e58098e19996e284ade4ae8ee19c9be2b8b0e681a4e1b3a4e48c98e69896e2b78de5ac99e1a282e380aee6819ce0a084e0a098e29996e28386e0b18ce1a297e390aee5a888e29685e0adb3e18c9040e5ad82e396b2e6b9a1e69b92e1a6b5c688e28ba3e29786e4888de38ab6e685abe58b9ce3978de0a0b3e68c83e49985e0b58bc880e68885e5a388e0a6a5e0a183e18ba3e49ca6e0b38be1ae97e6b48ae5a3aae29791e68c93e39bb6e2b5ace0b280c880e6a5ade49ba6e49085e18081e381a0e2b98ce1a199e38abae38087e6a99ce482b8e285b1e58186e2b0ade5ae9ae1a280c880e6b892e69685e28e9be69bb7e6b2ade4869ce1a098e384aee6819ce3a09ce28cabe79db7e6b98de4839ae19c9830e0b080e3868ce6aeabe39c86c48ee0ae8ee19c98e2acb0e681a2e6a080e48e98e49d96e0baaee1a59ce3a0bce789a5e5ab92e3a695e0aea3e39b86e0b2aee5b49de39cb4e78da7e6888ae482b8e2a5b123e6b1a1e1ad9be39eb3e791b2e1b3a6e3a384e48689e28ba3e296a6e0ae8de19c98e2b8b0e0a1a8d6b4e78d8be18096e48086ce80e382b7e795b4e4aba4e0b78de6adbbe19c86e6b9ace4929ce19c98e3a0b1e6919ce492b4e4a5b1e78ba3e496a6e1af99e38eb9e0b9a5e48b9ce59791e2ae93e39cb6e2b7ace5b09be3a6b0cdb3e5b1a2d380e78090e49cb0e4b7aee5a19ce38ab3e695aee6bba8e4a6bde68d9be68c90d8a5e0ae8ee19a99e2b8b1e5b1ace38384e0ada8e69a96e6afade5a898e39cb0e695aecb98c384e28080e299a1e2b0aee1a59be386b2e6b5afe48ba0e5868de18ca3e79897e4b2aee1b39ce1a285e384aee5a9b0e3a390e78689cc82c8a0e5a599e39eb1e685b2e58ba8e19799e18bbbe79b86e6b1ade5b39ae1a482e384aee6819ce2a080e7ac90e19d86e2b78ce5b09ee3a8b7d9b3e5b1b0e3a380e18689e38083e0b381e1a29de382b1e6ada3e683aae4a78de0a0b1cba3e29786e0b78cd281e6bda3e5838ce0b5bde18dbbd997e498a1e0b68be1a897e388aee0b9a2e1969ce2adb3e19ca6e2b68ce4b180c480e6b488e59386e69791e4ada3e398a6e498a1e0b18be19a9ce2b8b6e5b1a0e59384e6a181e298b6e2ba8de5ac9ee384b4e38483e6819c04e4a180dcb6e6b0aee5ae9de3a4b2e38483e6819ce29080e38ca8e29997e6bcaee5af98e3a0b6e3848ce6899ce3a3a0e6a691e68c92e49aa5e0b78bd480e695aae6a392e1979de5ac8be29996e683aee0ae8ce19c98e2b8b070e580a4e18cabe19ca7e2b68ce1b49aceb4e2b8b0e1b1a0e3a4bde188aae58390e4b4ade1a99be38eb7e685a7e4bb88e58695e38e9be68c90e298a5e0ae8ce0a898e685ade5b392e3a5bde28cabe79db7e6b98de59f9ae390b1e6b9a1e4ab9cd6b1c690e480a0e4b1a1e1a19ce3a8b3e79db4e48b8ae196ade3ae93e68e90e498a5e4b18be1ae9ce6b484e58b82e196b9e78688e68c82d885e48280e38285e685abe583a6e0b6a5e7aea3e59b96e2838ce4ae8ce19a9ae380b2e5a888e29685e0adb3cc90e28280e5a681e3a4b7e695a7c886e694b9e281a2e59a97e6b98ce5b397e3a4b7e6a5b4e4bb9ce4908dc5b1e58083e0b9a0e5ac9ce3a8b4e38483e6899ce0a084e1a1b0e49bb6e6b7ade5b39ce398b0e6a1a3e69b8ae4b791e0a0abcba3e69787e48c8ce390b1e6b9a1e4ab9ce7b6b1e0adaae69a96e282ade0ae8ce19c98c4b0e0b084e1978ce2ada3e59ba6e286ace4ae8ce1b098e388aee6899ae492b8e786b9e78e92e2b780e5b499e39ebbe6adb2e6888200e28298e19ca6e0b88de1b99ce39eb6e691a1e5b392e4b69de18c9be59997e2b78ce0b181e1ac97e390aee1b086e4a68ce38c8be19d86e6b78de5b499e38abbe6ada1e0bba6e196b8e3aea3e29bb7e6b5aee0b180e1a097d080e5a892e3a6a5e1acabe19ca6e0b38ce4869de19c98e3a0b1e6919ce590a8e18db3e79997e6b4ace5b49ce3a4b2e49884e1a29ad38de18180e79997e6b4ace5b49ce3a4b2e49884e1a29ad38de68080e59d80e4b98ce1a19ce398b1e6b9a5e4ab88e48789e78688cc92e49787e4ad8ce19c98e2b8b1e5b1a0e48384c691e38680e0b7aee5a89ce3a6b4e6a5b4e48b86e19791e18ca3e39896e0b5ace5a19ce396b1e799b3e1bb90e3a384e48689e28ba3e296a6e0ae8ce19c98e2b8b4e691a2e2b080e7ada8e39d96e0b2aee5b79de382b2e78dabc886e694b9e48092e19d80e2ba8de5ae98e3aab4d5ade5b1a6e3a394e3a6b1e59ba0e6ba8ce1af9de396b9e38483e6819cd084e580a0e49896e0b2ace48d80e3a4b1e685a5e4aba8e5b791e0acabe59ab6e0b98ce0b282e1a097e380aee6899ce0a39ce2a1b0e39896e6bcaee5b697e398b4e685ace4ab8ee4b789e0a1abe18ba3e49c86e4b28be1a296e380aee6899ce1b380e2aca0e199a6e0baace5b49be1a282e380aee6819ce0a08428da97e4b2aee48c9ee19c98e3a0b1e6919ce492b4e0a5b1e58ba3c3a6e1a599e382b3e6b1b5e0aba8e3a384e78681e18c82e68080e5a981e38ab1e695a2e4bba4d08de4a9b215e0b381e5b99be390bbe695a5d398e39098e78c8be49d86e4b2ade0b181e1b297e388aee0b9aee196b8e3aea3e29bb7e2b5aee0b18000e69489e5bb86e3b6b1e4acbbe398b6e282aee4ae8ce19c9bc8b3e6888ad795e5ae93e381b6e49786e4ad8ce1aa99d0b8e48b9ae3a6a5e0a08be28083c680e5a19ee3a4b2e6b5afe5b392e396a5cc8be281b7e49986e4b18be19c98d0b1e48b9ae3a6a5e0a09bcba326c680e392b8e781a7e5b38ae68095c5b1e18ba3e28186e5a682e3a6b0e689b4e5b38ae2868de380abcba3e49786e4878ce390b1e6b9a1e4ab9ce196b1e786a0e68da2e29885e48280e3a084e6b1afe5abb2e4a6bde48e83e182b6e29786e0b88ce1a497e380ade6a19ce18390e0ada8e69a96e280ad0cd480e795a1e5bba8e19789e68cbbe29a96e2838ce4ae8ce19a9be38cb5e1b084e5878ce18dbbe79897e0b2ace5b299e3aeb0e789a5e0b3a6e48384e185b1e18ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606cc80e398b3e7a1b5e4ab9ce5b791e18dbbe39ab7e683aee0ae8de19c98e2b8b770e3a0a8e7acabe39ba6e2b98ce1a698e1a4bae38883e6919ce28088e78ca8e29996e2b1aee1ac99ceb6e2b8b0e1b1a0e3a4bde3a8aae59ba0e6ba8ce1af9de396b9e38085e6819ce482b8e18081e18290e0b88ce5ac9ce3a6b2e6a5abe1a39ce3a388e786a1e38c82e6b6a5e0b198e1a297d0b8e78ba6e0b6b9e0a08be18093e485a0e1a599e3a4b9e791a9e49b8ae4a6bde18cabe583a0e0b7ade1b599e382b6e789b2e6ab9ee19791e1ae93e18287e29787e4ae8ce19a98e38cb9e5a898e29685e7adb3d8b5e4b0ade5ae9be398b2e3888100e4a190e38cabe69a96e0b2ade1b399e39ebae685b2e4ab8ee18685e7aca3e39ba6c2aee0ae8ce19c9c32e5b894e19781e68db3e19bb6e2b28ce1b299e1a283e2b8b2e5b1a0e0a384e28188e59a87e4aface5a19de398bae185b4e5b1a2e68384e185b1e28b93d786e4ae8ce1a098e3a0aee789ace3a09ce28cabe79db7e6b98dc69ae19c98e398b2e6819cd080e6a2a8e49bb6e4b2ace5ae9ce392bae698bae6ab98e3a7a1e28cabe79db7e6b98de5b39ae1ae81e39cb000" + "d": ( + bytes.fromhex( + "e0ba8b0000c484e4a0b0e18e9be19997e2baaee1b399e392bae7a5a6e6908ae4a2b8c5b1e380a3e2b1a1e1a39ee39eb6e78db" + "0e5bb86e19789e0a0b3e18ba3e49aa6e0b18be38686e685a8e5b39ce38695e6abbbe19896e2b78de0b181e1a097e380ae02d0" + "98e2aeabe19987e2b7ade0b181e1a097e38caee1b880e59684e4af83e19b86e4b0ade1b99ce398b1e68dafe69b96e490b5e0a" + "5b1e68e83e29985e0b08be1a097e384aed1a8e4b1a0ceabe29997e2b6aee1b298e392bae6b9aae6a1ace0b388e78dbbe199a6" + "e0b3ade1a99bcab1e2b8b1e5b1a2e38398e4ae98e39ba7e6aface1af98e38cb7e69da9cba6c384e4a090e49890e0b2ade5b39" + "ee39eb6e78da2e6888ce492b8e78781e48da2e2b6a1e1a998e2beb7e6a1a3e5b382e196b9e0ada3cc90e48080e1a184e386b9" + "e6a5a8e4aba8e5868de7ae9be19c85e2b68ce1b499e38abae38485e6899ce4a2b8e48081e198b0e2b3ace5b299e3aab4e0b1a" + "de5b1a2e68384e185b1e18b93e29786e0ae8c18e6b48ae6bb86e2979de28db3e79bb6e2b9aee0b281e1a097e38caee28884e3" + "b78ce48e83e39a96e2ba8ee5a39ae3a8b0e691a5e5bb86e19789e0a28be18ba3e49c86e4b28be1a096e394aee6999ce3a388e" + "3a689e78e93e0b1a0e1a19ae39cb7e6b1a5e6888200e280b8e59a87e2b98ce1a19bd0b6e2b8b1e5b1ace3a38ce48691e380a3" + "e4b981e5b499e39eb7e78dace48b84e1978de0a193e18ba3e29c86e0b38be1a097e3a4aee69096e58699e7adbbe39b86e2b18" + "ee5b398c6b2e2b8b1c9a0e48080e78d88e49a96e2b4aee5ac98e39cb4e695b6e6a39ce4a6bde2af8be68da0e49885e0b88bdc" + "81e789a9e5b39ee1969de2adb3e19ca6e6ba8ce5b29bcab9e2b8b2e5b1a0e3a384e18d88e69bb7e2b3ade5ae99e3a4b2e791a" + "1e6939ed78dc688e580a0e2bc81e1a598e39eb9e6bdb7e5a3a4e39691cc8be181a7e49786e0b58ce1a297e6b484e58b82e0b6" + "b9e78688e18c8240e5a385e39eb7e6a5abe4bb9ce3b699e18e93e79b86e6b1ade5a89ae382b2e78da4e6888ce3a388e78681e" + "78ca2e2b780e5b499e39ebbe6adb2e68886e482b8e0a081e382b0e4b7ace1b49be39eb9e6b1ace5b392e0a69de480a0e59ba7" + "e4ba8ce0b182e1a297e2b4b8e5b1a8e3a380e286a9e69e80e0b2ade4839de19c98c4b0e0b884e38780e1ac8be29996e2b7ace" + "0b681e1a897e384aee6808ed6b1e2ac9be798a6e282ade0ae8ce19c98c4b0e0b884e2968ce0aea3e59986e4b68ce0b181e1a2" + "97e2b8b1e1a1a6d6b4e78d8be397b6e2b48ce1ae98e38ab7c5ac62e19080e7ae80e19db6e4b48ce0b382e1a097e384aee4919" + "ae58695cc8be28290e6b7ace5ab9be390b9e6b1a5e0bb8ce4b384e185b1e58ba3d886c980e39eb6e791afe4ab84e39685e38e" + "9be68c90d8a5e4ae8ec498e78c96e6839ee296a1e28e9be39a97e0b0ace1a59de384b2e68da1e68396e0b685e1ad9be184a7e" + "29786e0b88ce1a497e38cade6899ce3a3a0e2a699e78ba3e49aa6e4878ce390b1e6b9a1e4ab9cd6b1c688e58080e6ba80e5a9" + "9de3a6b3e38493e6899ce582b8c5a9e49897e0b1aee4b19ae1a295e384aee5b1b0e0a388e181b8e19d96e0b68de1a999e38eb" + "7e685a7e4bb88e58695e48e9be68cb1e698a5e0ae8ce19a98e795a2e5a392e3a691e5a6a9e39b92e498ace0b18be19c9ce7b4" + "b2e5a888e29685e0adb3cd80e28080e5a482e3a4b0e795abe58ba8e4b6b1e0a0b3e68c83e49885e0b58bd080e68dade4a3aee" + "3b6bde1ae93e18197d786e0ae8c1be79c87e4a382e38691e1acabe18397e29786e0b88ce1a497e380ade7819ce492b8e18789" + "e584a0e6b2ade1a19ae392b7e6b5b3e4ab8ee196b9e0ae93e79d86e6b98de4869ce1a098e388aee6a99ce39188e5acabe6989" + "6e6b4ade5ad9ce38ab3e695aee48ba4e3b791e1ae93e181a7e49886e0b28be1aa9700e49088e38685e3adabe68cb0e49985e4" + "b08be1a095d483e48baee386a5e58c8be59ba0e6ba8ce1af9de396b9e6b9a9e0ab8ee3a384e78681e18c82e68080e5aa82e3a" + "4b2e78da5e6ab9ee0b789e1acabc2a7e29786e0b48ce1a297e384aee689aee38084e68c98e49bb6e6b48ee5a397e39cb7e6a5" + "a6d38ee4b0b8e2ad83e19d86e0b88de5a99ae39cb0e6bda3e4aba4e4b09de0a5b1e68c83d8a5e48c8ce382b6e6b9a9e49abed" + "6a1e78db3e49996e282ade0ae8ce19c9830e18884e59690e6adabe59b96e2b6ade1b99be1a285e384aee5a9b0e3a384e786a9" + "e48ca2e2b281e5ad9de3b2b6e6a1a3e5b382e196b9e0ada3cc90e68180e5b383e3a0bae6b1b0e5ab8ae3a695e0aea3e19ca6e" + "6b2ade48d9ce19c98e3a0b1e6919ce492b4e2a5b1e18ba3e699a6e5ae81e3a8b2e6bdb7e59ba4e49085e18081e283a0e4b2ae" + "e1a999e38ab7e78da4e5bba8d789e2acbbe181a6e29786e0b08ce1a497e6b48ce58b82e7b6b9e48c9ae69896e2b78de5ac99e" + "1a28000e59890e3a6bde18d9be49997e2b2aee0b181e1a697e38caee1a080d694e4ae9bd7b7e6b4aee5ac99e39cb4e0b1b3e5" + "b1a2e68384e185b1e18b93d786e0ae8cc498e68c86e6939ee4b781e68cabe68c90d8a5e0ae8ee19a99e2b8b1e5b1a0e1b388e" + "2aca0e199a6e0baace5b49be1a282e380aee6819cd08440e39897e2b5ace1a59be3aab7e0a880e49b9ae0a79de4ae93e79986" + "e6b2acc59ce19c99e2b8b066e580ace18dbbd8b7e2b6ade1b398e38abad9b2e781a2e492b8c5b1e38083e6b1a1e1ad9be3a4b" + "8e78da5e58ba6e39795e0a2b3e48ba3e49786e0ad8ce3aab1e6b1a9e5b388e2b3a4e1ada9e68c96d8a5e0ae8ec499e78084e5" + "b392e2a69de78688cc92e296a7e0ae8ce19c9ce0b0b0e58ba0e1b6b9e1abbbe19a86e4b78ce1a59bcab6e4a590e0ba9cd385e" + "68090e29a90e4b7aee5a69be3a4bae685aee4ab86e1978de78698e68cb2d8a5e1a985e39eb9e699aee693aad6b9e2ac9be79c" + "b6e2b78be5b499e39ebbe6adb2e68886e482b809e582b0e6b1ade1b49de3a0b9e6bda4e6939ee1978de78688e68c82db85e48" + "980e386b6e699b7e5b38ae1968de2ae9be68c90e49885e0b58be0ac80e795b3e4aba0e39789e18c8be19d87e4b58de0b69be1" + "a49ae6bda3e4aba4e296b1e38c93e68c90e49885e4b18b1ce78c8be5ab92e38781e68f8be79a96e0b48ce4959de19c98e3a0b" + "1e6919ce492b4e285b1e28ba3e496a6e5b598e398b4e2b9a4e689a6e1b088e7ac90e19d86e2b78ce1a19ae1a285e384aee5b1" + "b0e39388e1a6a1e48d83e2b6a0e1a998c2b730e19880e296a0e48cbbe19b86e0b3ade5b49ae3a4b2e48483e38a9ce19085ce9" + "8e29897e4b5aee48680e3aab1e6a5b2e69b9ee490b9e0a5b1e68e83e29985e0b58be1a097e39caee6899ce39090e4ac8be19b" + "a6d8a0e48280e3a084e791a1e58386e596bde4ada3e182b6e29786e0b88ce1a497e39cade5b1a2e18384e0ada8e69a96e280a" + "d0ccc81e685a3e4ab9ad789e0a1a3e18ba3e49c86e4b28be1a296e380aee6a19ce1809ce38cabe59896e0b68ee4859de19c98" + "e2b8b0c9a0e3a080e68c90e39bb6e6b5ace1a198e3a0b9e6b9a5e693a8e2a7a5e78688cc92d6a7e4ae8ce19c9930e6a0a4e19" + "6a1e6ae93e49896e4afade5af99e39cbae685a4e58ba8e3a6bde0a183e68ba3e69786e0ae8ce1b099e18480e583a8e4a695e0" + "adabe79b86e0b2abe5b09ee39cb0e6a5b3e5b39ee490a1e385b1e38ba3e29786e0b38cd681e6a5ace5b384e3a6bde6af8be59" + "bb6e2b9aee0b281e1a297e380aee4988ed6a1e78db3e49996e281ade0ae8cc298e0a882e5a38ae5a695e28c8be29bb7e0b4ae" + "e48c99e19c98e3a0b1e6919ce492b4e485b1e48ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606c780e3aab" + "9e695aee58b98e1a68de0a688cba3e29786e4858ce3ae84e789afe4a398e18695e28d8be380b7e2baace4819ac298e6a488e6" + "a39ce4a695e0adb3e19b86e298a0e48280e38681e6b5a6e6b896e482b8c5b1cb93e2b98ee4b299ce9ce695aee6bba8e4a6bde" + "0ad9bcc9040e1a183e386b9e6a5a8e4aba8e5868de18eabe69e97e49a80e0b98be1b097dcb4e4ab9ce5b791e18dbbe19ab7e2" + "98a000e3ae87e6a5a5e4a3a4e3a6a5e3acbbe49896e2b3ace1b499e1a483e388aee6899cc384e6a1a8e798b6e2b38ee1b29de" + "392b7e795b4e4aba4e1978de78698e68c82e49885c980e3a4bae78da1e49b90e3a685e38e9be68c90e49885e4b18bc89ae685" + "ade5b392e4908501e58290e6b1ade5ac9de38eb4e791a8e0aba6e3a384e78681ccb2e68480e5b598e3aab1e689ade6938ae59" + "095e0a5b1e28ba306e1b381e382b7e189a4e5b1a2e68384e185b1e18b93e49786e0b28ce1a097e2b8b4e6a9a2e0a684e58098" + "e19996e284ade4ae8ee19c9be2b8b0e681a4e1b3a4e48c98e69896e2b78de5ac99e1a282e380aee6819ce0a084e0a098e2999" + "6e28386e0b18ce1a297e390aee5a888e29685e0adb3e18c9040e5ad82e396b2e6b9a1e69b92e1a6b5c688e28ba3e29786e488" + "8de38ab6e685abe58b9ce3978de0a0b3e68c83e49985e0b58bc880e68885e5a388e0a6a5e0a183e18ba3e49ca6e0b38be1ae9" + "7e6b48ae5a3aae29791e68c93e39bb6e2b5ace0b280c880e6a5ade49ba6e49085e18081e381a0e2b98ce1a199e38abae38087" + "e6a99ce482b8e285b1e58186e2b0ade5ae9ae1a280c880e6b892e69685e28e9be69bb7e6b2ade4869ce1a098e384aee6819ce" + "3a09ce28cabe79db7e6b98de4839ae19c9830e0b080e3868ce6aeabe39c86c48ee0ae8ee19c98e2acb0e681a2e6a080e48e98" + "e49d96e0baaee1a59ce3a0bce789a5e5ab92e3a695e0aea3e39b86e0b2aee5b49de39cb4e78da7e6888ae482b8e2a5b123e6b" + "1a1e1ad9be39eb3e791b2e1b3a6e3a384e48689e28ba3e296a6e0ae8de19c98e2b8b0e0a1a8d6b4e78d8be18096e48086ce80" + "e382b7e795b4e4aba4e0b78de6adbbe19c86e6b9ace4929ce19c98e3a0b1e6919ce492b4e4a5b1e78ba3e496a6e1af99e38eb" + "9e0b9a5e48b9ce59791e2ae93e39cb6e2b7ace5b09be3a6b0cdb3e5b1a2d380e78090e49cb0e4b7aee5a19ce38ab3e695aee6" + "bba8e4a6bde68d9be68c90d8a5e0ae8ee19a99e2b8b1e5b1ace38384e0ada8e69a96e6afade5a898e39cb0e695aecb98c384e" + "28080e299a1e2b0aee1a59be386b2e6b5afe48ba0e5868de18ca3e79897e4b2aee1b39ce1a285e384aee5a9b0e3a390e78689" + "cc82c8a0e5a599e39eb1e685b2e58ba8e19799e18bbbe79b86e6b1ade5b39ae1a482e384aee6819ce2a080e7ac90e19d86e2b" + "78ce5b09ee3a8b7d9b3e5b1b0e3a380e18689e38083e0b381e1a29de382b1e6ada3e683aae4a78de0a0b1cba3e29786e0b78c" + "d281e6bda3e5838ce0b5bde18dbbd997e498a1e0b68be1a897e388aee0b9a2e1969ce2adb3e19ca6e2b68ce4b180c480e6b48" + "8e59386e69791e4ada3e398a6e498a1e0b18be19a9ce2b8b6e5b1a0e59384e6a181e298b6e2ba8de5ac9ee384b4e38483e681" + "9c04e4a180dcb6e6b0aee5ae9de3a4b2e38483e6819ce29080e38ca8e29997e6bcaee5af98e3a0b6e3848ce6899ce3a3a0e6a" + "691e68c92e49aa5e0b78bd480e695aae6a392e1979de5ac8be29996e683aee0ae8ce19c98e2b8b070e580a4e18cabe19ca7e2" + "b68ce1b49aceb4e2b8b0e1b1a0e3a4bde188aae58390e4b4ade1a99be38eb7e685a7e4bb88e58695e38e9be68c90e298a5e0a" + "e8ce0a898e685ade5b392e3a5bde28cabe79db7e6b98de59f9ae390b1e6b9a1e4ab9cd6b1c690e480a0e4b1a1e1a19ce3a8b3" + "e79db4e48b8ae196ade3ae93e68e90e498a5e4b18be1ae9ce6b484e58b82e196b9e78688e68c82d885e48280e38285e685abe" + "583a6e0b6a5e7aea3e59b96e2838ce4ae8ce19a9ae380b2e5a888e29685e0adb3cc90e28280e5a681e3a4b7e695a7c886e694" + "b9e281a2e59a97e6b98ce5b397e3a4b7e6a5b4e4bb9ce4908dc5b1e58083e0b9a0e5ac9ce3a8b4e38483e6899ce0a084e1a1b" + "0e49bb6e6b7ade5b39ce398b0e6a1a3e69b8ae4b791e0a0abcba3e69787e48c8ce390b1e6b9a1e4ab9ce7b6b1e0adaae69a96" + "e282ade0ae8ce19c98c4b0e0b084e1978ce2ada3e59ba6e286ace4ae8ce1b098e388aee6899ae492b8e786b9e78e92e2b780e" + "5b499e39ebbe6adb2e6888200e28298e19ca6e0b88de1b99ce39eb6e691a1e5b392e4b69de18c9be59997e2b78ce0b181e1ac" + "97e390aee1b086e4a68ce38c8be19d86e6b78de5b499e38abbe6ada1e0bba6e196b8e3aea3e29bb7e6b5aee0b180e1a097d08" + "0e5a892e3a6a5e1acabe19ca6e0b38ce4869de19c98e3a0b1e6919ce590a8e18db3e79997e6b4ace5b49ce3a4b2e49884e1a2" + "9ad38de18180e79997e6b4ace5b49ce3a4b2e49884e1a29ad38de68080e59d80e4b98ce1a19ce398b1e6b9a5e4ab88e48789e" + "78688cc92e49787e4ad8ce19c98e2b8b1e5b1a0e48384c691e38680e0b7aee5a89ce3a6b4e6a5b4e48b86e19791e18ca3e398" + "96e0b5ace5a19ce396b1e799b3e1bb90e3a384e48689e28ba3e296a6e0ae8ce19c98e2b8b4e691a2e2b080e7ada8e39d96e0b" + "2aee5b79de382b2e78dabc886e694b9e48092e19d80e2ba8de5ae98e3aab4d5ade5b1a6e3a394e3a6b1e59ba0e6ba8ce1af9d" + "e396b9e38483e6819cd084e580a0e49896e0b2ace48d80e3a4b1e685a5e4aba8e5b791e0acabe59ab6e0b98ce0b282e1a097e" + "380aee6899ce0a39ce2a1b0e39896e6bcaee5b697e398b4e685ace4ab8ee4b789e0a1abe18ba3e49c86e4b28be1a296e380ae" + "e6899ce1b380e2aca0e199a6e0baace5b49be1a282e380aee6819ce0a08428da97e4b2aee48c9ee19c98e3a0b1e6919ce492b" + "4e0a5b1e58ba3c3a6e1a599e382b3e6b1b5e0aba8e3a384e78681e18c82e68080e5a981e38ab1e695a2e4bba4d08de4a9b215" + "e0b381e5b99be390bbe695a5d398e39098e78c8be49d86e4b2ade0b181e1b297e388aee0b9aee196b8e3aea3e29bb7e2b5aee" + "0b18000e69489e5bb86e3b6b1e4acbbe398b6e282aee4ae8ce19c9bc8b3e6888ad795e5ae93e381b6e49786e4ad8ce1aa99d0" + "b8e48b9ae3a6a5e0a08be28083c680e5a19ee3a4b2e6b5afe5b392e396a5cc8be281b7e49986e4b18be19c98d0b1e48b9ae3a" + "6a5e0a09bcba326c680e392b8e781a7e5b38ae68095c5b1e18ba3e28186e5a682e3a6b0e689b4e5b38ae2868de380abcba3e4" + "9786e4878ce390b1e6b9a1e4ab9ce196b1e786a0e68da2e29885e48280e3a084e6b1afe5abb2e4a6bde48e83e182b6e29786e" + "0b88ce1a497e380ade6a19ce18390e0ada8e69a96e280ad0cd480e795a1e5bba8e19789e68cbbe29a96e2838ce4ae8ce19a9b" + "e38cb5e1b084e5878ce18dbbe79897e0b2ace5b299e3aeb0e789a5e0b3a6e48384e185b1e18ba3e28686e5a19be39cb4e68d9" + "fe48b90e3a6b9e68cabe1809606cc80e398b3e7a1b5e4ab9ce5b791e18dbbe39ab7e683aee0ae8de19c98e2b8b770e3a0a8e7" + "acabe39ba6e2b98ce1a698e1a4bae38883e6919ce28088e78ca8e29996e2b1aee1ac99ceb6e2b8b0e1b1a0e3a4bde3a8aae59" + "ba0e6ba8ce1af9de396b9e38085e6819ce482b8e18081e18290e0b88ce5ac9ce3a6b2e6a5abe1a39ce3a388e786a1e38c82e6" + "b6a5e0b198e1a297d0b8e78ba6e0b6b9e0a08be18093e485a0e1a599e3a4b9e791a9e49b8ae4a6bde18cabe583a0e0b7ade1b" + "599e382b6e789b2e6ab9ee19791e1ae93e18287e29787e4ae8ce19a98e38cb9e5a898e29685e7adb3d8b5e4b0ade5ae9be398" + "b2e3888100e4a190e38cabe69a96e0b2ade1b399e39ebae685b2e4ab8ee18685e7aca3e39ba6c2aee0ae8ce19c9c32e5b894e" + "19781e68db3e19bb6e2b28ce1b299e1a283e2b8b2e5b1a0e0a384e28188e59a87e4aface5a19de398bae185b4e5b1a2e68384" + "e185b1e28b93d786e4ae8ce1a098e3a0aee789ace3a09ce28cabe79db7e6b98dc69ae19c98e398b2e6819cd080e6a2a8e49bb" + "6e4b2ace5ae9ce392bae698bae6ab98e3a7a1e28cabe79db7e6b98de5b39ae1ae81e39cb000" + ) ).decode("utf-8"), "fmlNetworkVersion": 3, "mods": [], diff --git a/tests/test_forge_data.py b/tests/test_forge_data.py index 1467c844..5904d08e 100644 --- a/tests/test_forge_data.py +++ b/tests/test_forge_data.py @@ -1,7 +1,101 @@ from mcstatus.forge_data import ForgeData, decode_forge_data, decode_optimized ENCODED_STRING = bytes.fromhex( - "e0ba8b0000c484e4a0b0e18e9be19997e2baaee1b399e392bae7a5a6e6908ae4a2b8c5b1e380a3e2b1a1e1a39ee39eb6e78db0e5bb86e19789e0a0b3e18ba3e49aa6e0b18be38686e685a8e5b39ce38695e6abbbe19896e2b78de0b181e1a097e380ae02d098e2aeabe19987e2b7ade0b181e1a097e38caee1b880e59684e4af83e19b86e4b0ade1b99ce398b1e68dafe69b96e490b5e0a5b1e68e83e29985e0b08be1a097e384aed1a8e4b1a0ceabe29997e2b6aee1b298e392bae6b9aae6a1ace0b388e78dbbe199a6e0b3ade1a99bcab1e2b8b1e5b1a2e38398e4ae98e39ba7e6aface1af98e38cb7e69da9cba6c384e4a090e49890e0b2ade5b39ee39eb6e78da2e6888ce492b8e78781e48da2e2b6a1e1a998e2beb7e6a1a3e5b382e196b9e0ada3cc90e48080e1a184e386b9e6a5a8e4aba8e5868de7ae9be19c85e2b68ce1b499e38abae38485e6899ce4a2b8e48081e198b0e2b3ace5b299e3aab4e0b1ade5b1a2e68384e185b1e18b93e29786e0ae8c18e6b48ae6bb86e2979de28db3e79bb6e2b9aee0b281e1a097e38caee28884e3b78ce48e83e39a96e2ba8ee5a39ae3a8b0e691a5e5bb86e19789e0a28be18ba3e49c86e4b28be1a096e394aee6999ce3a388e3a689e78e93e0b1a0e1a19ae39cb7e6b1a5e6888200e280b8e59a87e2b98ce1a19bd0b6e2b8b1e5b1ace3a38ce48691e380a3e4b981e5b499e39eb7e78dace48b84e1978de0a193e18ba3e29c86e0b38be1a097e3a4aee69096e58699e7adbbe39b86e2b18ee5b398c6b2e2b8b1c9a0e48080e78d88e49a96e2b4aee5ac98e39cb4e695b6e6a39ce4a6bde2af8be68da0e49885e0b88bdc81e789a9e5b39ee1969de2adb3e19ca6e6ba8ce5b29bcab9e2b8b2e5b1a0e3a384e18d88e69bb7e2b3ade5ae99e3a4b2e791a1e6939ed78dc688e580a0e2bc81e1a598e39eb9e6bdb7e5a3a4e39691cc8be181a7e49786e0b58ce1a297e6b484e58b82e0b6b9e78688e18c8240e5a385e39eb7e6a5abe4bb9ce3b699e18e93e79b86e6b1ade5a89ae382b2e78da4e6888ce3a388e78681e78ca2e2b780e5b499e39ebbe6adb2e68886e482b8e0a081e382b0e4b7ace1b49be39eb9e6b1ace5b392e0a69de480a0e59ba7e4ba8ce0b182e1a297e2b4b8e5b1a8e3a380e286a9e69e80e0b2ade4839de19c98c4b0e0b884e38780e1ac8be29996e2b7ace0b681e1a897e384aee6808ed6b1e2ac9be798a6e282ade0ae8ce19c98c4b0e0b884e2968ce0aea3e59986e4b68ce0b181e1a297e2b8b1e1a1a6d6b4e78d8be397b6e2b48ce1ae98e38ab7c5ac62e19080e7ae80e19db6e4b48ce0b382e1a097e384aee4919ae58695cc8be28290e6b7ace5ab9be390b9e6b1a5e0bb8ce4b384e185b1e58ba3d886c980e39eb6e791afe4ab84e39685e38e9be68c90d8a5e4ae8ec498e78c96e6839ee296a1e28e9be39a97e0b0ace1a59de384b2e68da1e68396e0b685e1ad9be184a7e29786e0b88ce1a497e38cade6899ce3a3a0e2a699e78ba3e49aa6e4878ce390b1e6b9a1e4ab9cd6b1c688e58080e6ba80e5a99de3a6b3e38493e6899ce582b8c5a9e49897e0b1aee4b19ae1a295e384aee5b1b0e0a388e181b8e19d96e0b68de1a999e38eb7e685a7e4bb88e58695e48e9be68cb1e698a5e0ae8ce19a98e795a2e5a392e3a691e5a6a9e39b92e498ace0b18be19c9ce7b4b2e5a888e29685e0adb3cd80e28080e5a482e3a4b0e795abe58ba8e4b6b1e0a0b3e68c83e49885e0b58bd080e68dade4a3aee3b6bde1ae93e18197d786e0ae8c1be79c87e4a382e38691e1acabe18397e29786e0b88ce1a497e380ade7819ce492b8e18789e584a0e6b2ade1a19ae392b7e6b5b3e4ab8ee196b9e0ae93e79d86e6b98de4869ce1a098e388aee6a99ce39188e5acabe69896e6b4ade5ad9ce38ab3e695aee48ba4e3b791e1ae93e181a7e49886e0b28be1aa9700e49088e38685e3adabe68cb0e49985e4b08be1a095d483e48baee386a5e58c8be59ba0e6ba8ce1af9de396b9e6b9a9e0ab8ee3a384e78681e18c82e68080e5aa82e3a4b2e78da5e6ab9ee0b789e1acabc2a7e29786e0b48ce1a297e384aee689aee38084e68c98e49bb6e6b48ee5a397e39cb7e6a5a6d38ee4b0b8e2ad83e19d86e0b88de5a99ae39cb0e6bda3e4aba4e4b09de0a5b1e68c83d8a5e48c8ce382b6e6b9a9e49abed6a1e78db3e49996e282ade0ae8ce19c9830e18884e59690e6adabe59b96e2b6ade1b99be1a285e384aee5a9b0e3a384e786a9e48ca2e2b281e5ad9de3b2b6e6a1a3e5b382e196b9e0ada3cc90e68180e5b383e3a0bae6b1b0e5ab8ae3a695e0aea3e19ca6e6b2ade48d9ce19c98e3a0b1e6919ce492b4e2a5b1e18ba3e699a6e5ae81e3a8b2e6bdb7e59ba4e49085e18081e283a0e4b2aee1a999e38ab7e78da4e5bba8d789e2acbbe181a6e29786e0b08ce1a497e6b48ce58b82e7b6b9e48c9ae69896e2b78de5ac99e1a28000e59890e3a6bde18d9be49997e2b2aee0b181e1a697e38caee1a080d694e4ae9bd7b7e6b4aee5ac99e39cb4e0b1b3e5b1a2e68384e185b1e18b93d786e0ae8cc498e68c86e6939ee4b781e68cabe68c90d8a5e0ae8ee19a99e2b8b1e5b1a0e1b388e2aca0e199a6e0baace5b49be1a282e380aee6819cd08440e39897e2b5ace1a59be3aab7e0a880e49b9ae0a79de4ae93e79986e6b2acc59ce19c99e2b8b066e580ace18dbbd8b7e2b6ade1b398e38abad9b2e781a2e492b8c5b1e38083e6b1a1e1ad9be3a4b8e78da5e58ba6e39795e0a2b3e48ba3e49786e0ad8ce3aab1e6b1a9e5b388e2b3a4e1ada9e68c96d8a5e0ae8ec499e78084e5b392e2a69de78688cc92e296a7e0ae8ce19c9ce0b0b0e58ba0e1b6b9e1abbbe19a86e4b78ce1a59bcab6e4a590e0ba9cd385e68090e29a90e4b7aee5a69be3a4bae685aee4ab86e1978de78698e68cb2d8a5e1a985e39eb9e699aee693aad6b9e2ac9be79cb6e2b78be5b499e39ebbe6adb2e68886e482b809e582b0e6b1ade1b49de3a0b9e6bda4e6939ee1978de78688e68c82db85e48980e386b6e699b7e5b38ae1968de2ae9be68c90e49885e0b58be0ac80e795b3e4aba0e39789e18c8be19d87e4b58de0b69be1a49ae6bda3e4aba4e296b1e38c93e68c90e49885e4b18b1ce78c8be5ab92e38781e68f8be79a96e0b48ce4959de19c98e3a0b1e6919ce492b4e285b1e28ba3e496a6e5b598e398b4e2b9a4e689a6e1b088e7ac90e19d86e2b78ce1a19ae1a285e384aee5b1b0e39388e1a6a1e48d83e2b6a0e1a998c2b730e19880e296a0e48cbbe19b86e0b3ade5b49ae3a4b2e48483e38a9ce19085ce98e29897e4b5aee48680e3aab1e6a5b2e69b9ee490b9e0a5b1e68e83e29985e0b58be1a097e39caee6899ce39090e4ac8be19ba6d8a0e48280e3a084e791a1e58386e596bde4ada3e182b6e29786e0b88ce1a497e39cade5b1a2e18384e0ada8e69a96e280ad0ccc81e685a3e4ab9ad789e0a1a3e18ba3e49c86e4b28be1a296e380aee6a19ce1809ce38cabe59896e0b68ee4859de19c98e2b8b0c9a0e3a080e68c90e39bb6e6b5ace1a198e3a0b9e6b9a5e693a8e2a7a5e78688cc92d6a7e4ae8ce19c9930e6a0a4e196a1e6ae93e49896e4afade5af99e39cbae685a4e58ba8e3a6bde0a183e68ba3e69786e0ae8ce1b099e18480e583a8e4a695e0adabe79b86e0b2abe5b09ee39cb0e6a5b3e5b39ee490a1e385b1e38ba3e29786e0b38cd681e6a5ace5b384e3a6bde6af8be59bb6e2b9aee0b281e1a297e380aee4988ed6a1e78db3e49996e281ade0ae8cc298e0a882e5a38ae5a695e28c8be29bb7e0b4aee48c99e19c98e3a0b1e6919ce492b4e485b1e48ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606c780e3aab9e695aee58b98e1a68de0a688cba3e29786e4858ce3ae84e789afe4a398e18695e28d8be380b7e2baace4819ac298e6a488e6a39ce4a695e0adb3e19b86e298a0e48280e38681e6b5a6e6b896e482b8c5b1cb93e2b98ee4b299ce9ce695aee6bba8e4a6bde0ad9bcc9040e1a183e386b9e6a5a8e4aba8e5868de18eabe69e97e49a80e0b98be1b097dcb4e4ab9ce5b791e18dbbe19ab7e298a000e3ae87e6a5a5e4a3a4e3a6a5e3acbbe49896e2b3ace1b499e1a483e388aee6899cc384e6a1a8e798b6e2b38ee1b29de392b7e795b4e4aba4e1978de78698e68c82e49885c980e3a4bae78da1e49b90e3a685e38e9be68c90e49885e4b18bc89ae685ade5b392e4908501e58290e6b1ade5ac9de38eb4e791a8e0aba6e3a384e78681ccb2e68480e5b598e3aab1e689ade6938ae59095e0a5b1e28ba306e1b381e382b7e189a4e5b1a2e68384e185b1e18b93e49786e0b28ce1a097e2b8b4e6a9a2e0a684e58098e19996e284ade4ae8ee19c9be2b8b0e681a4e1b3a4e48c98e69896e2b78de5ac99e1a282e380aee6819ce0a084e0a098e29996e28386e0b18ce1a297e390aee5a888e29685e0adb3e18c9040e5ad82e396b2e6b9a1e69b92e1a6b5c688e28ba3e29786e4888de38ab6e685abe58b9ce3978de0a0b3e68c83e49985e0b58bc880e68885e5a388e0a6a5e0a183e18ba3e49ca6e0b38be1ae97e6b48ae5a3aae29791e68c93e39bb6e2b5ace0b280c880e6a5ade49ba6e49085e18081e381a0e2b98ce1a199e38abae38087e6a99ce482b8e285b1e58186e2b0ade5ae9ae1a280c880e6b892e69685e28e9be69bb7e6b2ade4869ce1a098e384aee6819ce3a09ce28cabe79db7e6b98de4839ae19c9830e0b080e3868ce6aeabe39c86c48ee0ae8ee19c98e2acb0e681a2e6a080e48e98e49d96e0baaee1a59ce3a0bce789a5e5ab92e3a695e0aea3e39b86e0b2aee5b49de39cb4e78da7e6888ae482b8e2a5b123e6b1a1e1ad9be39eb3e791b2e1b3a6e3a384e48689e28ba3e296a6e0ae8de19c98e2b8b0e0a1a8d6b4e78d8be18096e48086ce80e382b7e795b4e4aba4e0b78de6adbbe19c86e6b9ace4929ce19c98e3a0b1e6919ce492b4e4a5b1e78ba3e496a6e1af99e38eb9e0b9a5e48b9ce59791e2ae93e39cb6e2b7ace5b09be3a6b0cdb3e5b1a2d380e78090e49cb0e4b7aee5a19ce38ab3e695aee6bba8e4a6bde68d9be68c90d8a5e0ae8ee19a99e2b8b1e5b1ace38384e0ada8e69a96e6afade5a898e39cb0e695aecb98c384e28080e299a1e2b0aee1a59be386b2e6b5afe48ba0e5868de18ca3e79897e4b2aee1b39ce1a285e384aee5a9b0e3a390e78689cc82c8a0e5a599e39eb1e685b2e58ba8e19799e18bbbe79b86e6b1ade5b39ae1a482e384aee6819ce2a080e7ac90e19d86e2b78ce5b09ee3a8b7d9b3e5b1b0e3a380e18689e38083e0b381e1a29de382b1e6ada3e683aae4a78de0a0b1cba3e29786e0b78cd281e6bda3e5838ce0b5bde18dbbd997e498a1e0b68be1a897e388aee0b9a2e1969ce2adb3e19ca6e2b68ce4b180c480e6b488e59386e69791e4ada3e398a6e498a1e0b18be19a9ce2b8b6e5b1a0e59384e6a181e298b6e2ba8de5ac9ee384b4e38483e6819c04e4a180dcb6e6b0aee5ae9de3a4b2e38483e6819ce29080e38ca8e29997e6bcaee5af98e3a0b6e3848ce6899ce3a3a0e6a691e68c92e49aa5e0b78bd480e695aae6a392e1979de5ac8be29996e683aee0ae8ce19c98e2b8b070e580a4e18cabe19ca7e2b68ce1b49aceb4e2b8b0e1b1a0e3a4bde188aae58390e4b4ade1a99be38eb7e685a7e4bb88e58695e38e9be68c90e298a5e0ae8ce0a898e685ade5b392e3a5bde28cabe79db7e6b98de59f9ae390b1e6b9a1e4ab9cd6b1c690e480a0e4b1a1e1a19ce3a8b3e79db4e48b8ae196ade3ae93e68e90e498a5e4b18be1ae9ce6b484e58b82e196b9e78688e68c82d885e48280e38285e685abe583a6e0b6a5e7aea3e59b96e2838ce4ae8ce19a9ae380b2e5a888e29685e0adb3cc90e28280e5a681e3a4b7e695a7c886e694b9e281a2e59a97e6b98ce5b397e3a4b7e6a5b4e4bb9ce4908dc5b1e58083e0b9a0e5ac9ce3a8b4e38483e6899ce0a084e1a1b0e49bb6e6b7ade5b39ce398b0e6a1a3e69b8ae4b791e0a0abcba3e69787e48c8ce390b1e6b9a1e4ab9ce7b6b1e0adaae69a96e282ade0ae8ce19c98c4b0e0b084e1978ce2ada3e59ba6e286ace4ae8ce1b098e388aee6899ae492b8e786b9e78e92e2b780e5b499e39ebbe6adb2e6888200e28298e19ca6e0b88de1b99ce39eb6e691a1e5b392e4b69de18c9be59997e2b78ce0b181e1ac97e390aee1b086e4a68ce38c8be19d86e6b78de5b499e38abbe6ada1e0bba6e196b8e3aea3e29bb7e6b5aee0b180e1a097d080e5a892e3a6a5e1acabe19ca6e0b38ce4869de19c98e3a0b1e6919ce590a8e18db3e79997e6b4ace5b49ce3a4b2e49884e1a29ad38de18180e79997e6b4ace5b49ce3a4b2e49884e1a29ad38de68080e59d80e4b98ce1a19ce398b1e6b9a5e4ab88e48789e78688cc92e49787e4ad8ce19c98e2b8b1e5b1a0e48384c691e38680e0b7aee5a89ce3a6b4e6a5b4e48b86e19791e18ca3e39896e0b5ace5a19ce396b1e799b3e1bb90e3a384e48689e28ba3e296a6e0ae8ce19c98e2b8b4e691a2e2b080e7ada8e39d96e0b2aee5b79de382b2e78dabc886e694b9e48092e19d80e2ba8de5ae98e3aab4d5ade5b1a6e3a394e3a6b1e59ba0e6ba8ce1af9de396b9e38483e6819cd084e580a0e49896e0b2ace48d80e3a4b1e685a5e4aba8e5b791e0acabe59ab6e0b98ce0b282e1a097e380aee6899ce0a39ce2a1b0e39896e6bcaee5b697e398b4e685ace4ab8ee4b789e0a1abe18ba3e49c86e4b28be1a296e380aee6899ce1b380e2aca0e199a6e0baace5b49be1a282e380aee6819ce0a08428da97e4b2aee48c9ee19c98e3a0b1e6919ce492b4e0a5b1e58ba3c3a6e1a599e382b3e6b1b5e0aba8e3a384e78681e18c82e68080e5a981e38ab1e695a2e4bba4d08de4a9b215e0b381e5b99be390bbe695a5d398e39098e78c8be49d86e4b2ade0b181e1b297e388aee0b9aee196b8e3aea3e29bb7e2b5aee0b18000e69489e5bb86e3b6b1e4acbbe398b6e282aee4ae8ce19c9bc8b3e6888ad795e5ae93e381b6e49786e4ad8ce1aa99d0b8e48b9ae3a6a5e0a08be28083c680e5a19ee3a4b2e6b5afe5b392e396a5cc8be281b7e49986e4b18be19c98d0b1e48b9ae3a6a5e0a09bcba326c680e392b8e781a7e5b38ae68095c5b1e18ba3e28186e5a682e3a6b0e689b4e5b38ae2868de380abcba3e49786e4878ce390b1e6b9a1e4ab9ce196b1e786a0e68da2e29885e48280e3a084e6b1afe5abb2e4a6bde48e83e182b6e29786e0b88ce1a497e380ade6a19ce18390e0ada8e69a96e280ad0cd480e795a1e5bba8e19789e68cbbe29a96e2838ce4ae8ce19a9be38cb5e1b084e5878ce18dbbe79897e0b2ace5b299e3aeb0e789a5e0b3a6e48384e185b1e18ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606cc80e398b3e7a1b5e4ab9ce5b791e18dbbe39ab7e683aee0ae8de19c98e2b8b770e3a0a8e7acabe39ba6e2b98ce1a698e1a4bae38883e6919ce28088e78ca8e29996e2b1aee1ac99ceb6e2b8b0e1b1a0e3a4bde3a8aae59ba0e6ba8ce1af9de396b9e38085e6819ce482b8e18081e18290e0b88ce5ac9ce3a6b2e6a5abe1a39ce3a388e786a1e38c82e6b6a5e0b198e1a297d0b8e78ba6e0b6b9e0a08be18093e485a0e1a599e3a4b9e791a9e49b8ae4a6bde18cabe583a0e0b7ade1b599e382b6e789b2e6ab9ee19791e1ae93e18287e29787e4ae8ce19a98e38cb9e5a898e29685e7adb3d8b5e4b0ade5ae9be398b2e3888100e4a190e38cabe69a96e0b2ade1b399e39ebae685b2e4ab8ee18685e7aca3e39ba6c2aee0ae8ce19c9c32e5b894e19781e68db3e19bb6e2b28ce1b299e1a283e2b8b2e5b1a0e0a384e28188e59a87e4aface5a19de398bae185b4e5b1a2e68384e185b1e28b93d786e4ae8ce1a098e3a0aee789ace3a09ce28cabe79db7e6b98dc69ae19c98e398b2e6819cd080e6a2a8e49bb6e4b2ace5ae9ce392bae698bae6ab98e3a7a1e28cabe79db7e6b98de5b39ae1ae81e39cb000" + "e0ba8b0000c484e4a0b0e18e9be19997e2baaee1b399e392bae7a5a6e6908ae4a2b8c5b1e380a3e2b1a1e1a39ee39eb6e78db0e5bb86e19789e0a0b3e" + "18ba3e49aa6e0b18be38686e685a8e5b39ce38695e6abbbe19896e2b78de0b181e1a097e380ae02d098e2aeabe19987e2b7ade0b181e1a097e38caee1" + "b880e59684e4af83e19b86e4b0ade1b99ce398b1e68dafe69b96e490b5e0a5b1e68e83e29985e0b08be1a097e384aed1a8e4b1a0ceabe29997e2b6aee" + "1b298e392bae6b9aae6a1ace0b388e78dbbe199a6e0b3ade1a99bcab1e2b8b1e5b1a2e38398e4ae98e39ba7e6aface1af98e38cb7e69da9cba6c384e4" + "a090e49890e0b2ade5b39ee39eb6e78da2e6888ce492b8e78781e48da2e2b6a1e1a998e2beb7e6a1a3e5b382e196b9e0ada3cc90e48080e1a184e386b" + "9e6a5a8e4aba8e5868de7ae9be19c85e2b68ce1b499e38abae38485e6899ce4a2b8e48081e198b0e2b3ace5b299e3aab4e0b1ade5b1a2e68384e185b1" + "e18b93e29786e0ae8c18e6b48ae6bb86e2979de28db3e79bb6e2b9aee0b281e1a097e38caee28884e3b78ce48e83e39a96e2ba8ee5a39ae3a8b0e691a" + "5e5bb86e19789e0a28be18ba3e49c86e4b28be1a096e394aee6999ce3a388e3a689e78e93e0b1a0e1a19ae39cb7e6b1a5e6888200e280b8e59a87e2b9" + "8ce1a19bd0b6e2b8b1e5b1ace3a38ce48691e380a3e4b981e5b499e39eb7e78dace48b84e1978de0a193e18ba3e29c86e0b38be1a097e3a4aee69096e" + "58699e7adbbe39b86e2b18ee5b398c6b2e2b8b1c9a0e48080e78d88e49a96e2b4aee5ac98e39cb4e695b6e6a39ce4a6bde2af8be68da0e49885e0b88b" + "dc81e789a9e5b39ee1969de2adb3e19ca6e6ba8ce5b29bcab9e2b8b2e5b1a0e3a384e18d88e69bb7e2b3ade5ae99e3a4b2e791a1e6939ed78dc688e58" + "0a0e2bc81e1a598e39eb9e6bdb7e5a3a4e39691cc8be181a7e49786e0b58ce1a297e6b484e58b82e0b6b9e78688e18c8240e5a385e39eb7e6a5abe4bb" + "9ce3b699e18e93e79b86e6b1ade5a89ae382b2e78da4e6888ce3a388e78681e78ca2e2b780e5b499e39ebbe6adb2e68886e482b8e0a081e382b0e4b7a" + "ce1b49be39eb9e6b1ace5b392e0a69de480a0e59ba7e4ba8ce0b182e1a297e2b4b8e5b1a8e3a380e286a9e69e80e0b2ade4839de19c98c4b0e0b884e3" + "8780e1ac8be29996e2b7ace0b681e1a897e384aee6808ed6b1e2ac9be798a6e282ade0ae8ce19c98c4b0e0b884e2968ce0aea3e59986e4b68ce0b181e" + "1a297e2b8b1e1a1a6d6b4e78d8be397b6e2b48ce1ae98e38ab7c5ac62e19080e7ae80e19db6e4b48ce0b382e1a097e384aee4919ae58695cc8be28290" + "e6b7ace5ab9be390b9e6b1a5e0bb8ce4b384e185b1e58ba3d886c980e39eb6e791afe4ab84e39685e38e9be68c90d8a5e4ae8ec498e78c96e6839ee29" + "6a1e28e9be39a97e0b0ace1a59de384b2e68da1e68396e0b685e1ad9be184a7e29786e0b88ce1a497e38cade6899ce3a3a0e2a699e78ba3e49aa6e487" + "8ce390b1e6b9a1e4ab9cd6b1c688e58080e6ba80e5a99de3a6b3e38493e6899ce582b8c5a9e49897e0b1aee4b19ae1a295e384aee5b1b0e0a388e181b" + "8e19d96e0b68de1a999e38eb7e685a7e4bb88e58695e48e9be68cb1e698a5e0ae8ce19a98e795a2e5a392e3a691e5a6a9e39b92e498ace0b18be19c9c" + "e7b4b2e5a888e29685e0adb3cd80e28080e5a482e3a4b0e795abe58ba8e4b6b1e0a0b3e68c83e49885e0b58bd080e68dade4a3aee3b6bde1ae93e1819" + "7d786e0ae8c1be79c87e4a382e38691e1acabe18397e29786e0b88ce1a497e380ade7819ce492b8e18789e584a0e6b2ade1a19ae392b7e6b5b3e4ab8e" + "e196b9e0ae93e79d86e6b98de4869ce1a098e388aee6a99ce39188e5acabe69896e6b4ade5ad9ce38ab3e695aee48ba4e3b791e1ae93e181a7e49886e" + "0b28be1aa9700e49088e38685e3adabe68cb0e49985e4b08be1a095d483e48baee386a5e58c8be59ba0e6ba8ce1af9de396b9e6b9a9e0ab8ee3a384e7" + "8681e18c82e68080e5aa82e3a4b2e78da5e6ab9ee0b789e1acabc2a7e29786e0b48ce1a297e384aee689aee38084e68c98e49bb6e6b48ee5a397e39cb" + "7e6a5a6d38ee4b0b8e2ad83e19d86e0b88de5a99ae39cb0e6bda3e4aba4e4b09de0a5b1e68c83d8a5e48c8ce382b6e6b9a9e49abed6a1e78db3e49996" + "e282ade0ae8ce19c9830e18884e59690e6adabe59b96e2b6ade1b99be1a285e384aee5a9b0e3a384e786a9e48ca2e2b281e5ad9de3b2b6e6a1a3e5b38" + "2e196b9e0ada3cc90e68180e5b383e3a0bae6b1b0e5ab8ae3a695e0aea3e19ca6e6b2ade48d9ce19c98e3a0b1e6919ce492b4e2a5b1e18ba3e699a6e5" + "ae81e3a8b2e6bdb7e59ba4e49085e18081e283a0e4b2aee1a999e38ab7e78da4e5bba8d789e2acbbe181a6e29786e0b08ce1a497e6b48ce58b82e7b6b" + "9e48c9ae69896e2b78de5ac99e1a28000e59890e3a6bde18d9be49997e2b2aee0b181e1a697e38caee1a080d694e4ae9bd7b7e6b4aee5ac99e39cb4e0" + "b1b3e5b1a2e68384e185b1e18b93d786e0ae8cc498e68c86e6939ee4b781e68cabe68c90d8a5e0ae8ee19a99e2b8b1e5b1a0e1b388e2aca0e199a6e0b" + "aace5b49be1a282e380aee6819cd08440e39897e2b5ace1a59be3aab7e0a880e49b9ae0a79de4ae93e79986e6b2acc59ce19c99e2b8b066e580ace18d" + "bbd8b7e2b6ade1b398e38abad9b2e781a2e492b8c5b1e38083e6b1a1e1ad9be3a4b8e78da5e58ba6e39795e0a2b3e48ba3e49786e0ad8ce3aab1e6b1a" + "9e5b388e2b3a4e1ada9e68c96d8a5e0ae8ec499e78084e5b392e2a69de78688cc92e296a7e0ae8ce19c9ce0b0b0e58ba0e1b6b9e1abbbe19a86e4b78c" + "e1a59bcab6e4a590e0ba9cd385e68090e29a90e4b7aee5a69be3a4bae685aee4ab86e1978de78698e68cb2d8a5e1a985e39eb9e699aee693aad6b9e2a" + "c9be79cb6e2b78be5b499e39ebbe6adb2e68886e482b809e582b0e6b1ade1b49de3a0b9e6bda4e6939ee1978de78688e68c82db85e48980e386b6e699" + "b7e5b38ae1968de2ae9be68c90e49885e0b58be0ac80e795b3e4aba0e39789e18c8be19d87e4b58de0b69be1a49ae6bda3e4aba4e296b1e38c93e68c9" + "0e49885e4b18b1ce78c8be5ab92e38781e68f8be79a96e0b48ce4959de19c98e3a0b1e6919ce492b4e285b1e28ba3e496a6e5b598e398b4e2b9a4e689" + "a6e1b088e7ac90e19d86e2b78ce1a19ae1a285e384aee5b1b0e39388e1a6a1e48d83e2b6a0e1a998c2b730e19880e296a0e48cbbe19b86e0b3ade5b49" + "ae3a4b2e48483e38a9ce19085ce98e29897e4b5aee48680e3aab1e6a5b2e69b9ee490b9e0a5b1e68e83e29985e0b58be1a097e39caee6899ce39090e4" + "ac8be19ba6d8a0e48280e3a084e791a1e58386e596bde4ada3e182b6e29786e0b88ce1a497e39cade5b1a2e18384e0ada8e69a96e280ad0ccc81e685a" + "3e4ab9ad789e0a1a3e18ba3e49c86e4b28be1a296e380aee6a19ce1809ce38cabe59896e0b68ee4859de19c98e2b8b0c9a0e3a080e68c90e39bb6e6b5" + "ace1a198e3a0b9e6b9a5e693a8e2a7a5e78688cc92d6a7e4ae8ce19c9930e6a0a4e196a1e6ae93e49896e4afade5af99e39cbae685a4e58ba8e3a6bde" + "0a183e68ba3e69786e0ae8ce1b099e18480e583a8e4a695e0adabe79b86e0b2abe5b09ee39cb0e6a5b3e5b39ee490a1e385b1e38ba3e29786e0b38cd6" + "81e6a5ace5b384e3a6bde6af8be59bb6e2b9aee0b281e1a297e380aee4988ed6a1e78db3e49996e281ade0ae8cc298e0a882e5a38ae5a695e28c8be29" + "bb7e0b4aee48c99e19c98e3a0b1e6919ce492b4e485b1e48ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606c780e3aab9e695aee58b" + "98e1a68de0a688cba3e29786e4858ce3ae84e789afe4a398e18695e28d8be380b7e2baace4819ac298e6a488e6a39ce4a695e0adb3e19b86e298a0e48" + "280e38681e6b5a6e6b896e482b8c5b1cb93e2b98ee4b299ce9ce695aee6bba8e4a6bde0ad9bcc9040e1a183e386b9e6a5a8e4aba8e5868de18eabe69e" + "97e49a80e0b98be1b097dcb4e4ab9ce5b791e18dbbe19ab7e298a000e3ae87e6a5a5e4a3a4e3a6a5e3acbbe49896e2b3ace1b499e1a483e388aee6899" + "cc384e6a1a8e798b6e2b38ee1b29de392b7e795b4e4aba4e1978de78698e68c82e49885c980e3a4bae78da1e49b90e3a685e38e9be68c90e49885e4b1" + "8bc89ae685ade5b392e4908501e58290e6b1ade5ac9de38eb4e791a8e0aba6e3a384e78681ccb2e68480e5b598e3aab1e689ade6938ae59095e0a5b1e" + "28ba306e1b381e382b7e189a4e5b1a2e68384e185b1e18b93e49786e0b28ce1a097e2b8b4e6a9a2e0a684e58098e19996e284ade4ae8ee19c9be2b8b0" + "e681a4e1b3a4e48c98e69896e2b78de5ac99e1a282e380aee6819ce0a084e0a098e29996e28386e0b18ce1a297e390aee5a888e29685e0adb3e18c904" + "0e5ad82e396b2e6b9a1e69b92e1a6b5c688e28ba3e29786e4888de38ab6e685abe58b9ce3978de0a0b3e68c83e49985e0b58bc880e68885e5a388e0a6" + "a5e0a183e18ba3e49ca6e0b38be1ae97e6b48ae5a3aae29791e68c93e39bb6e2b5ace0b280c880e6a5ade49ba6e49085e18081e381a0e2b98ce1a199e" + "38abae38087e6a99ce482b8e285b1e58186e2b0ade5ae9ae1a280c880e6b892e69685e28e9be69bb7e6b2ade4869ce1a098e384aee6819ce3a09ce28c" + "abe79db7e6b98de4839ae19c9830e0b080e3868ce6aeabe39c86c48ee0ae8ee19c98e2acb0e681a2e6a080e48e98e49d96e0baaee1a59ce3a0bce789a" + "5e5ab92e3a695e0aea3e39b86e0b2aee5b49de39cb4e78da7e6888ae482b8e2a5b123e6b1a1e1ad9be39eb3e791b2e1b3a6e3a384e48689e28ba3e296" + "a6e0ae8de19c98e2b8b0e0a1a8d6b4e78d8be18096e48086ce80e382b7e795b4e4aba4e0b78de6adbbe19c86e6b9ace4929ce19c98e3a0b1e6919ce49" + "2b4e4a5b1e78ba3e496a6e1af99e38eb9e0b9a5e48b9ce59791e2ae93e39cb6e2b7ace5b09be3a6b0cdb3e5b1a2d380e78090e49cb0e4b7aee5a19ce3" + "8ab3e695aee6bba8e4a6bde68d9be68c90d8a5e0ae8ee19a99e2b8b1e5b1ace38384e0ada8e69a96e6afade5a898e39cb0e695aecb98c384e28080e29" + "9a1e2b0aee1a59be386b2e6b5afe48ba0e5868de18ca3e79897e4b2aee1b39ce1a285e384aee5a9b0e3a390e78689cc82c8a0e5a599e39eb1e685b2e5" + "8ba8e19799e18bbbe79b86e6b1ade5b39ae1a482e384aee6819ce2a080e7ac90e19d86e2b78ce5b09ee3a8b7d9b3e5b1b0e3a380e18689e38083e0b38" + "1e1a29de382b1e6ada3e683aae4a78de0a0b1cba3e29786e0b78cd281e6bda3e5838ce0b5bde18dbbd997e498a1e0b68be1a897e388aee0b9a2e1969c" + "e2adb3e19ca6e2b68ce4b180c480e6b488e59386e69791e4ada3e398a6e498a1e0b18be19a9ce2b8b6e5b1a0e59384e6a181e298b6e2ba8de5ac9ee38" + "4b4e38483e6819c04e4a180dcb6e6b0aee5ae9de3a4b2e38483e6819ce29080e38ca8e29997e6bcaee5af98e3a0b6e3848ce6899ce3a3a0e6a691e68c" + "92e49aa5e0b78bd480e695aae6a392e1979de5ac8be29996e683aee0ae8ce19c98e2b8b070e580a4e18cabe19ca7e2b68ce1b49aceb4e2b8b0e1b1a0e" + "3a4bde188aae58390e4b4ade1a99be38eb7e685a7e4bb88e58695e38e9be68c90e298a5e0ae8ce0a898e685ade5b392e3a5bde28cabe79db7e6b98de5" + "9f9ae390b1e6b9a1e4ab9cd6b1c690e480a0e4b1a1e1a19ce3a8b3e79db4e48b8ae196ade3ae93e68e90e498a5e4b18be1ae9ce6b484e58b82e196b9e" + "78688e68c82d885e48280e38285e685abe583a6e0b6a5e7aea3e59b96e2838ce4ae8ce19a9ae380b2e5a888e29685e0adb3cc90e28280e5a681e3a4b7" + "e695a7c886e694b9e281a2e59a97e6b98ce5b397e3a4b7e6a5b4e4bb9ce4908dc5b1e58083e0b9a0e5ac9ce3a8b4e38483e6899ce0a084e1a1b0e49bb" + "6e6b7ade5b39ce398b0e6a1a3e69b8ae4b791e0a0abcba3e69787e48c8ce390b1e6b9a1e4ab9ce7b6b1e0adaae69a96e282ade0ae8ce19c98c4b0e0b0" + "84e1978ce2ada3e59ba6e286ace4ae8ce1b098e388aee6899ae492b8e786b9e78e92e2b780e5b499e39ebbe6adb2e6888200e28298e19ca6e0b88de1b" + "99ce39eb6e691a1e5b392e4b69de18c9be59997e2b78ce0b181e1ac97e390aee1b086e4a68ce38c8be19d86e6b78de5b499e38abbe6ada1e0bba6e196" + "b8e3aea3e29bb7e6b5aee0b180e1a097d080e5a892e3a6a5e1acabe19ca6e0b38ce4869de19c98e3a0b1e6919ce590a8e18db3e79997e6b4ace5b49ce" + "3a4b2e49884e1a29ad38de18180e79997e6b4ace5b49ce3a4b2e49884e1a29ad38de68080e59d80e4b98ce1a19ce398b1e6b9a5e4ab88e48789e78688" + "cc92e49787e4ad8ce19c98e2b8b1e5b1a0e48384c691e38680e0b7aee5a89ce3a6b4e6a5b4e48b86e19791e18ca3e39896e0b5ace5a19ce396b1e799b" + "3e1bb90e3a384e48689e28ba3e296a6e0ae8ce19c98e2b8b4e691a2e2b080e7ada8e39d96e0b2aee5b79de382b2e78dabc886e694b9e48092e19d80e2" + "ba8de5ae98e3aab4d5ade5b1a6e3a394e3a6b1e59ba0e6ba8ce1af9de396b9e38483e6819cd084e580a0e49896e0b2ace48d80e3a4b1e685a5e4aba8e" + "5b791e0acabe59ab6e0b98ce0b282e1a097e380aee6899ce0a39ce2a1b0e39896e6bcaee5b697e398b4e685ace4ab8ee4b789e0a1abe18ba3e49c86e4" + "b28be1a296e380aee6899ce1b380e2aca0e199a6e0baace5b49be1a282e380aee6819ce0a08428da97e4b2aee48c9ee19c98e3a0b1e6919ce492b4e0a" + "5b1e58ba3c3a6e1a599e382b3e6b1b5e0aba8e3a384e78681e18c82e68080e5a981e38ab1e695a2e4bba4d08de4a9b215e0b381e5b99be390bbe695a5" + "d398e39098e78c8be49d86e4b2ade0b181e1b297e388aee0b9aee196b8e3aea3e29bb7e2b5aee0b18000e69489e5bb86e3b6b1e4acbbe398b6e282aee" + "4ae8ce19c9bc8b3e6888ad795e5ae93e381b6e49786e4ad8ce1aa99d0b8e48b9ae3a6a5e0a08be28083c680e5a19ee3a4b2e6b5afe5b392e396a5cc8b" + "e281b7e49986e4b18be19c98d0b1e48b9ae3a6a5e0a09bcba326c680e392b8e781a7e5b38ae68095c5b1e18ba3e28186e5a682e3a6b0e689b4e5b38ae" + "2868de380abcba3e49786e4878ce390b1e6b9a1e4ab9ce196b1e786a0e68da2e29885e48280e3a084e6b1afe5abb2e4a6bde48e83e182b6e29786e0b8" + "8ce1a497e380ade6a19ce18390e0ada8e69a96e280ad0cd480e795a1e5bba8e19789e68cbbe29a96e2838ce4ae8ce19a9be38cb5e1b084e5878ce18db" + "be79897e0b2ace5b299e3aeb0e789a5e0b3a6e48384e185b1e18ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606cc80e398b3e7a1b5" + "e4ab9ce5b791e18dbbe39ab7e683aee0ae8de19c98e2b8b770e3a0a8e7acabe39ba6e2b98ce1a698e1a4bae38883e6919ce28088e78ca8e29996e2b1a" + "ee1ac99ceb6e2b8b0e1b1a0e3a4bde3a8aae59ba0e6ba8ce1af9de396b9e38085e6819ce482b8e18081e18290e0b88ce5ac9ce3a6b2e6a5abe1a39ce3" + "a388e786a1e38c82e6b6a5e0b198e1a297d0b8e78ba6e0b6b9e0a08be18093e485a0e1a599e3a4b9e791a9e49b8ae4a6bde18cabe583a0e0b7ade1b59" + "9e382b6e789b2e6ab9ee19791e1ae93e18287e29787e4ae8ce19a98e38cb9e5a898e29685e7adb3d8b5e4b0ade5ae9be398b2e3888100e4a190e38cab" + "e69a96e0b2ade1b399e39ebae685b2e4ab8ee18685e7aca3e39ba6c2aee0ae8ce19c9c32e5b894e19781e68db3e19bb6e2b28ce1b299e1a283e2b8b2e" + "5b1a0e0a384e28188e59a87e4aface5a19de398bae185b4e5b1a2e68384e185b1e28b93d786e4ae8ce1a098e3a0aee789ace3a09ce28cabe79db7e6b9" + "8dc69ae19c98e398b2e6819cd080e6a2a8e49bb6e4b2ace5ae9ce392bae698bae6ab98e3a7a1e28cabe79db7e6b98de5b39ae1ae81e39cb000" ).decode("utf-8") @@ -14,7 +108,70 @@ def test_forge_data_build() -> None: def test_decode_optimized() -> None: buffer = decode_optimized(ENCODED_STRING) assert buffer.received == bytearray.fromhex( - "000082000c72737265717565737469667905322e322e30020b6379636c6f7073636f726506312e31352e310c6368616e6e656c5f6d61696e05312e302e3001000661757564696f05312e302e33000f617578696c69617279626c6f636b730d312e31382e322d302e302e3134021873757065726d617274696a6e363432636f6e6669676c696205312e312e360c73796e635f636f6e666967730131000209616c6578736d6f627306312e31382e360c6d61696e5f6368616e6e656c0131000012617263686974656374735f70616c6574746505312e312e320008636167657269756d0c312e31382e322d312e312e30000a6d637777696e646f777305322e302e330211736f7068697374696361746564636f726511312e31382e322d302e352e33322e313739076368616e6e656c0131000007746865726d616c08312e362e332e3238020b7266746f6f6c73626173650a312e31382d332e302e390b7266746f6f6c736261736503312e30010010696e697469616c696e76656e746f727905362e302e38020e69726f6e67656e657261746f727305322e302e310e69726f6e67656e657261746f7273013100020d786165726f776f726c646d617006312e32352e31046d61696e03312e30010214636f6f6b696e67666f72626c6f636b68656164730631322e302e32076e6574776f726b03312e3000010b636f6e74726f6c6c696e670204786e65740a312e31382d342e302e3504786e657403312e30010207706c616365626f05362e342e3107706c616365626f05312e302e300102076369746164656c06312e31312e330c6d61696e5f6368616e6e656c0131000005706f7761680a332e302e312d626574610009626f6f6b7368656c660731332e322e353000096c6f6f746265616d7306312e31382e310216736f70686973746963617465646261636b7061636b7312312e31382e322d332e31382e33352e373532076368616e6e656c0131000005747769677313312e312e342d7061746368312b312e31382e32020f6275696c64696e676761646765747318332e31332e302d6275696c642e352b6d63312e31382e327d046d61696e01340000096461726b7574696c730631302e302e3500086d6377646f6f727305312e302e360007776164646c65730d312e31382e322d302e382e313902126d656b616e69736d67656e657261746f72730631302e322e35126d656b616e69736d67656e657261746f72730631302e322e3500000462616c6d07332e322e302b3003057761696c610a6e6574776f726b696e6705312e302e3001000b6a657265736f75726365730a302e31342e312e313731010c636c6f74685f636f6e666967020e7368657469706869616e636f726507332e31302e31300c6d61696e5f6368616e6e656c05312e302e3000020964756d6d6d6d6d6d790a312e31382d312e352e320c64756d6d796368616e6e656c013100020f737570706c656d656e7461726965730d312e31382e322d312e352e3133076e6574776f726b013100020e726566696e656473746f7261676506312e31302e320c6d61696e5f6368616e6e656c01310000086b6f6e6b7265746505312e332e33000c656173795f7069676c696e730c312e31382e322d312e302e300206636f727073650c312e31382e322d312e302e320764656661756c7405312e302e300101087061636b6d656e75000a6d63776272696467657305322e302e33000b746f7263686d61737465720631382e312e30000b636f6d707265737369756d16312e342e322d6275696c642e392b6d63312e31382e32020470696e670a312e31382d312e382e300c70696e675f6368616e6e656c0550494e473101020c69726f6e6675726e6163657305332e332e311469726f6e6675726e616365735f6e6574776f726b03312e3001000b6d6377747270646f6f727305312e302e3600096d637766656e63657305312e302e35001673757065726d617274696a6e363432636f72656c696206312e302e3139000b73696d706c796c6967687415312e31382e322d312e342e322d6275696c642e33310207626f74616e69610a312e31382e322d343334046d61696e013000000b686967686c69676874657203414e590105737061726b0206637572696f730e312e31382e322d352e302e372e31046d61696e013100020970617463686f756c690b312e31382e322d37312e31046d61696e013100020663616d6572610c312e31382e322d312e302e340764656661756c7405312e302e3001000e626c6f636b63617270656e7472790a312e31382d302e332e300012746865726d616c5f666f756e646174696f6e08312e362e332e32380011746865726d616c5f657870616e73696f6e08312e362e332e3133020b6c69626e6f6e796d6f757305322e312e30076368616e6e656c03312e3001020a656c657661746f7269640c312e31382e322d312e382e340c6d61696e5f6368616e6e656c013100000772756e656c69630631312e302e310509776f726c64656469740363756901310108696e7465726e616c013101020363666d0b372e302e302d7072653239076e6574776f726b013100020c61726368697465637475727906342e392e3834076e6574776f726b013101000e7765697264696e6767616467657406322e322e3131000d6d63776675726e69747572657305332e302e300209747261736863616e7306312e302e3135046d61696e01310000096d63776c696768747305312e302e330008637563756d62657205352e312e320004736e616412312e31382e322d312e32322e30342e31356102036a656909392e372e302e323039076368616e6e656c05312e302e300102036165320631312e312e34046d61696e01310102086d656b616e69736d0631302e322e35086d656b616e69736d0631302e322e3500040562646c696208312e31392e332e370a6d756c7469626c6f636b013200046d697363013100020663726561746507302e352e302e64046d61696e013100020977617973746f6e65730631302e312e30076e6574776f726b03312e30000006636c756d707308382e302e302b3130001a7368757475706578706572696d656e74616c73657474696e677305312e302e350208636f6d666f7274730e312e31382e322d352e302e302e34046d61696e013100020e6e617475726573636f6d7061737312312e31382e322d312e392e372d666f7267650e6e617475726573636f6d7061737303312e3001020e73746f726167656e6574776f726b0c312e31382e322d312e362e310c6d61696e5f6368616e6e656c01310000146672616d6564636f6d70616374647261776572730a312e31382d342e312e3000116465636f7261746976655f626c6f636b7305322e312e30000a626f74616e79706f747306382e302e3132000b6674626261636b7570733206312e302e31370209636f66685f636f726508312e362e342e32310767656e6572616c01310102086d636a74796c69620b312e31382d362e302e3135086d636a74796c696203312e3001000869737061776e657203312e3000096576657279636f6d700c312e31382e322d312e352e37000a6a6569747765616b657207332e302e302e38000974657272616c69746807302e304e4f4e45020d6d696e696e676761646765747306312e31312e30146d61696e5f6e6574776f726b5f6368616e6e656c013200020c6372616674747765616b657207392e312e313937046d61696e05312e302e3000020b616b6173686963746f6d6506312e352d3230046d61696e0131000405666f72676503414e590c746965725f736f7274696e6703312e30000573706c697403312e3101020e636f6c6f7373616c63686573747305312e382e330c6368616e6e656c5f6d61696e05312e302e3001020673656c656e650d312e31382e322d312e31372e39076e6574776f726b01310000136472697070796c6f6164696e6773637265656e05312e362e34030e6372616674696e67747765616b73076e6574776f726b03312e300004096d696e65637261667406312e31382e320a756e726567697374657204464d4c330108726567697374657204464d4c3301000c7465727261626c656e64657210312e31382e322d312e312e302e3130320018736f70686973746963617465646261636b7061636b7376680f312e31382e322d312e302e342e3132000b6d6f757365747765616b7303414e590208746974616e69756d05332e352e36076e6574776f726b03312e300101046a616465000d637265617465747765616b657208322e302e302e3137020e656173795f76696c6c61676572730d312e31382e322d312e302e31300764656661756c7405312e302e30010205706970657a0c312e31382e322d312e312e350764656661756c7405312e302e300100076963656265726703414e590108666c79776865656c02066d616e746c6506312e392e3237076e6574776f726b013100000965636f6c6f6769637305312e372e330205717561726b07332e322d333538046d61696e013100020c786165726f6d696e696d61700732322e31312e31046d61696e03312e3001000670696770656e05382e302e3102096661737462656e636805362e302e32076368616e6e656c05342e362e30010209706f6c796d6f7270680b312e31382e322d302e3434046d61696e013100000a6175746f7265676c696206312e372d3533020e73746f72616765647261776572730631302e322e310c6d61696e5f6368616e6e656c013100000c666c75786e6574776f726b7307372e302e372e38000a6e656f6e63726166743203322e320208656e657263656c6c07302e304e4f4e45076e6574776f726b05302e302e300002096170706c65736b696e0c322e342e302b6d63312e31380473796e63013101010b66657272697465636f7265020e6d6f64756c6172726f757465727308392e312e312d39330c6d61696e5f6368616e6e656c0132000014726566696e656473746f726167656164646f6e7305302e382e32000a6f70656e6c6f616465720631322e302e3102097468655f7661756c7411312e31382e322d322e302e31302e383639076e6574776f726b06302e32362e300001156d6f6465726e75693a666c75786e6574776f726b730337303700" + "000082000c72737265717565737469667905322e322e30020b6379636c6f7073636f726506312e31352e310c6368616e6e656c5f6d61696e05312" + "e302e3001000661757564696f05312e302e33000f617578696c69617279626c6f636b730d312e31382e322d302e302e3134021873757065726d61" + "7274696a6e363432636f6e6669676c696205312e312e360c73796e635f636f6e666967730131000209616c6578736d6f627306312e31382e360c6" + "d61696e5f6368616e6e656c0131000012617263686974656374735f70616c6574746505312e312e320008636167657269756d0c312e31382e322d" + "312e312e30000a6d637777696e646f777305322e302e330211736f7068697374696361746564636f726511312e31382e322d302e352e33322e313" + "739076368616e6e656c0131000007746865726d616c08312e362e332e3238020b7266746f6f6c73626173650a312e31382d332e302e390b726674" + "6f6f6c736261736503312e30010010696e697469616c696e76656e746f727905362e302e38020e69726f6e67656e657261746f727305322e302e3" + "10e69726f6e67656e657261746f7273013100020d786165726f776f726c646d617006312e32352e31046d61696e03312e30010214636f6f6b696e" + "67666f72626c6f636b68656164730631322e302e32076e6574776f726b03312e3000010b636f6e74726f6c6c696e670204786e65740a312e31382" + "d342e302e3504786e657403312e30010207706c616365626f05362e342e3107706c616365626f05312e302e300102076369746164656c06312e31" + "312e330c6d61696e5f6368616e6e656c0131000005706f7761680a332e302e312d626574610009626f6f6b7368656c660731332e322e353000096" + "c6f6f746265616d7306312e31382e310216736f70686973746963617465646261636b7061636b7312312e31382e322d332e31382e33352e373532" + "076368616e6e656c0131000005747769677313312e312e342d7061746368312b312e31382e32020f6275696c64696e676761646765747318332e3" + "1332e302d6275696c642e352b6d63312e31382e327d046d61696e01340000096461726b7574696c730631302e302e3500086d6377646f6f727305" + "312e302e360007776164646c65730d312e31382e322d302e382e313902126d656b616e69736d67656e657261746f72730631302e322e35126d656" + "b616e69736d67656e657261746f72730631302e322e3500000462616c6d07332e322e302b3003057761696c610a6e6574776f726b696e6705312e" + "302e3001000b6a657265736f75726365730a302e31342e312e313731010c636c6f74685f636f6e666967020e7368657469706869616e636f72650" + "7332e31302e31300c6d61696e5f6368616e6e656c05312e302e3000020964756d6d6d6d6d6d790a312e31382d312e352e320c64756d6d79636861" + "6e6e656c013100020f737570706c656d656e7461726965730d312e31382e322d312e352e3133076e6574776f726b013100020e726566696e65647" + "3746f7261676506312e31302e320c6d61696e5f6368616e6e656c01310000086b6f6e6b7265746505312e332e33000c656173795f7069676c696e" + "730c312e31382e322d312e302e300206636f727073650c312e31382e322d312e302e320764656661756c7405312e302e300101087061636b6d656" + "e75000a6d63776272696467657305322e302e33000b746f7263686d61737465720631382e312e30000b636f6d707265737369756d16312e342e32" + "2d6275696c642e392b6d63312e31382e32020470696e670a312e31382d312e382e300c70696e675f6368616e6e656c0550494e473101020c69726" + "f6e6675726e6163657305332e332e311469726f6e6675726e616365735f6e6574776f726b03312e3001000b6d6377747270646f6f727305312e30" + "2e3600096d637766656e63657305312e302e35001673757065726d617274696a6e363432636f72656c696206312e302e3139000b73696d706c796" + "c6967687415312e31382e322d312e342e322d6275696c642e33310207626f74616e69610a312e31382e322d343334046d61696e013000000b6869" + "67686c69676874657203414e590105737061726b0206637572696f730e312e31382e322d352e302e372e31046d61696e013100020970617463686" + "f756c690b312e31382e322d37312e31046d61696e013100020663616d6572610c312e31382e322d312e302e340764656661756c7405312e302e30" + "01000e626c6f636b63617270656e7472790a312e31382d302e332e300012746865726d616c5f666f756e646174696f6e08312e362e332e3238001" + "1746865726d616c5f657870616e73696f6e08312e362e332e3133020b6c69626e6f6e796d6f757305322e312e30076368616e6e656c03312e3001" + "020a656c657661746f7269640c312e31382e322d312e382e340c6d61696e5f6368616e6e656c013100000772756e656c69630631312e302e31050" + "9776f726c64656469740363756901310108696e7465726e616c013101020363666d0b372e302e302d7072653239076e6574776f726b013100020c" + "61726368697465637475727906342e392e3834076e6574776f726b013101000e7765697264696e6767616467657406322e322e3131000d6d63776" + "675726e69747572657305332e302e300209747261736863616e7306312e302e3135046d61696e01310000096d63776c696768747305312e302e33" + "0008637563756d62657205352e312e320004736e616412312e31382e322d312e32322e30342e31356102036a656909392e372e302e32303907636" + "8616e6e656c05312e302e300102036165320631312e312e34046d61696e01310102086d656b616e69736d0631302e322e35086d656b616e69736d" + "0631302e322e3500040562646c696208312e31392e332e370a6d756c7469626c6f636b013200046d697363013100020663726561746507302e352" + "e302e64046d61696e013100020977617973746f6e65730631302e312e30076e6574776f726b03312e30000006636c756d707308382e302e302b31" + "30001a7368757475706578706572696d656e74616c73657474696e677305312e302e350208636f6d666f7274730e312e31382e322d352e302e302" + "e34046d61696e013100020e6e617475726573636f6d7061737312312e31382e322d312e392e372d666f7267650e6e617475726573636f6d706173" + "7303312e3001020e73746f726167656e6574776f726b0c312e31382e322d312e362e310c6d61696e5f6368616e6e656c01310000146672616d656" + "4636f6d70616374647261776572730a312e31382d342e312e3000116465636f7261746976655f626c6f636b7305322e312e30000a626f74616e79" + "706f747306382e302e3132000b6674626261636b7570733206312e302e31370209636f66685f636f726508312e362e342e32310767656e6572616" + "c01310102086d636a74796c69620b312e31382d362e302e3135086d636a74796c696203312e3001000869737061776e657203312e300009657665" + "7279636f6d700c312e31382e322d312e352e37000a6a6569747765616b657207332e302e302e38000974657272616c69746807302e304e4f4e450" + "20d6d696e696e676761646765747306312e31312e30146d61696e5f6e6574776f726b5f6368616e6e656c013200020c6372616674747765616b65" + "7207392e312e313937046d61696e05312e302e3000020b616b6173686963746f6d6506312e352d3230046d61696e0131000405666f72676503414" + "e590c746965725f736f7274696e6703312e30000573706c697403312e3101020e636f6c6f7373616c63686573747305312e382e330c6368616e6e" + "656c5f6d61696e05312e302e3001020673656c656e650d312e31382e322d312e31372e39076e6574776f726b01310000136472697070796c6f616" + "4696e6773637265656e05312e362e34030e6372616674696e67747765616b73076e6574776f726b03312e300004096d696e65637261667406312e" + "31382e320a756e726567697374657204464d4c330108726567697374657204464d4c3301000c7465727261626c656e64657210312e31382e322d3" + "12e312e302e3130320018736f70686973746963617465646261636b7061636b7376680f312e31382e322d312e302e342e3132000b6d6f75736574" + "7765616b7303414e590208746974616e69756d05332e352e36076e6574776f726b03312e300101046a616465000d637265617465747765616b657" + "208322e302e302e3137020e656173795f76696c6c61676572730d312e31382e322d312e302e31300764656661756c7405312e302e300102057069" + "70657a0c312e31382e322d312e312e350764656661756c7405312e302e300100076963656265726703414e590108666c79776865656c02066d616" + "e746c6506312e392e3237076e6574776f726b013100000965636f6c6f6769637305312e372e330205717561726b07332e322d333538046d61696e" + "013100020c786165726f6d696e696d61700732322e31312e31046d61696e03312e3001000670696770656e05382e302e3102096661737462656e6" + "36805362e302e32076368616e6e656c05342e362e30010209706f6c796d6f7270680b312e31382e322d302e3434046d61696e013100000a617574" + "6f7265676c696206312e372d3533020e73746f72616765647261776572730631302e322e310c6d61696e5f6368616e6e656c013100000c666c757" + "86e6574776f726b7307372e302e372e38000a6e656f6e63726166743203322e320208656e657263656c6c07302e304e4f4e45076e6574776f726b" + "05302e302e300002096170706c65736b696e0c322e342e302b6d63312e31380473796e63013101010b66657272697465636f7265020e6d6f64756" + "c6172726f757465727308392e312e312d39330c6d61696e5f6368616e6e656c0132000014726566696e656473746f726167656164646f6e730530" + "2e382e32000a6f70656e6c6f616465720631322e302e3102097468655f7661756c7411312e31382e322d322e302e31302e383639076e6574776f7" + "26b06302e32362e300001156d6f6465726e75693a666c75786e6574776f726b730337303700" ) From 9d1b799514a4ee6f9b055c40656b2ddf90e42195 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 16:05:12 -0500 Subject: [PATCH 19/67] Fix line too long after formatting --- tests/status_response/test_java.py | 233 +++++++++++++++-------------- 1 file changed, 119 insertions(+), 114 deletions(-) diff --git a/tests/status_response/test_java.py b/tests/status_response/test_java.py index 39d37f14..07c32fc0 100644 --- a/tests/status_response/test_java.py +++ b/tests/status_response/test_java.py @@ -526,120 +526,125 @@ def build(self): "channels": [], "d": ( bytes.fromhex( - "e0ba8b0000c484e4a0b0e18e9be19997e2baaee1b399e392bae7a5a6e6908ae4a2b8c5b1e380a3e2b1a1e1a39ee39eb6e78db" - "0e5bb86e19789e0a0b3e18ba3e49aa6e0b18be38686e685a8e5b39ce38695e6abbbe19896e2b78de0b181e1a097e380ae02d0" - "98e2aeabe19987e2b7ade0b181e1a097e38caee1b880e59684e4af83e19b86e4b0ade1b99ce398b1e68dafe69b96e490b5e0a" - "5b1e68e83e29985e0b08be1a097e384aed1a8e4b1a0ceabe29997e2b6aee1b298e392bae6b9aae6a1ace0b388e78dbbe199a6" - "e0b3ade1a99bcab1e2b8b1e5b1a2e38398e4ae98e39ba7e6aface1af98e38cb7e69da9cba6c384e4a090e49890e0b2ade5b39" - "ee39eb6e78da2e6888ce492b8e78781e48da2e2b6a1e1a998e2beb7e6a1a3e5b382e196b9e0ada3cc90e48080e1a184e386b9" - "e6a5a8e4aba8e5868de7ae9be19c85e2b68ce1b499e38abae38485e6899ce4a2b8e48081e198b0e2b3ace5b299e3aab4e0b1a" - "de5b1a2e68384e185b1e18b93e29786e0ae8c18e6b48ae6bb86e2979de28db3e79bb6e2b9aee0b281e1a097e38caee28884e3" - "b78ce48e83e39a96e2ba8ee5a39ae3a8b0e691a5e5bb86e19789e0a28be18ba3e49c86e4b28be1a096e394aee6999ce3a388e" - "3a689e78e93e0b1a0e1a19ae39cb7e6b1a5e6888200e280b8e59a87e2b98ce1a19bd0b6e2b8b1e5b1ace3a38ce48691e380a3" - "e4b981e5b499e39eb7e78dace48b84e1978de0a193e18ba3e29c86e0b38be1a097e3a4aee69096e58699e7adbbe39b86e2b18" - "ee5b398c6b2e2b8b1c9a0e48080e78d88e49a96e2b4aee5ac98e39cb4e695b6e6a39ce4a6bde2af8be68da0e49885e0b88bdc" - "81e789a9e5b39ee1969de2adb3e19ca6e6ba8ce5b29bcab9e2b8b2e5b1a0e3a384e18d88e69bb7e2b3ade5ae99e3a4b2e791a" - "1e6939ed78dc688e580a0e2bc81e1a598e39eb9e6bdb7e5a3a4e39691cc8be181a7e49786e0b58ce1a297e6b484e58b82e0b6" - "b9e78688e18c8240e5a385e39eb7e6a5abe4bb9ce3b699e18e93e79b86e6b1ade5a89ae382b2e78da4e6888ce3a388e78681e" - "78ca2e2b780e5b499e39ebbe6adb2e68886e482b8e0a081e382b0e4b7ace1b49be39eb9e6b1ace5b392e0a69de480a0e59ba7" - "e4ba8ce0b182e1a297e2b4b8e5b1a8e3a380e286a9e69e80e0b2ade4839de19c98c4b0e0b884e38780e1ac8be29996e2b7ace" - "0b681e1a897e384aee6808ed6b1e2ac9be798a6e282ade0ae8ce19c98c4b0e0b884e2968ce0aea3e59986e4b68ce0b181e1a2" - "97e2b8b1e1a1a6d6b4e78d8be397b6e2b48ce1ae98e38ab7c5ac62e19080e7ae80e19db6e4b48ce0b382e1a097e384aee4919" - "ae58695cc8be28290e6b7ace5ab9be390b9e6b1a5e0bb8ce4b384e185b1e58ba3d886c980e39eb6e791afe4ab84e39685e38e" - "9be68c90d8a5e4ae8ec498e78c96e6839ee296a1e28e9be39a97e0b0ace1a59de384b2e68da1e68396e0b685e1ad9be184a7e" - "29786e0b88ce1a497e38cade6899ce3a3a0e2a699e78ba3e49aa6e4878ce390b1e6b9a1e4ab9cd6b1c688e58080e6ba80e5a9" - "9de3a6b3e38493e6899ce582b8c5a9e49897e0b1aee4b19ae1a295e384aee5b1b0e0a388e181b8e19d96e0b68de1a999e38eb" - "7e685a7e4bb88e58695e48e9be68cb1e698a5e0ae8ce19a98e795a2e5a392e3a691e5a6a9e39b92e498ace0b18be19c9ce7b4" - "b2e5a888e29685e0adb3cd80e28080e5a482e3a4b0e795abe58ba8e4b6b1e0a0b3e68c83e49885e0b58bd080e68dade4a3aee" - "3b6bde1ae93e18197d786e0ae8c1be79c87e4a382e38691e1acabe18397e29786e0b88ce1a497e380ade7819ce492b8e18789" - "e584a0e6b2ade1a19ae392b7e6b5b3e4ab8ee196b9e0ae93e79d86e6b98de4869ce1a098e388aee6a99ce39188e5acabe6989" - "6e6b4ade5ad9ce38ab3e695aee48ba4e3b791e1ae93e181a7e49886e0b28be1aa9700e49088e38685e3adabe68cb0e49985e4" - "b08be1a095d483e48baee386a5e58c8be59ba0e6ba8ce1af9de396b9e6b9a9e0ab8ee3a384e78681e18c82e68080e5aa82e3a" - "4b2e78da5e6ab9ee0b789e1acabc2a7e29786e0b48ce1a297e384aee689aee38084e68c98e49bb6e6b48ee5a397e39cb7e6a5" - "a6d38ee4b0b8e2ad83e19d86e0b88de5a99ae39cb0e6bda3e4aba4e4b09de0a5b1e68c83d8a5e48c8ce382b6e6b9a9e49abed" - "6a1e78db3e49996e282ade0ae8ce19c9830e18884e59690e6adabe59b96e2b6ade1b99be1a285e384aee5a9b0e3a384e786a9" - "e48ca2e2b281e5ad9de3b2b6e6a1a3e5b382e196b9e0ada3cc90e68180e5b383e3a0bae6b1b0e5ab8ae3a695e0aea3e19ca6e" - "6b2ade48d9ce19c98e3a0b1e6919ce492b4e2a5b1e18ba3e699a6e5ae81e3a8b2e6bdb7e59ba4e49085e18081e283a0e4b2ae" - "e1a999e38ab7e78da4e5bba8d789e2acbbe181a6e29786e0b08ce1a497e6b48ce58b82e7b6b9e48c9ae69896e2b78de5ac99e" - "1a28000e59890e3a6bde18d9be49997e2b2aee0b181e1a697e38caee1a080d694e4ae9bd7b7e6b4aee5ac99e39cb4e0b1b3e5" - "b1a2e68384e185b1e18b93d786e0ae8cc498e68c86e6939ee4b781e68cabe68c90d8a5e0ae8ee19a99e2b8b1e5b1a0e1b388e" - "2aca0e199a6e0baace5b49be1a282e380aee6819cd08440e39897e2b5ace1a59be3aab7e0a880e49b9ae0a79de4ae93e79986" - "e6b2acc59ce19c99e2b8b066e580ace18dbbd8b7e2b6ade1b398e38abad9b2e781a2e492b8c5b1e38083e6b1a1e1ad9be3a4b" - "8e78da5e58ba6e39795e0a2b3e48ba3e49786e0ad8ce3aab1e6b1a9e5b388e2b3a4e1ada9e68c96d8a5e0ae8ec499e78084e5" - "b392e2a69de78688cc92e296a7e0ae8ce19c9ce0b0b0e58ba0e1b6b9e1abbbe19a86e4b78ce1a59bcab6e4a590e0ba9cd385e" - "68090e29a90e4b7aee5a69be3a4bae685aee4ab86e1978de78698e68cb2d8a5e1a985e39eb9e699aee693aad6b9e2ac9be79c" - "b6e2b78be5b499e39ebbe6adb2e68886e482b809e582b0e6b1ade1b49de3a0b9e6bda4e6939ee1978de78688e68c82db85e48" - "980e386b6e699b7e5b38ae1968de2ae9be68c90e49885e0b58be0ac80e795b3e4aba0e39789e18c8be19d87e4b58de0b69be1" - "a49ae6bda3e4aba4e296b1e38c93e68c90e49885e4b18b1ce78c8be5ab92e38781e68f8be79a96e0b48ce4959de19c98e3a0b" - "1e6919ce492b4e285b1e28ba3e496a6e5b598e398b4e2b9a4e689a6e1b088e7ac90e19d86e2b78ce1a19ae1a285e384aee5b1" - "b0e39388e1a6a1e48d83e2b6a0e1a998c2b730e19880e296a0e48cbbe19b86e0b3ade5b49ae3a4b2e48483e38a9ce19085ce9" - "8e29897e4b5aee48680e3aab1e6a5b2e69b9ee490b9e0a5b1e68e83e29985e0b58be1a097e39caee6899ce39090e4ac8be19b" - "a6d8a0e48280e3a084e791a1e58386e596bde4ada3e182b6e29786e0b88ce1a497e39cade5b1a2e18384e0ada8e69a96e280a" - "d0ccc81e685a3e4ab9ad789e0a1a3e18ba3e49c86e4b28be1a296e380aee6a19ce1809ce38cabe59896e0b68ee4859de19c98" - "e2b8b0c9a0e3a080e68c90e39bb6e6b5ace1a198e3a0b9e6b9a5e693a8e2a7a5e78688cc92d6a7e4ae8ce19c9930e6a0a4e19" - "6a1e6ae93e49896e4afade5af99e39cbae685a4e58ba8e3a6bde0a183e68ba3e69786e0ae8ce1b099e18480e583a8e4a695e0" - "adabe79b86e0b2abe5b09ee39cb0e6a5b3e5b39ee490a1e385b1e38ba3e29786e0b38cd681e6a5ace5b384e3a6bde6af8be59" - "bb6e2b9aee0b281e1a297e380aee4988ed6a1e78db3e49996e281ade0ae8cc298e0a882e5a38ae5a695e28c8be29bb7e0b4ae" - "e48c99e19c98e3a0b1e6919ce492b4e485b1e48ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606c780e3aab" - "9e695aee58b98e1a68de0a688cba3e29786e4858ce3ae84e789afe4a398e18695e28d8be380b7e2baace4819ac298e6a488e6" - "a39ce4a695e0adb3e19b86e298a0e48280e38681e6b5a6e6b896e482b8c5b1cb93e2b98ee4b299ce9ce695aee6bba8e4a6bde" - "0ad9bcc9040e1a183e386b9e6a5a8e4aba8e5868de18eabe69e97e49a80e0b98be1b097dcb4e4ab9ce5b791e18dbbe19ab7e2" - "98a000e3ae87e6a5a5e4a3a4e3a6a5e3acbbe49896e2b3ace1b499e1a483e388aee6899cc384e6a1a8e798b6e2b38ee1b29de" - "392b7e795b4e4aba4e1978de78698e68c82e49885c980e3a4bae78da1e49b90e3a685e38e9be68c90e49885e4b18bc89ae685" - "ade5b392e4908501e58290e6b1ade5ac9de38eb4e791a8e0aba6e3a384e78681ccb2e68480e5b598e3aab1e689ade6938ae59" - "095e0a5b1e28ba306e1b381e382b7e189a4e5b1a2e68384e185b1e18b93e49786e0b28ce1a097e2b8b4e6a9a2e0a684e58098" - "e19996e284ade4ae8ee19c9be2b8b0e681a4e1b3a4e48c98e69896e2b78de5ac99e1a282e380aee6819ce0a084e0a098e2999" - "6e28386e0b18ce1a297e390aee5a888e29685e0adb3e18c9040e5ad82e396b2e6b9a1e69b92e1a6b5c688e28ba3e29786e488" - "8de38ab6e685abe58b9ce3978de0a0b3e68c83e49985e0b58bc880e68885e5a388e0a6a5e0a183e18ba3e49ca6e0b38be1ae9" - "7e6b48ae5a3aae29791e68c93e39bb6e2b5ace0b280c880e6a5ade49ba6e49085e18081e381a0e2b98ce1a199e38abae38087" - "e6a99ce482b8e285b1e58186e2b0ade5ae9ae1a280c880e6b892e69685e28e9be69bb7e6b2ade4869ce1a098e384aee6819ce" - "3a09ce28cabe79db7e6b98de4839ae19c9830e0b080e3868ce6aeabe39c86c48ee0ae8ee19c98e2acb0e681a2e6a080e48e98" - "e49d96e0baaee1a59ce3a0bce789a5e5ab92e3a695e0aea3e39b86e0b2aee5b49de39cb4e78da7e6888ae482b8e2a5b123e6b" - "1a1e1ad9be39eb3e791b2e1b3a6e3a384e48689e28ba3e296a6e0ae8de19c98e2b8b0e0a1a8d6b4e78d8be18096e48086ce80" - "e382b7e795b4e4aba4e0b78de6adbbe19c86e6b9ace4929ce19c98e3a0b1e6919ce492b4e4a5b1e78ba3e496a6e1af99e38eb" - "9e0b9a5e48b9ce59791e2ae93e39cb6e2b7ace5b09be3a6b0cdb3e5b1a2d380e78090e49cb0e4b7aee5a19ce38ab3e695aee6" - "bba8e4a6bde68d9be68c90d8a5e0ae8ee19a99e2b8b1e5b1ace38384e0ada8e69a96e6afade5a898e39cb0e695aecb98c384e" - "28080e299a1e2b0aee1a59be386b2e6b5afe48ba0e5868de18ca3e79897e4b2aee1b39ce1a285e384aee5a9b0e3a390e78689" - "cc82c8a0e5a599e39eb1e685b2e58ba8e19799e18bbbe79b86e6b1ade5b39ae1a482e384aee6819ce2a080e7ac90e19d86e2b" - "78ce5b09ee3a8b7d9b3e5b1b0e3a380e18689e38083e0b381e1a29de382b1e6ada3e683aae4a78de0a0b1cba3e29786e0b78c" - "d281e6bda3e5838ce0b5bde18dbbd997e498a1e0b68be1a897e388aee0b9a2e1969ce2adb3e19ca6e2b68ce4b180c480e6b48" - "8e59386e69791e4ada3e398a6e498a1e0b18be19a9ce2b8b6e5b1a0e59384e6a181e298b6e2ba8de5ac9ee384b4e38483e681" - "9c04e4a180dcb6e6b0aee5ae9de3a4b2e38483e6819ce29080e38ca8e29997e6bcaee5af98e3a0b6e3848ce6899ce3a3a0e6a" - "691e68c92e49aa5e0b78bd480e695aae6a392e1979de5ac8be29996e683aee0ae8ce19c98e2b8b070e580a4e18cabe19ca7e2" - "b68ce1b49aceb4e2b8b0e1b1a0e3a4bde188aae58390e4b4ade1a99be38eb7e685a7e4bb88e58695e38e9be68c90e298a5e0a" - "e8ce0a898e685ade5b392e3a5bde28cabe79db7e6b98de59f9ae390b1e6b9a1e4ab9cd6b1c690e480a0e4b1a1e1a19ce3a8b3" - "e79db4e48b8ae196ade3ae93e68e90e498a5e4b18be1ae9ce6b484e58b82e196b9e78688e68c82d885e48280e38285e685abe" - "583a6e0b6a5e7aea3e59b96e2838ce4ae8ce19a9ae380b2e5a888e29685e0adb3cc90e28280e5a681e3a4b7e695a7c886e694" - "b9e281a2e59a97e6b98ce5b397e3a4b7e6a5b4e4bb9ce4908dc5b1e58083e0b9a0e5ac9ce3a8b4e38483e6899ce0a084e1a1b" - "0e49bb6e6b7ade5b39ce398b0e6a1a3e69b8ae4b791e0a0abcba3e69787e48c8ce390b1e6b9a1e4ab9ce7b6b1e0adaae69a96" - "e282ade0ae8ce19c98c4b0e0b084e1978ce2ada3e59ba6e286ace4ae8ce1b098e388aee6899ae492b8e786b9e78e92e2b780e" - "5b499e39ebbe6adb2e6888200e28298e19ca6e0b88de1b99ce39eb6e691a1e5b392e4b69de18c9be59997e2b78ce0b181e1ac" - "97e390aee1b086e4a68ce38c8be19d86e6b78de5b499e38abbe6ada1e0bba6e196b8e3aea3e29bb7e6b5aee0b180e1a097d08" - "0e5a892e3a6a5e1acabe19ca6e0b38ce4869de19c98e3a0b1e6919ce590a8e18db3e79997e6b4ace5b49ce3a4b2e49884e1a2" - "9ad38de18180e79997e6b4ace5b49ce3a4b2e49884e1a29ad38de68080e59d80e4b98ce1a19ce398b1e6b9a5e4ab88e48789e" - "78688cc92e49787e4ad8ce19c98e2b8b1e5b1a0e48384c691e38680e0b7aee5a89ce3a6b4e6a5b4e48b86e19791e18ca3e398" - "96e0b5ace5a19ce396b1e799b3e1bb90e3a384e48689e28ba3e296a6e0ae8ce19c98e2b8b4e691a2e2b080e7ada8e39d96e0b" - "2aee5b79de382b2e78dabc886e694b9e48092e19d80e2ba8de5ae98e3aab4d5ade5b1a6e3a394e3a6b1e59ba0e6ba8ce1af9d" - "e396b9e38483e6819cd084e580a0e49896e0b2ace48d80e3a4b1e685a5e4aba8e5b791e0acabe59ab6e0b98ce0b282e1a097e" - "380aee6899ce0a39ce2a1b0e39896e6bcaee5b697e398b4e685ace4ab8ee4b789e0a1abe18ba3e49c86e4b28be1a296e380ae" - "e6899ce1b380e2aca0e199a6e0baace5b49be1a282e380aee6819ce0a08428da97e4b2aee48c9ee19c98e3a0b1e6919ce492b" - "4e0a5b1e58ba3c3a6e1a599e382b3e6b1b5e0aba8e3a384e78681e18c82e68080e5a981e38ab1e695a2e4bba4d08de4a9b215" - "e0b381e5b99be390bbe695a5d398e39098e78c8be49d86e4b2ade0b181e1b297e388aee0b9aee196b8e3aea3e29bb7e2b5aee" - "0b18000e69489e5bb86e3b6b1e4acbbe398b6e282aee4ae8ce19c9bc8b3e6888ad795e5ae93e381b6e49786e4ad8ce1aa99d0" - "b8e48b9ae3a6a5e0a08be28083c680e5a19ee3a4b2e6b5afe5b392e396a5cc8be281b7e49986e4b18be19c98d0b1e48b9ae3a" - "6a5e0a09bcba326c680e392b8e781a7e5b38ae68095c5b1e18ba3e28186e5a682e3a6b0e689b4e5b38ae2868de380abcba3e4" - "9786e4878ce390b1e6b9a1e4ab9ce196b1e786a0e68da2e29885e48280e3a084e6b1afe5abb2e4a6bde48e83e182b6e29786e" - "0b88ce1a497e380ade6a19ce18390e0ada8e69a96e280ad0cd480e795a1e5bba8e19789e68cbbe29a96e2838ce4ae8ce19a9b" - "e38cb5e1b084e5878ce18dbbe79897e0b2ace5b299e3aeb0e789a5e0b3a6e48384e185b1e18ba3e28686e5a19be39cb4e68d9" - "fe48b90e3a6b9e68cabe1809606cc80e398b3e7a1b5e4ab9ce5b791e18dbbe39ab7e683aee0ae8de19c98e2b8b770e3a0a8e7" - "acabe39ba6e2b98ce1a698e1a4bae38883e6919ce28088e78ca8e29996e2b1aee1ac99ceb6e2b8b0e1b1a0e3a4bde3a8aae59" - "ba0e6ba8ce1af9de396b9e38085e6819ce482b8e18081e18290e0b88ce5ac9ce3a6b2e6a5abe1a39ce3a388e786a1e38c82e6" - "b6a5e0b198e1a297d0b8e78ba6e0b6b9e0a08be18093e485a0e1a599e3a4b9e791a9e49b8ae4a6bde18cabe583a0e0b7ade1b" - "599e382b6e789b2e6ab9ee19791e1ae93e18287e29787e4ae8ce19a98e38cb9e5a898e29685e7adb3d8b5e4b0ade5ae9be398" - "b2e3888100e4a190e38cabe69a96e0b2ade1b399e39ebae685b2e4ab8ee18685e7aca3e39ba6c2aee0ae8ce19c9c32e5b894e" - "19781e68db3e19bb6e2b28ce1b299e1a283e2b8b2e5b1a0e0a384e28188e59a87e4aface5a19de398bae185b4e5b1a2e68384" - "e185b1e28b93d786e4ae8ce1a098e3a0aee789ace3a09ce28cabe79db7e6b98dc69ae19c98e398b2e6819cd080e6a2a8e49bb" - "6e4b2ace5ae9ce392bae698bae6ab98e3a7a1e28cabe79db7e6b98de5b39ae1ae81e39cb000" + "e0ba8b0000c484e4a0b0e18e9be19997e2baaee1b399e392bae7a5a6e6908ae4a2b8c5b1e380a3e2b1a1e1a39ee39eb6e" + "78db0e5bb86e19789e0a0b3e18ba3e49aa6e0b18be38686e685a8e5b39ce38695e6abbbe19896e2b78de0b181e1a097e3" + "80ae02d098e2aeabe19987e2b7ade0b181e1a097e38caee1b880e59684e4af83e19b86e4b0ade1b99ce398b1e68dafe69" + "b96e490b5e0a5b1e68e83e29985e0b08be1a097e384aed1a8e4b1a0ceabe29997e2b6aee1b298e392bae6b9aae6a1ace0" + "b388e78dbbe199a6e0b3ade1a99bcab1e2b8b1e5b1a2e38398e4ae98e39ba7e6aface1af98e38cb7e69da9cba6c384e4a" + "090e49890e0b2ade5b39ee39eb6e78da2e6888ce492b8e78781e48da2e2b6a1e1a998e2beb7e6a1a3e5b382e196b9e0ad" + "a3cc90e48080e1a184e386b9e6a5a8e4aba8e5868de7ae9be19c85e2b68ce1b499e38abae38485e6899ce4a2b8e48081e" + "198b0e2b3ace5b299e3aab4e0b1ade5b1a2e68384e185b1e18b93e29786e0ae8c18e6b48ae6bb86e2979de28db3e79bb6" + "e2b9aee0b281e1a097e38caee28884e3b78ce48e83e39a96e2ba8ee5a39ae3a8b0e691a5e5bb86e19789e0a28be18ba3e" + "49c86e4b28be1a096e394aee6999ce3a388e3a689e78e93e0b1a0e1a19ae39cb7e6b1a5e6888200e280b8e59a87e2b98c" + "e1a19bd0b6e2b8b1e5b1ace3a38ce48691e380a3e4b981e5b499e39eb7e78dace48b84e1978de0a193e18ba3e29c86e0b" + "38be1a097e3a4aee69096e58699e7adbbe39b86e2b18ee5b398c6b2e2b8b1c9a0e48080e78d88e49a96e2b4aee5ac98e3" + "9cb4e695b6e6a39ce4a6bde2af8be68da0e49885e0b88bdc81e789a9e5b39ee1969de2adb3e19ca6e6ba8ce5b29bcab9e" + "2b8b2e5b1a0e3a384e18d88e69bb7e2b3ade5ae99e3a4b2e791a1e6939ed78dc688e580a0e2bc81e1a598e39eb9e6bdb7" + "e5a3a4e39691cc8be181a7e49786e0b58ce1a297e6b484e58b82e0b6b9e78688e18c8240e5a385e39eb7e6a5abe4bb9ce" + "3b699e18e93e79b86e6b1ade5a89ae382b2e78da4e6888ce3a388e78681e78ca2e2b780e5b499e39ebbe6adb2e68886e4" + "82b8e0a081e382b0e4b7ace1b49be39eb9e6b1ace5b392e0a69de480a0e59ba7e4ba8ce0b182e1a297e2b4b8e5b1a8e3a" + "380e286a9e69e80e0b2ade4839de19c98c4b0e0b884e38780e1ac8be29996e2b7ace0b681e1a897e384aee6808ed6b1e2" + "ac9be798a6e282ade0ae8ce19c98c4b0e0b884e2968ce0aea3e59986e4b68ce0b181e1a297e2b8b1e1a1a6d6b4e78d8be" + "397b6e2b48ce1ae98e38ab7c5ac62e19080e7ae80e19db6e4b48ce0b382e1a097e384aee4919ae58695cc8be28290e6b7" + "ace5ab9be390b9e6b1a5e0bb8ce4b384e185b1e58ba3d886c980e39eb6e791afe4ab84e39685e38e9be68c90d8a5e4ae8" + "ec498e78c96e6839ee296a1e28e9be39a97e0b0ace1a59de384b2e68da1e68396e0b685e1ad9be184a7e29786e0b88ce1" + "a497e38cade6899ce3a3a0e2a699e78ba3e49aa6e4878ce390b1e6b9a1e4ab9cd6b1c688e58080e6ba80e5a99de3a6b3e" + "38493e6899ce582b8c5a9e49897e0b1aee4b19ae1a295e384aee5b1b0e0a388e181b8e19d96e0b68de1a999e38eb7e685" + "a7e4bb88e58695e48e9be68cb1e698a5e0ae8ce19a98e795a2e5a392e3a691e5a6a9e39b92e498ace0b18be19c9ce7b4b" + "2e5a888e29685e0adb3cd80e28080e5a482e3a4b0e795abe58ba8e4b6b1e0a0b3e68c83e49885e0b58bd080e68dade4a3" + "aee3b6bde1ae93e18197d786e0ae8c1be79c87e4a382e38691e1acabe18397e29786e0b88ce1a497e380ade7819ce492b" + "8e18789e584a0e6b2ade1a19ae392b7e6b5b3e4ab8ee196b9e0ae93e79d86e6b98de4869ce1a098e388aee6a99ce39188" + "e5acabe69896e6b4ade5ad9ce38ab3e695aee48ba4e3b791e1ae93e181a7e49886e0b28be1aa9700e49088e38685e3ada" + "be68cb0e49985e4b08be1a095d483e48baee386a5e58c8be59ba0e6ba8ce1af9de396b9e6b9a9e0ab8ee3a384e78681e1" + "8c82e68080e5aa82e3a4b2e78da5e6ab9ee0b789e1acabc2a7e29786e0b48ce1a297e384aee689aee38084e68c98e49bb" + "6e6b48ee5a397e39cb7e6a5a6d38ee4b0b8e2ad83e19d86e0b88de5a99ae39cb0e6bda3e4aba4e4b09de0a5b1e68c83d8" + "a5e48c8ce382b6e6b9a9e49abed6a1e78db3e49996e282ade0ae8ce19c9830e18884e59690e6adabe59b96e2b6ade1b99" + "be1a285e384aee5a9b0e3a384e786a9e48ca2e2b281e5ad9de3b2b6e6a1a3e5b382e196b9e0ada3cc90e68180e5b383e3" + "a0bae6b1b0e5ab8ae3a695e0aea3e19ca6e6b2ade48d9ce19c98e3a0b1e6919ce492b4e2a5b1e18ba3e699a6e5ae81e3a" + "8b2e6bdb7e59ba4e49085e18081e283a0e4b2aee1a999e38ab7e78da4e5bba8d789e2acbbe181a6e29786e0b08ce1a497" + "e6b48ce58b82e7b6b9e48c9ae69896e2b78de5ac99e1a28000e59890e3a6bde18d9be49997e2b2aee0b181e1a697e38ca" + "ee1a080d694e4ae9bd7b7e6b4aee5ac99e39cb4e0b1b3e5b1a2e68384e185b1e18b93d786e0ae8cc498e68c86e6939ee4" + "b781e68cabe68c90d8a5e0ae8ee19a99e2b8b1e5b1a0e1b388e2aca0e199a6e0baace5b49be1a282e380aee6819cd0844" + "0e39897e2b5ace1a59be3aab7e0a880e49b9ae0a79de4ae93e79986e6b2acc59ce19c99e2b8b066e580ace18dbbd8b7e2" + "b6ade1b398e38abad9b2e781a2e492b8c5b1e38083e6b1a1e1ad9be3a4b8e78da5e58ba6e39795e0a2b3e48ba3e49786e" + "0ad8ce3aab1e6b1a9e5b388e2b3a4e1ada9e68c96d8a5e0ae8ec499e78084e5b392e2a69de78688cc92e296a7e0ae8ce1" + "9c9ce0b0b0e58ba0e1b6b9e1abbbe19a86e4b78ce1a59bcab6e4a590e0ba9cd385e68090e29a90e4b7aee5a69be3a4bae" + "685aee4ab86e1978de78698e68cb2d8a5e1a985e39eb9e699aee693aad6b9e2ac9be79cb6e2b78be5b499e39ebbe6adb2" + "e68886e482b809e582b0e6b1ade1b49de3a0b9e6bda4e6939ee1978de78688e68c82db85e48980e386b6e699b7e5b38ae" + "1968de2ae9be68c90e49885e0b58be0ac80e795b3e4aba0e39789e18c8be19d87e4b58de0b69be1a49ae6bda3e4aba4e2" + "96b1e38c93e68c90e49885e4b18b1ce78c8be5ab92e38781e68f8be79a96e0b48ce4959de19c98e3a0b1e6919ce492b4e" + "285b1e28ba3e496a6e5b598e398b4e2b9a4e689a6e1b088e7ac90e19d86e2b78ce1a19ae1a285e384aee5b1b0e39388e1" + "a6a1e48d83e2b6a0e1a998c2b730e19880e296a0e48cbbe19b86e0b3ade5b49ae3a4b2e48483e38a9ce19085ce98e2989" + "7e4b5aee48680e3aab1e6a5b2e69b9ee490b9e0a5b1e68e83e29985e0b58be1a097e39caee6899ce39090e4ac8be19ba6" + "d8a0e48280e3a084e791a1e58386e596bde4ada3e182b6e29786e0b88ce1a497e39cade5b1a2e18384e0ada8e69a96e28" + "0ad0ccc81e685a3e4ab9ad789e0a1a3e18ba3e49c86e4b28be1a296e380aee6a19ce1809ce38cabe59896e0b68ee4859d" + "e19c98e2b8b0c9a0e3a080e68c90e39bb6e6b5ace1a198e3a0b9e6b9a5e693a8e2a7a5e78688cc92d6a7e4ae8ce19c993" + "0e6a0a4e196a1e6ae93e49896e4afade5af99e39cbae685a4e58ba8e3a6bde0a183e68ba3e69786e0ae8ce1b099e18480" + "e583a8e4a695e0adabe79b86e0b2abe5b09ee39cb0e6a5b3e5b39ee490a1e385b1e38ba3e29786e0b38cd681e6a5ace5b" + "384e3a6bde6af8be59bb6e2b9aee0b281e1a297e380aee4988ed6a1e78db3e49996e281ade0ae8cc298e0a882e5a38ae5" + "a695e28c8be29bb7e0b4aee48c99e19c98e3a0b1e6919ce492b4e485b1e48ba3e28686e5a19be39cb4e68d9fe48b90e3a" + "6b9e68cabe1809606c780e3aab9e695aee58b98e1a68de0a688cba3e29786e4858ce3ae84e789afe4a398e18695e28d8b" + "e380b7e2baace4819ac298e6a488e6a39ce4a695e0adb3e19b86e298a0e48280e38681e6b5a6e6b896e482b8c5b1cb93e" + "2b98ee4b299ce9ce695aee6bba8e4a6bde0ad9bcc9040e1a183e386b9e6a5a8e4aba8e5868de18eabe69e97e49a80e0b9" + "8be1b097dcb4e4ab9ce5b791e18dbbe19ab7e298a000e3ae87e6a5a5e4a3a4e3a6a5e3acbbe49896e2b3ace1b499e1a48" + "3e388aee6899cc384e6a1a8e798b6e2b38ee1b29de392b7e795b4e4aba4e1978de78698e68c82e49885c980e3a4bae78d" + "a1e49b90e3a685e38e9be68c90e49885e4b18bc89ae685ade5b392e4908501e58290e6b1ade5ac9de38eb4e791a8e0aba" + "6e3a384e78681ccb2e68480e5b598e3aab1e689ade6938ae59095e0a5b1e28ba306e1b381e382b7e189a4e5b1a2e68384" + "e185b1e18b93e49786e0b28ce1a097e2b8b4e6a9a2e0a684e58098e19996e284ade4ae8ee19c9be2b8b0e681a4e1b3a4e" + "48c98e69896e2b78de5ac99e1a282e380aee6819ce0a084e0a098e29996e28386e0b18ce1a297e390aee5a888e29685e0" + "adb3e18c9040e5ad82e396b2e6b9a1e69b92e1a6b5c688e28ba3e29786e4888de38ab6e685abe58b9ce3978de0a0b3e68" + "c83e49985e0b58bc880e68885e5a388e0a6a5e0a183e18ba3e49ca6e0b38be1ae97e6b48ae5a3aae29791e68c93e39bb6" + "e2b5ace0b280c880e6a5ade49ba6e49085e18081e381a0e2b98ce1a199e38abae38087e6a99ce482b8e285b1e58186e2b" + "0ade5ae9ae1a280c880e6b892e69685e28e9be69bb7e6b2ade4869ce1a098e384aee6819ce3a09ce28cabe79db7e6b98d" + "e4839ae19c9830e0b080e3868ce6aeabe39c86c48ee0ae8ee19c98e2acb0e681a2e6a080e48e98e49d96e0baaee1a59ce" + "3a0bce789a5e5ab92e3a695e0aea3e39b86e0b2aee5b49de39cb4e78da7e6888ae482b8e2a5b123e6b1a1e1ad9be39eb3" + "e791b2e1b3a6e3a384e48689e28ba3e296a6e0ae8de19c98e2b8b0e0a1a8d6b4e78d8be18096e48086ce80e382b7e795b" + "4e4aba4e0b78de6adbbe19c86e6b9ace4929ce19c98e3a0b1e6919ce492b4e4a5b1e78ba3e496a6e1af99e38eb9e0b9a5" + "e48b9ce59791e2ae93e39cb6e2b7ace5b09be3a6b0cdb3e5b1a2d380e78090e49cb0e4b7aee5a19ce38ab3e695aee6bba" + "8e4a6bde68d9be68c90d8a5e0ae8ee19a99e2b8b1e5b1ace38384e0ada8e69a96e6afade5a898e39cb0e695aecb98c384" + "e28080e299a1e2b0aee1a59be386b2e6b5afe48ba0e5868de18ca3e79897e4b2aee1b39ce1a285e384aee5a9b0e3a390e" + "78689cc82c8a0e5a599e39eb1e685b2e58ba8e19799e18bbbe79b86e6b1ade5b39ae1a482e384aee6819ce2a080e7ac90" + "e19d86e2b78ce5b09ee3a8b7d9b3e5b1b0e3a380e18689e38083e0b381e1a29de382b1e6ada3e683aae4a78de0a0b1cba" + "3e29786e0b78cd281e6bda3e5838ce0b5bde18dbbd997e498a1e0b68be1a897e388aee0b9a2e1969ce2adb3e19ca6e2b6" + "8ce4b180c480e6b488e59386e69791e4ada3e398a6e498a1e0b18be19a9ce2b8b6e5b1a0e59384e6a181e298b6e2ba8de" + "5ac9ee384b4e38483e6819c04e4a180dcb6e6b0aee5ae9de3a4b2e38483e6819ce29080e38ca8e29997e6bcaee5af98e3" + "a0b6e3848ce6899ce3a3a0e6a691e68c92e49aa5e0b78bd480e695aae6a392e1979de5ac8be29996e683aee0ae8ce19c9" + "8e2b8b070e580a4e18cabe19ca7e2b68ce1b49aceb4e2b8b0e1b1a0e3a4bde188aae58390e4b4ade1a99be38eb7e685a7" + "e4bb88e58695e38e9be68c90e298a5e0ae8ce0a898e685ade5b392e3a5bde28cabe79db7e6b98de59f9ae390b1e6b9a1e" + "4ab9cd6b1c690e480a0e4b1a1e1a19ce3a8b3e79db4e48b8ae196ade3ae93e68e90e498a5e4b18be1ae9ce6b484e58b82" + "e196b9e78688e68c82d885e48280e38285e685abe583a6e0b6a5e7aea3e59b96e2838ce4ae8ce19a9ae380b2e5a888e29" + "685e0adb3cc90e28280e5a681e3a4b7e695a7c886e694b9e281a2e59a97e6b98ce5b397e3a4b7e6a5b4e4bb9ce4908dc5" + "b1e58083e0b9a0e5ac9ce3a8b4e38483e6899ce0a084e1a1b0e49bb6e6b7ade5b39ce398b0e6a1a3e69b8ae4b791e0a0a" + "bcba3e69787e48c8ce390b1e6b9a1e4ab9ce7b6b1e0adaae69a96e282ade0ae8ce19c98c4b0e0b084e1978ce2ada3e59b" + "a6e286ace4ae8ce1b098e388aee6899ae492b8e786b9e78e92e2b780e5b499e39ebbe6adb2e6888200e28298e19ca6e0b" + "88de1b99ce39eb6e691a1e5b392e4b69de18c9be59997e2b78ce0b181e1ac97e390aee1b086e4a68ce38c8be19d86e6b7" + "8de5b499e38abbe6ada1e0bba6e196b8e3aea3e29bb7e6b5aee0b180e1a097d080e5a892e3a6a5e1acabe19ca6e0b38ce" + "4869de19c98e3a0b1e6919ce590a8e18db3e79997e6b4ace5b49ce3a4b2e49884e1a29ad38de18180e79997e6b4ace5b4" + "9ce3a4b2e49884e1a29ad38de68080e59d80e4b98ce1a19ce398b1e6b9a5e4ab88e48789e78688cc92e49787e4ad8ce19" + "c98e2b8b1e5b1a0e48384c691e38680e0b7aee5a89ce3a6b4e6a5b4e48b86e19791e18ca3e39896e0b5ace5a19ce396b1" + "e799b3e1bb90e3a384e48689e28ba3e296a6e0ae8ce19c98e2b8b4e691a2e2b080e7ada8e39d96e0b2aee5b79de382b2e" + "78dabc886e694b9e48092e19d80e2ba8de5ae98e3aab4d5ade5b1a6e3a394e3a6b1e59ba0e6ba8ce1af9de396b9e38483" + "e6819cd084e580a0e49896e0b2ace48d80e3a4b1e685a5e4aba8e5b791e0acabe59ab6e0b98ce0b282e1a097e380aee68" + "99ce0a39ce2a1b0e39896e6bcaee5b697e398b4e685ace4ab8ee4b789e0a1abe18ba3e49c86e4b28be1a296e380aee689" + "9ce1b380e2aca0e199a6e0baace5b49be1a282e380aee6819ce0a08428da97e4b2aee48c9ee19c98e3a0b1e6919ce492b" + "4e0a5b1e58ba3c3a6e1a599e382b3e6b1b5e0aba8e3a384e78681e18c82e68080e5a981e38ab1e695a2e4bba4d08de4a9" + "b215e0b381e5b99be390bbe695a5d398e39098e78c8be49d86e4b2ade0b181e1b297e388aee0b9aee196b8e3aea3e29bb" + "7e2b5aee0b18000e69489e5bb86e3b6b1e4acbbe398b6e282aee4ae8ce19c9bc8b3e6888ad795e5ae93e381b6e49786e4" + "ad8ce1aa99d0b8e48b9ae3a6a5e0a08be28083c680e5a19ee3a4b2e6b5afe5b392e396a5cc8be281b7e49986e4b18be19" + "c98d0b1e48b9ae3a6a5e0a09bcba326c680e392b8e781a7e5b38ae68095c5b1e18ba3e28186e5a682e3a6b0e689b4e5b3" + "8ae2868de380abcba3e49786e4878ce390b1e6b9a1e4ab9ce196b1e786a0e68da2e29885e48280e3a084e6b1afe5abb2e" + "4a6bde48e83e182b6e29786e0b88ce1a497e380ade6a19ce18390e0ada8e69a96e280ad0cd480e795a1e5bba8e19789e6" + "8cbbe29a96e2838ce4ae8ce19a9be38cb5e1b084e5878ce18dbbe79897e0b2ace5b299e3aeb0e789a5e0b3a6e48384e18" + "5b1e18ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606cc80e398b3e7a1b5e4ab9ce5b791e18dbbe39a" + "b7e683aee0ae8de19c98e2b8b770e3a0a8e7acabe39ba6e2b98ce1a698e1a4bae38883e6919ce28088e78ca8e29996e2b" + "1aee1ac99ceb6e2b8b0e1b1a0e3a4bde3a8aae59ba0e6ba8ce1af9de396b9e38085e6819ce482b8e18081e18290e0b88c" + "e5ac9ce3a6b2e6a5abe1a39ce3a388e786a1e38c82e6b6a5e0b198e1a297d0b8e78ba6e0b6b9e0a08be18093e485a0e1a" + "599e3a4b9e791a9e49b8ae4a6bde18cabe583a0e0b7ade1b599e382b6e789b2e6ab9ee19791e1ae93e18287e29787e4ae" + "8ce19a98e38cb9e5a898e29685e7adb3d8b5e4b0ade5ae9be398b2e3888100e4a190e38cabe69a96e0b2ade1b399e39eb" + "ae685b2e4ab8ee18685e7aca3e39ba6c2aee0ae8ce19c9c32e5b894e19781e68db3e19bb6e2b28ce1b299e1a283e2b8b2" + "e5b1a0e0a384e28188e59a87e4aface5a19de398bae185b4e5b1a2e68384e185b1e28b93d786e4ae8ce1a098e3a0aee78" + "9ace3a09ce28cabe79db7e6b98dc69ae19c98e398b2e6819cd080e6a2a8e49bb6e4b2ace5ae9ce392bae698bae6ab98e3" + "a7a1e28cabe79db7e6b98de5b39ae1ae81e39cb000" ) ).decode("utf-8"), "fmlNetworkVersion": 3, From 720e7f7176d6da39e10235e637c193dc8e66012b Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 16:39:32 -0500 Subject: [PATCH 20/67] Apply suggestions from code review Co-authored-by: Perchun Pak --- mcstatus/forge_data.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index ccab2bc7..39de9f67 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -35,10 +35,10 @@ class ForgeDataChannel(TypedDict): class ForgeDataMod(TypedDict): modid: str modmarker: str - """Mod version""" + """Mod version.""" class RawForgeData(TypedDict): - fmlNetworkVersion: int # noqa: N815 + fmlNetworkVersion: int # noqa: N815 # camel case channels: list[ForgeDataChannel] mods: list[ForgeDataMod] d: NotRequired[str] @@ -63,9 +63,9 @@ class ForgeData: @classmethod def build(cls, raw: RawForgeData) -> Self: - """Build :class:`ForgeData` from raw response :class:`dict`. + """Build an object about Forge mods from raw response. - :param raw: Raw forge data response :class:`dict`. + :param raw: ``forgeData`` attribute in raw response :class:`dict`. :return: :class:`ForgeData` object. """ raw.setdefault("fmlNetworkVersion", 0) @@ -106,6 +106,7 @@ def read() -> int: def decode_forge_data(response: RawForgeData) -> ForgeData: """Decode the encoded forge data if it exists.""" + # see https://github.com/MinecraftForge/MinecraftForge/blob/7d0330eb08299935714e34ac651a293e2609aa86/src/main/java/net/minecraftforge/network/ServerStatusPing.java#L27-L73 if "d" not in response: return ForgeData( fml_network_version=response["fmlNetworkVersion"], From 0eb8031d4428a7bf253791e941c3290e61f4be54 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 17:06:11 -0500 Subject: [PATCH 21/67] Move some functions around and remove duplicate test coverage --- mcstatus/forge_data.py | 169 ++++++----- tests/test_forge_data.py | 593 --------------------------------------- 2 files changed, 83 insertions(+), 679 deletions(-) delete mode 100644 tests/test_forge_data.py diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 39de9f67..1dbafbbe 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -50,30 +50,6 @@ class RawForgeData(TypedDict): RawForgeData = dict -@dataclass -class ForgeData: - fml_network_version: int - """Forge Mod Loader network version.""" - channels: list[ForgeDataChannel] - """List of channels, both for mods and non-mods.""" - mods: list[ForgeDataMod] - """List of mods""" - truncated: bool - """Is the mods list and or channel list incomplete?""" - - @classmethod - def build(cls, raw: RawForgeData) -> Self: - """Build an object about Forge mods from raw response. - - :param raw: ``forgeData`` attribute in raw response :class:`dict`. - :return: :class:`ForgeData` object. - """ - raw.setdefault("fmlNetworkVersion", 0) - raw.setdefault("channels", []) - raw.setdefault("mods", []) - return decode_forge_data(raw) - - def decode_optimized(string: str) -> Connection: """Decode buffer UTF-16 optimized binary data from `string`.""" text = io.StringIO(string) @@ -103,82 +79,103 @@ def read() -> int: return buffer -def decode_forge_data(response: RawForgeData) -> ForgeData: - """Decode the encoded forge data if it exists.""" - - # see https://github.com/MinecraftForge/MinecraftForge/blob/7d0330eb08299935714e34ac651a293e2609aa86/src/main/java/net/minecraftforge/network/ServerStatusPing.java#L27-L73 - if "d" not in response: - return ForgeData( - fml_network_version=response["fmlNetworkVersion"], - channels=response["channels"], - mods=response["mods"], - truncated=False, - ) +@dataclass +class ForgeData: + fml_network_version: int + """Forge Mod Loader network version.""" + channels: list[ForgeDataChannel] + """List of channels, both for mods and non-mods.""" + mods: list[ForgeDataMod] + """List of mods""" + truncated: bool + """Is the mods list and or channel list incomplete?""" - buffer = decode_optimized(response["d"]) + @classmethod + def build(cls, raw: RawForgeData) -> Self: + """Build an object about Forge mods from raw response. - channels: list[ForgeDataChannel] = [] - mods: list[ForgeDataMod] = [] + :param raw: ``forgeData`` attribute in raw response :class:`dict`. + :return: :class:`ForgeData` object. + """ + return cls._decode_forge_data(raw) - truncated = buffer.read_bool() - mod_size = buffer.read_ushort() - try: - for _ in range(mod_size): - channel_version_flags = buffer.read_varint() + @classmethod + def _decode_forge_data(cls, response: RawForgeData) -> ForgeData: + """Decode the encoded forge data if it exists.""" + + # see https://github.com/MinecraftForge/MinecraftForge/blob/7d0330eb08299935714e34ac651a293e2609aa86/src/main/java/net/minecraftforge/network/ServerStatusPing.java#L27-L73 + if "d" not in response: + return cls( + fml_network_version=response["fmlNetworkVersion"], + channels=response["channels"], + mods=response["mods"], + truncated=False, + ) - channel_size = channel_version_flags >> 1 - is_server = channel_version_flags & VERSION_FLAG_IGNORE_SERVER_ONLY != 0 - mod_id = buffer.read_utf() + buffer = decode_optimized(response["d"]) + + channels: list[ForgeDataChannel] = [] + mods: list[ForgeDataMod] = [] + + truncated = buffer.read_bool() + mod_size = buffer.read_ushort() + try: + for _ in range(mod_size): + channel_version_flags = buffer.read_varint() + + channel_size = channel_version_flags >> 1 + is_server = channel_version_flags & VERSION_FLAG_IGNORE_SERVER_ONLY != 0 + mod_id = buffer.read_utf() + + mod_version = IGNORE_SERVER_ONLY + if not is_server: + mod_version = buffer.read_utf() + + for _ in range(channel_size): + name = buffer.read_utf() + version = buffer.read_utf() + client_required = buffer.read_bool() + channels.append( + ForgeDataChannel( + { + "res": f"{mod_id}:{name}", + "version": version, + "required": client_required, + } + ) + ) - mod_version = IGNORE_SERVER_ONLY - if not is_server: - mod_version = buffer.read_utf() + mods.append( + ForgeDataMod( + { + "modid": mod_id, + "modmarker": mod_version, + } + ) + ) - for _ in range(channel_size): - name = buffer.read_utf() + non_mod_channel_size = buffer.read_varint() + for _ in range(non_mod_channel_size): + channel_identifier = buffer.read_utf() version = buffer.read_utf() client_required = buffer.read_bool() channels.append( ForgeDataChannel( { - "res": f"{mod_id}:{name}", + "res": channel_identifier, "version": version, "required": client_required, } ) ) + except IOError: + if not truncated: + raise + # Semi-expect errors if truncated, we are missing data - mods.append( - ForgeDataMod( - { - "modid": mod_id, - "modmarker": mod_version, - } - ) - ) - - non_mod_channel_size = buffer.read_varint() - for _ in range(non_mod_channel_size): - channel_identifier = buffer.read_utf() - version = buffer.read_utf() - client_required = buffer.read_bool() - channels.append( - ForgeDataChannel( - { - "res": channel_identifier, - "version": version, - "required": client_required, - } - ) - ) - except IOError: - if not truncated: - raise - # Semi-expect errors if truncated, we are missing data - - return ForgeData( - fml_network_version=response["fmlNetworkVersion"], - channels=channels, - mods=mods, - truncated=truncated, - ) + return cls( + fml_network_version=response["fmlNetworkVersion"], + channels=channels, + mods=mods, + truncated=truncated, + ) diff --git a/tests/test_forge_data.py b/tests/test_forge_data.py deleted file mode 100644 index 5904d08e..00000000 --- a/tests/test_forge_data.py +++ /dev/null @@ -1,593 +0,0 @@ -from mcstatus.forge_data import ForgeData, decode_forge_data, decode_optimized - -ENCODED_STRING = bytes.fromhex( - "e0ba8b0000c484e4a0b0e18e9be19997e2baaee1b399e392bae7a5a6e6908ae4a2b8c5b1e380a3e2b1a1e1a39ee39eb6e78db0e5bb86e19789e0a0b3e" - "18ba3e49aa6e0b18be38686e685a8e5b39ce38695e6abbbe19896e2b78de0b181e1a097e380ae02d098e2aeabe19987e2b7ade0b181e1a097e38caee1" - "b880e59684e4af83e19b86e4b0ade1b99ce398b1e68dafe69b96e490b5e0a5b1e68e83e29985e0b08be1a097e384aed1a8e4b1a0ceabe29997e2b6aee" - "1b298e392bae6b9aae6a1ace0b388e78dbbe199a6e0b3ade1a99bcab1e2b8b1e5b1a2e38398e4ae98e39ba7e6aface1af98e38cb7e69da9cba6c384e4" - "a090e49890e0b2ade5b39ee39eb6e78da2e6888ce492b8e78781e48da2e2b6a1e1a998e2beb7e6a1a3e5b382e196b9e0ada3cc90e48080e1a184e386b" - "9e6a5a8e4aba8e5868de7ae9be19c85e2b68ce1b499e38abae38485e6899ce4a2b8e48081e198b0e2b3ace5b299e3aab4e0b1ade5b1a2e68384e185b1" - "e18b93e29786e0ae8c18e6b48ae6bb86e2979de28db3e79bb6e2b9aee0b281e1a097e38caee28884e3b78ce48e83e39a96e2ba8ee5a39ae3a8b0e691a" - "5e5bb86e19789e0a28be18ba3e49c86e4b28be1a096e394aee6999ce3a388e3a689e78e93e0b1a0e1a19ae39cb7e6b1a5e6888200e280b8e59a87e2b9" - "8ce1a19bd0b6e2b8b1e5b1ace3a38ce48691e380a3e4b981e5b499e39eb7e78dace48b84e1978de0a193e18ba3e29c86e0b38be1a097e3a4aee69096e" - "58699e7adbbe39b86e2b18ee5b398c6b2e2b8b1c9a0e48080e78d88e49a96e2b4aee5ac98e39cb4e695b6e6a39ce4a6bde2af8be68da0e49885e0b88b" - "dc81e789a9e5b39ee1969de2adb3e19ca6e6ba8ce5b29bcab9e2b8b2e5b1a0e3a384e18d88e69bb7e2b3ade5ae99e3a4b2e791a1e6939ed78dc688e58" - "0a0e2bc81e1a598e39eb9e6bdb7e5a3a4e39691cc8be181a7e49786e0b58ce1a297e6b484e58b82e0b6b9e78688e18c8240e5a385e39eb7e6a5abe4bb" - "9ce3b699e18e93e79b86e6b1ade5a89ae382b2e78da4e6888ce3a388e78681e78ca2e2b780e5b499e39ebbe6adb2e68886e482b8e0a081e382b0e4b7a" - "ce1b49be39eb9e6b1ace5b392e0a69de480a0e59ba7e4ba8ce0b182e1a297e2b4b8e5b1a8e3a380e286a9e69e80e0b2ade4839de19c98c4b0e0b884e3" - "8780e1ac8be29996e2b7ace0b681e1a897e384aee6808ed6b1e2ac9be798a6e282ade0ae8ce19c98c4b0e0b884e2968ce0aea3e59986e4b68ce0b181e" - "1a297e2b8b1e1a1a6d6b4e78d8be397b6e2b48ce1ae98e38ab7c5ac62e19080e7ae80e19db6e4b48ce0b382e1a097e384aee4919ae58695cc8be28290" - "e6b7ace5ab9be390b9e6b1a5e0bb8ce4b384e185b1e58ba3d886c980e39eb6e791afe4ab84e39685e38e9be68c90d8a5e4ae8ec498e78c96e6839ee29" - "6a1e28e9be39a97e0b0ace1a59de384b2e68da1e68396e0b685e1ad9be184a7e29786e0b88ce1a497e38cade6899ce3a3a0e2a699e78ba3e49aa6e487" - "8ce390b1e6b9a1e4ab9cd6b1c688e58080e6ba80e5a99de3a6b3e38493e6899ce582b8c5a9e49897e0b1aee4b19ae1a295e384aee5b1b0e0a388e181b" - "8e19d96e0b68de1a999e38eb7e685a7e4bb88e58695e48e9be68cb1e698a5e0ae8ce19a98e795a2e5a392e3a691e5a6a9e39b92e498ace0b18be19c9c" - "e7b4b2e5a888e29685e0adb3cd80e28080e5a482e3a4b0e795abe58ba8e4b6b1e0a0b3e68c83e49885e0b58bd080e68dade4a3aee3b6bde1ae93e1819" - "7d786e0ae8c1be79c87e4a382e38691e1acabe18397e29786e0b88ce1a497e380ade7819ce492b8e18789e584a0e6b2ade1a19ae392b7e6b5b3e4ab8e" - "e196b9e0ae93e79d86e6b98de4869ce1a098e388aee6a99ce39188e5acabe69896e6b4ade5ad9ce38ab3e695aee48ba4e3b791e1ae93e181a7e49886e" - "0b28be1aa9700e49088e38685e3adabe68cb0e49985e4b08be1a095d483e48baee386a5e58c8be59ba0e6ba8ce1af9de396b9e6b9a9e0ab8ee3a384e7" - "8681e18c82e68080e5aa82e3a4b2e78da5e6ab9ee0b789e1acabc2a7e29786e0b48ce1a297e384aee689aee38084e68c98e49bb6e6b48ee5a397e39cb" - "7e6a5a6d38ee4b0b8e2ad83e19d86e0b88de5a99ae39cb0e6bda3e4aba4e4b09de0a5b1e68c83d8a5e48c8ce382b6e6b9a9e49abed6a1e78db3e49996" - "e282ade0ae8ce19c9830e18884e59690e6adabe59b96e2b6ade1b99be1a285e384aee5a9b0e3a384e786a9e48ca2e2b281e5ad9de3b2b6e6a1a3e5b38" - "2e196b9e0ada3cc90e68180e5b383e3a0bae6b1b0e5ab8ae3a695e0aea3e19ca6e6b2ade48d9ce19c98e3a0b1e6919ce492b4e2a5b1e18ba3e699a6e5" - "ae81e3a8b2e6bdb7e59ba4e49085e18081e283a0e4b2aee1a999e38ab7e78da4e5bba8d789e2acbbe181a6e29786e0b08ce1a497e6b48ce58b82e7b6b" - "9e48c9ae69896e2b78de5ac99e1a28000e59890e3a6bde18d9be49997e2b2aee0b181e1a697e38caee1a080d694e4ae9bd7b7e6b4aee5ac99e39cb4e0" - "b1b3e5b1a2e68384e185b1e18b93d786e0ae8cc498e68c86e6939ee4b781e68cabe68c90d8a5e0ae8ee19a99e2b8b1e5b1a0e1b388e2aca0e199a6e0b" - "aace5b49be1a282e380aee6819cd08440e39897e2b5ace1a59be3aab7e0a880e49b9ae0a79de4ae93e79986e6b2acc59ce19c99e2b8b066e580ace18d" - "bbd8b7e2b6ade1b398e38abad9b2e781a2e492b8c5b1e38083e6b1a1e1ad9be3a4b8e78da5e58ba6e39795e0a2b3e48ba3e49786e0ad8ce3aab1e6b1a" - "9e5b388e2b3a4e1ada9e68c96d8a5e0ae8ec499e78084e5b392e2a69de78688cc92e296a7e0ae8ce19c9ce0b0b0e58ba0e1b6b9e1abbbe19a86e4b78c" - "e1a59bcab6e4a590e0ba9cd385e68090e29a90e4b7aee5a69be3a4bae685aee4ab86e1978de78698e68cb2d8a5e1a985e39eb9e699aee693aad6b9e2a" - "c9be79cb6e2b78be5b499e39ebbe6adb2e68886e482b809e582b0e6b1ade1b49de3a0b9e6bda4e6939ee1978de78688e68c82db85e48980e386b6e699" - "b7e5b38ae1968de2ae9be68c90e49885e0b58be0ac80e795b3e4aba0e39789e18c8be19d87e4b58de0b69be1a49ae6bda3e4aba4e296b1e38c93e68c9" - "0e49885e4b18b1ce78c8be5ab92e38781e68f8be79a96e0b48ce4959de19c98e3a0b1e6919ce492b4e285b1e28ba3e496a6e5b598e398b4e2b9a4e689" - "a6e1b088e7ac90e19d86e2b78ce1a19ae1a285e384aee5b1b0e39388e1a6a1e48d83e2b6a0e1a998c2b730e19880e296a0e48cbbe19b86e0b3ade5b49" - "ae3a4b2e48483e38a9ce19085ce98e29897e4b5aee48680e3aab1e6a5b2e69b9ee490b9e0a5b1e68e83e29985e0b58be1a097e39caee6899ce39090e4" - "ac8be19ba6d8a0e48280e3a084e791a1e58386e596bde4ada3e182b6e29786e0b88ce1a497e39cade5b1a2e18384e0ada8e69a96e280ad0ccc81e685a" - "3e4ab9ad789e0a1a3e18ba3e49c86e4b28be1a296e380aee6a19ce1809ce38cabe59896e0b68ee4859de19c98e2b8b0c9a0e3a080e68c90e39bb6e6b5" - "ace1a198e3a0b9e6b9a5e693a8e2a7a5e78688cc92d6a7e4ae8ce19c9930e6a0a4e196a1e6ae93e49896e4afade5af99e39cbae685a4e58ba8e3a6bde" - "0a183e68ba3e69786e0ae8ce1b099e18480e583a8e4a695e0adabe79b86e0b2abe5b09ee39cb0e6a5b3e5b39ee490a1e385b1e38ba3e29786e0b38cd6" - "81e6a5ace5b384e3a6bde6af8be59bb6e2b9aee0b281e1a297e380aee4988ed6a1e78db3e49996e281ade0ae8cc298e0a882e5a38ae5a695e28c8be29" - "bb7e0b4aee48c99e19c98e3a0b1e6919ce492b4e485b1e48ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606c780e3aab9e695aee58b" - "98e1a68de0a688cba3e29786e4858ce3ae84e789afe4a398e18695e28d8be380b7e2baace4819ac298e6a488e6a39ce4a695e0adb3e19b86e298a0e48" - "280e38681e6b5a6e6b896e482b8c5b1cb93e2b98ee4b299ce9ce695aee6bba8e4a6bde0ad9bcc9040e1a183e386b9e6a5a8e4aba8e5868de18eabe69e" - "97e49a80e0b98be1b097dcb4e4ab9ce5b791e18dbbe19ab7e298a000e3ae87e6a5a5e4a3a4e3a6a5e3acbbe49896e2b3ace1b499e1a483e388aee6899" - "cc384e6a1a8e798b6e2b38ee1b29de392b7e795b4e4aba4e1978de78698e68c82e49885c980e3a4bae78da1e49b90e3a685e38e9be68c90e49885e4b1" - "8bc89ae685ade5b392e4908501e58290e6b1ade5ac9de38eb4e791a8e0aba6e3a384e78681ccb2e68480e5b598e3aab1e689ade6938ae59095e0a5b1e" - "28ba306e1b381e382b7e189a4e5b1a2e68384e185b1e18b93e49786e0b28ce1a097e2b8b4e6a9a2e0a684e58098e19996e284ade4ae8ee19c9be2b8b0" - "e681a4e1b3a4e48c98e69896e2b78de5ac99e1a282e380aee6819ce0a084e0a098e29996e28386e0b18ce1a297e390aee5a888e29685e0adb3e18c904" - "0e5ad82e396b2e6b9a1e69b92e1a6b5c688e28ba3e29786e4888de38ab6e685abe58b9ce3978de0a0b3e68c83e49985e0b58bc880e68885e5a388e0a6" - "a5e0a183e18ba3e49ca6e0b38be1ae97e6b48ae5a3aae29791e68c93e39bb6e2b5ace0b280c880e6a5ade49ba6e49085e18081e381a0e2b98ce1a199e" - "38abae38087e6a99ce482b8e285b1e58186e2b0ade5ae9ae1a280c880e6b892e69685e28e9be69bb7e6b2ade4869ce1a098e384aee6819ce3a09ce28c" - "abe79db7e6b98de4839ae19c9830e0b080e3868ce6aeabe39c86c48ee0ae8ee19c98e2acb0e681a2e6a080e48e98e49d96e0baaee1a59ce3a0bce789a" - "5e5ab92e3a695e0aea3e39b86e0b2aee5b49de39cb4e78da7e6888ae482b8e2a5b123e6b1a1e1ad9be39eb3e791b2e1b3a6e3a384e48689e28ba3e296" - "a6e0ae8de19c98e2b8b0e0a1a8d6b4e78d8be18096e48086ce80e382b7e795b4e4aba4e0b78de6adbbe19c86e6b9ace4929ce19c98e3a0b1e6919ce49" - "2b4e4a5b1e78ba3e496a6e1af99e38eb9e0b9a5e48b9ce59791e2ae93e39cb6e2b7ace5b09be3a6b0cdb3e5b1a2d380e78090e49cb0e4b7aee5a19ce3" - "8ab3e695aee6bba8e4a6bde68d9be68c90d8a5e0ae8ee19a99e2b8b1e5b1ace38384e0ada8e69a96e6afade5a898e39cb0e695aecb98c384e28080e29" - "9a1e2b0aee1a59be386b2e6b5afe48ba0e5868de18ca3e79897e4b2aee1b39ce1a285e384aee5a9b0e3a390e78689cc82c8a0e5a599e39eb1e685b2e5" - "8ba8e19799e18bbbe79b86e6b1ade5b39ae1a482e384aee6819ce2a080e7ac90e19d86e2b78ce5b09ee3a8b7d9b3e5b1b0e3a380e18689e38083e0b38" - "1e1a29de382b1e6ada3e683aae4a78de0a0b1cba3e29786e0b78cd281e6bda3e5838ce0b5bde18dbbd997e498a1e0b68be1a897e388aee0b9a2e1969c" - "e2adb3e19ca6e2b68ce4b180c480e6b488e59386e69791e4ada3e398a6e498a1e0b18be19a9ce2b8b6e5b1a0e59384e6a181e298b6e2ba8de5ac9ee38" - "4b4e38483e6819c04e4a180dcb6e6b0aee5ae9de3a4b2e38483e6819ce29080e38ca8e29997e6bcaee5af98e3a0b6e3848ce6899ce3a3a0e6a691e68c" - "92e49aa5e0b78bd480e695aae6a392e1979de5ac8be29996e683aee0ae8ce19c98e2b8b070e580a4e18cabe19ca7e2b68ce1b49aceb4e2b8b0e1b1a0e" - "3a4bde188aae58390e4b4ade1a99be38eb7e685a7e4bb88e58695e38e9be68c90e298a5e0ae8ce0a898e685ade5b392e3a5bde28cabe79db7e6b98de5" - "9f9ae390b1e6b9a1e4ab9cd6b1c690e480a0e4b1a1e1a19ce3a8b3e79db4e48b8ae196ade3ae93e68e90e498a5e4b18be1ae9ce6b484e58b82e196b9e" - "78688e68c82d885e48280e38285e685abe583a6e0b6a5e7aea3e59b96e2838ce4ae8ce19a9ae380b2e5a888e29685e0adb3cc90e28280e5a681e3a4b7" - "e695a7c886e694b9e281a2e59a97e6b98ce5b397e3a4b7e6a5b4e4bb9ce4908dc5b1e58083e0b9a0e5ac9ce3a8b4e38483e6899ce0a084e1a1b0e49bb" - "6e6b7ade5b39ce398b0e6a1a3e69b8ae4b791e0a0abcba3e69787e48c8ce390b1e6b9a1e4ab9ce7b6b1e0adaae69a96e282ade0ae8ce19c98c4b0e0b0" - "84e1978ce2ada3e59ba6e286ace4ae8ce1b098e388aee6899ae492b8e786b9e78e92e2b780e5b499e39ebbe6adb2e6888200e28298e19ca6e0b88de1b" - "99ce39eb6e691a1e5b392e4b69de18c9be59997e2b78ce0b181e1ac97e390aee1b086e4a68ce38c8be19d86e6b78de5b499e38abbe6ada1e0bba6e196" - "b8e3aea3e29bb7e6b5aee0b180e1a097d080e5a892e3a6a5e1acabe19ca6e0b38ce4869de19c98e3a0b1e6919ce590a8e18db3e79997e6b4ace5b49ce" - "3a4b2e49884e1a29ad38de18180e79997e6b4ace5b49ce3a4b2e49884e1a29ad38de68080e59d80e4b98ce1a19ce398b1e6b9a5e4ab88e48789e78688" - "cc92e49787e4ad8ce19c98e2b8b1e5b1a0e48384c691e38680e0b7aee5a89ce3a6b4e6a5b4e48b86e19791e18ca3e39896e0b5ace5a19ce396b1e799b" - "3e1bb90e3a384e48689e28ba3e296a6e0ae8ce19c98e2b8b4e691a2e2b080e7ada8e39d96e0b2aee5b79de382b2e78dabc886e694b9e48092e19d80e2" - "ba8de5ae98e3aab4d5ade5b1a6e3a394e3a6b1e59ba0e6ba8ce1af9de396b9e38483e6819cd084e580a0e49896e0b2ace48d80e3a4b1e685a5e4aba8e" - "5b791e0acabe59ab6e0b98ce0b282e1a097e380aee6899ce0a39ce2a1b0e39896e6bcaee5b697e398b4e685ace4ab8ee4b789e0a1abe18ba3e49c86e4" - "b28be1a296e380aee6899ce1b380e2aca0e199a6e0baace5b49be1a282e380aee6819ce0a08428da97e4b2aee48c9ee19c98e3a0b1e6919ce492b4e0a" - "5b1e58ba3c3a6e1a599e382b3e6b1b5e0aba8e3a384e78681e18c82e68080e5a981e38ab1e695a2e4bba4d08de4a9b215e0b381e5b99be390bbe695a5" - "d398e39098e78c8be49d86e4b2ade0b181e1b297e388aee0b9aee196b8e3aea3e29bb7e2b5aee0b18000e69489e5bb86e3b6b1e4acbbe398b6e282aee" - "4ae8ce19c9bc8b3e6888ad795e5ae93e381b6e49786e4ad8ce1aa99d0b8e48b9ae3a6a5e0a08be28083c680e5a19ee3a4b2e6b5afe5b392e396a5cc8b" - "e281b7e49986e4b18be19c98d0b1e48b9ae3a6a5e0a09bcba326c680e392b8e781a7e5b38ae68095c5b1e18ba3e28186e5a682e3a6b0e689b4e5b38ae" - "2868de380abcba3e49786e4878ce390b1e6b9a1e4ab9ce196b1e786a0e68da2e29885e48280e3a084e6b1afe5abb2e4a6bde48e83e182b6e29786e0b8" - "8ce1a497e380ade6a19ce18390e0ada8e69a96e280ad0cd480e795a1e5bba8e19789e68cbbe29a96e2838ce4ae8ce19a9be38cb5e1b084e5878ce18db" - "be79897e0b2ace5b299e3aeb0e789a5e0b3a6e48384e185b1e18ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606cc80e398b3e7a1b5" - "e4ab9ce5b791e18dbbe39ab7e683aee0ae8de19c98e2b8b770e3a0a8e7acabe39ba6e2b98ce1a698e1a4bae38883e6919ce28088e78ca8e29996e2b1a" - "ee1ac99ceb6e2b8b0e1b1a0e3a4bde3a8aae59ba0e6ba8ce1af9de396b9e38085e6819ce482b8e18081e18290e0b88ce5ac9ce3a6b2e6a5abe1a39ce3" - "a388e786a1e38c82e6b6a5e0b198e1a297d0b8e78ba6e0b6b9e0a08be18093e485a0e1a599e3a4b9e791a9e49b8ae4a6bde18cabe583a0e0b7ade1b59" - "9e382b6e789b2e6ab9ee19791e1ae93e18287e29787e4ae8ce19a98e38cb9e5a898e29685e7adb3d8b5e4b0ade5ae9be398b2e3888100e4a190e38cab" - "e69a96e0b2ade1b399e39ebae685b2e4ab8ee18685e7aca3e39ba6c2aee0ae8ce19c9c32e5b894e19781e68db3e19bb6e2b28ce1b299e1a283e2b8b2e" - "5b1a0e0a384e28188e59a87e4aface5a19de398bae185b4e5b1a2e68384e185b1e28b93d786e4ae8ce1a098e3a0aee789ace3a09ce28cabe79db7e6b9" - "8dc69ae19c98e398b2e6819cd080e6a2a8e49bb6e4b2ace5ae9ce392bae698bae6ab98e3a7a1e28cabe79db7e6b98de5b39ae1ae81e39cb000" -).decode("utf-8") - - -def test_forge_data_build() -> None: - assert ForgeData.build({"fmlNetworkVersion": 3, "channels": [], "mods": []}) == ForgeData( - fml_network_version=3, channels=[], mods=[], truncated=False - ) - - -def test_decode_optimized() -> None: - buffer = decode_optimized(ENCODED_STRING) - assert buffer.received == bytearray.fromhex( - "000082000c72737265717565737469667905322e322e30020b6379636c6f7073636f726506312e31352e310c6368616e6e656c5f6d61696e05312" - "e302e3001000661757564696f05312e302e33000f617578696c69617279626c6f636b730d312e31382e322d302e302e3134021873757065726d61" - "7274696a6e363432636f6e6669676c696205312e312e360c73796e635f636f6e666967730131000209616c6578736d6f627306312e31382e360c6" - "d61696e5f6368616e6e656c0131000012617263686974656374735f70616c6574746505312e312e320008636167657269756d0c312e31382e322d" - "312e312e30000a6d637777696e646f777305322e302e330211736f7068697374696361746564636f726511312e31382e322d302e352e33322e313" - "739076368616e6e656c0131000007746865726d616c08312e362e332e3238020b7266746f6f6c73626173650a312e31382d332e302e390b726674" - "6f6f6c736261736503312e30010010696e697469616c696e76656e746f727905362e302e38020e69726f6e67656e657261746f727305322e302e3" - "10e69726f6e67656e657261746f7273013100020d786165726f776f726c646d617006312e32352e31046d61696e03312e30010214636f6f6b696e" - "67666f72626c6f636b68656164730631322e302e32076e6574776f726b03312e3000010b636f6e74726f6c6c696e670204786e65740a312e31382" - "d342e302e3504786e657403312e30010207706c616365626f05362e342e3107706c616365626f05312e302e300102076369746164656c06312e31" - "312e330c6d61696e5f6368616e6e656c0131000005706f7761680a332e302e312d626574610009626f6f6b7368656c660731332e322e353000096" - "c6f6f746265616d7306312e31382e310216736f70686973746963617465646261636b7061636b7312312e31382e322d332e31382e33352e373532" - "076368616e6e656c0131000005747769677313312e312e342d7061746368312b312e31382e32020f6275696c64696e676761646765747318332e3" - "1332e302d6275696c642e352b6d63312e31382e327d046d61696e01340000096461726b7574696c730631302e302e3500086d6377646f6f727305" - "312e302e360007776164646c65730d312e31382e322d302e382e313902126d656b616e69736d67656e657261746f72730631302e322e35126d656" - "b616e69736d67656e657261746f72730631302e322e3500000462616c6d07332e322e302b3003057761696c610a6e6574776f726b696e6705312e" - "302e3001000b6a657265736f75726365730a302e31342e312e313731010c636c6f74685f636f6e666967020e7368657469706869616e636f72650" - "7332e31302e31300c6d61696e5f6368616e6e656c05312e302e3000020964756d6d6d6d6d6d790a312e31382d312e352e320c64756d6d79636861" - "6e6e656c013100020f737570706c656d656e7461726965730d312e31382e322d312e352e3133076e6574776f726b013100020e726566696e65647" - "3746f7261676506312e31302e320c6d61696e5f6368616e6e656c01310000086b6f6e6b7265746505312e332e33000c656173795f7069676c696e" - "730c312e31382e322d312e302e300206636f727073650c312e31382e322d312e302e320764656661756c7405312e302e300101087061636b6d656" - "e75000a6d63776272696467657305322e302e33000b746f7263686d61737465720631382e312e30000b636f6d707265737369756d16312e342e32" - "2d6275696c642e392b6d63312e31382e32020470696e670a312e31382d312e382e300c70696e675f6368616e6e656c0550494e473101020c69726" - "f6e6675726e6163657305332e332e311469726f6e6675726e616365735f6e6574776f726b03312e3001000b6d6377747270646f6f727305312e30" - "2e3600096d637766656e63657305312e302e35001673757065726d617274696a6e363432636f72656c696206312e302e3139000b73696d706c796" - "c6967687415312e31382e322d312e342e322d6275696c642e33310207626f74616e69610a312e31382e322d343334046d61696e013000000b6869" - "67686c69676874657203414e590105737061726b0206637572696f730e312e31382e322d352e302e372e31046d61696e013100020970617463686" - "f756c690b312e31382e322d37312e31046d61696e013100020663616d6572610c312e31382e322d312e302e340764656661756c7405312e302e30" - "01000e626c6f636b63617270656e7472790a312e31382d302e332e300012746865726d616c5f666f756e646174696f6e08312e362e332e3238001" - "1746865726d616c5f657870616e73696f6e08312e362e332e3133020b6c69626e6f6e796d6f757305322e312e30076368616e6e656c03312e3001" - "020a656c657661746f7269640c312e31382e322d312e382e340c6d61696e5f6368616e6e656c013100000772756e656c69630631312e302e31050" - "9776f726c64656469740363756901310108696e7465726e616c013101020363666d0b372e302e302d7072653239076e6574776f726b013100020c" - "61726368697465637475727906342e392e3834076e6574776f726b013101000e7765697264696e6767616467657406322e322e3131000d6d63776" - "675726e69747572657305332e302e300209747261736863616e7306312e302e3135046d61696e01310000096d63776c696768747305312e302e33" - "0008637563756d62657205352e312e320004736e616412312e31382e322d312e32322e30342e31356102036a656909392e372e302e32303907636" - "8616e6e656c05312e302e300102036165320631312e312e34046d61696e01310102086d656b616e69736d0631302e322e35086d656b616e69736d" - "0631302e322e3500040562646c696208312e31392e332e370a6d756c7469626c6f636b013200046d697363013100020663726561746507302e352" - "e302e64046d61696e013100020977617973746f6e65730631302e312e30076e6574776f726b03312e30000006636c756d707308382e302e302b31" - "30001a7368757475706578706572696d656e74616c73657474696e677305312e302e350208636f6d666f7274730e312e31382e322d352e302e302" - "e34046d61696e013100020e6e617475726573636f6d7061737312312e31382e322d312e392e372d666f7267650e6e617475726573636f6d706173" - "7303312e3001020e73746f726167656e6574776f726b0c312e31382e322d312e362e310c6d61696e5f6368616e6e656c01310000146672616d656" - "4636f6d70616374647261776572730a312e31382d342e312e3000116465636f7261746976655f626c6f636b7305322e312e30000a626f74616e79" - "706f747306382e302e3132000b6674626261636b7570733206312e302e31370209636f66685f636f726508312e362e342e32310767656e6572616" - "c01310102086d636a74796c69620b312e31382d362e302e3135086d636a74796c696203312e3001000869737061776e657203312e300009657665" - "7279636f6d700c312e31382e322d312e352e37000a6a6569747765616b657207332e302e302e38000974657272616c69746807302e304e4f4e450" - "20d6d696e696e676761646765747306312e31312e30146d61696e5f6e6574776f726b5f6368616e6e656c013200020c6372616674747765616b65" - "7207392e312e313937046d61696e05312e302e3000020b616b6173686963746f6d6506312e352d3230046d61696e0131000405666f72676503414" - "e590c746965725f736f7274696e6703312e30000573706c697403312e3101020e636f6c6f7373616c63686573747305312e382e330c6368616e6e" - "656c5f6d61696e05312e302e3001020673656c656e650d312e31382e322d312e31372e39076e6574776f726b01310000136472697070796c6f616" - "4696e6773637265656e05312e362e34030e6372616674696e67747765616b73076e6574776f726b03312e300004096d696e65637261667406312e" - "31382e320a756e726567697374657204464d4c330108726567697374657204464d4c3301000c7465727261626c656e64657210312e31382e322d3" - "12e312e302e3130320018736f70686973746963617465646261636b7061636b7376680f312e31382e322d312e302e342e3132000b6d6f75736574" - "7765616b7303414e590208746974616e69756d05332e352e36076e6574776f726b03312e300101046a616465000d637265617465747765616b657" - "208322e302e302e3137020e656173795f76696c6c61676572730d312e31382e322d312e302e31300764656661756c7405312e302e300102057069" - "70657a0c312e31382e322d312e312e350764656661756c7405312e302e300100076963656265726703414e590108666c79776865656c02066d616" - "e746c6506312e392e3237076e6574776f726b013100000965636f6c6f6769637305312e372e330205717561726b07332e322d333538046d61696e" - "013100020c786165726f6d696e696d61700732322e31312e31046d61696e03312e3001000670696770656e05382e302e3102096661737462656e6" - "36805362e302e32076368616e6e656c05342e362e30010209706f6c796d6f7270680b312e31382e322d302e3434046d61696e013100000a617574" - "6f7265676c696206312e372d3533020e73746f72616765647261776572730631302e322e310c6d61696e5f6368616e6e656c013100000c666c757" - "86e6574776f726b7307372e302e372e38000a6e656f6e63726166743203322e320208656e657263656c6c07302e304e4f4e45076e6574776f726b" - "05302e302e300002096170706c65736b696e0c322e342e302b6d63312e31380473796e63013101010b66657272697465636f7265020e6d6f64756" - "c6172726f757465727308392e312e312d39330c6d61696e5f6368616e6e656c0132000014726566696e656473746f726167656164646f6e730530" - "2e382e32000a6f70656e6c6f616465720631322e302e3102097468655f7661756c7411312e31382e322d322e302e31302e383639076e6574776f7" - "26b06302e32362e300001156d6f6465726e75693a666c75786e6574776f726b730337303700" - ) - - -def test_decode_forge_data() -> None: - forge_data = decode_forge_data( - { - "channels": [], - "d": ENCODED_STRING, - "fmlNetworkVersion": 3, - "mods": [], - "truncated": True, - } - ) - assert forge_data == ForgeData( - fml_network_version=3, - channels=[ - { - "res": "cyclopscore:channel_main", - "version": "1.0.0", - "required": True, - }, - { - "res": "supermartijn642configlib:sync_configs", - "version": "1", - "required": False, - }, - { - "res": "alexsmobs:main_channel", - "version": "1", - "required": False, - }, - { - "res": "sophisticatedcore:channel", - "version": "1", - "required": False, - }, - { - "res": "rftoolsbase:rftoolsbase", - "version": "1.0", - "required": True, - }, - { - "res": "irongenerators:irongenerators", - "version": "1", - "required": False, - }, - { - "res": "xaeroworldmap:main", - "version": "1.0", - "required": True, - }, - { - "res": "cookingforblockheads:network", - "version": "1.0", - "required": False, - }, - {"res": "xnet:xnet", "version": "1.0", "required": True}, - { - "res": "placebo:placebo", - "version": "1.0.0", - "required": True, - }, - { - "res": "citadel:main_channel", - "version": "1", - "required": False, - }, - { - "res": "sophisticatedbackpacks:channel", - "version": "1", - "required": False, - }, - { - "res": "buildinggadgets:main", - "version": "4", - "required": False, - }, - { - "res": "mekanismgenerators:mekanismgenerators", - "version": "10.2.5", - "required": False, - }, - { - "res": "waila:networking", - "version": "1.0.0", - "required": True, - }, - { - "res": "shetiphiancore:main_channel", - "version": "1.0.0", - "required": False, - }, - { - "res": "dummmmmmy:dummychannel", - "version": "1", - "required": False, - }, - { - "res": "supplementaries:network", - "version": "1", - "required": False, - }, - { - "res": "refinedstorage:main_channel", - "version": "1", - "required": False, - }, - {"res": "corpse:default", "version": "1.0.0", "required": True}, - { - "res": "ping:ping_channel", - "version": "PING1", - "required": True, - }, - { - "res": "ironfurnaces:ironfurnaces_network", - "version": "1.0", - "required": True, - }, - {"res": "botania:main", "version": "0", "required": False}, - {"res": "curios:main", "version": "1", "required": False}, - {"res": "patchouli:main", "version": "1", "required": False}, - {"res": "camera:default", "version": "1.0.0", "required": True}, - { - "res": "libnonymous:channel", - "version": "1.0", - "required": True, - }, - { - "res": "elevatorid:main_channel", - "version": "1", - "required": False, - }, - {"res": "worldedit:cui", "version": "1", "required": True}, - {"res": "worldedit:internal", "version": "1", "required": True}, - {"res": "cfm:network", "version": "1", "required": False}, - { - "res": "architectury:network", - "version": "1", - "required": True, - }, - {"res": "trashcans:main", "version": "1", "required": False}, - {"res": "jei:channel", "version": "1.0.0", "required": True}, - {"res": "ae2:main", "version": "1", "required": True}, - { - "res": "mekanism:mekanism", - "version": "10.2.5", - "required": False, - }, - {"res": "bdlib:multiblock", "version": "2", "required": False}, - {"res": "bdlib:misc", "version": "1", "required": False}, - {"res": "create:main", "version": "1", "required": False}, - { - "res": "waystones:network", - "version": "1.0", - "required": False, - }, - {"res": "comforts:main", "version": "1", "required": False}, - { - "res": "naturescompass:naturescompass", - "version": "1.0", - "required": True, - }, - { - "res": "storagenetwork:main_channel", - "version": "1", - "required": False, - }, - {"res": "cofh_core:general", "version": "1", "required": True}, - { - "res": "mcjtylib:mcjtylib", - "version": "1.0", - "required": True, - }, - { - "res": "mininggadgets:main_network_channel", - "version": "2", - "required": False, - }, - { - "res": "crafttweaker:main", - "version": "1.0.0", - "required": False, - }, - {"res": "akashictome:main", "version": "1", "required": False}, - { - "res": "forge:tier_sorting", - "version": "1.0", - "required": False, - }, - {"res": "forge:split", "version": "1.1", "required": True}, - { - "res": "colossalchests:channel_main", - "version": "1.0.0", - "required": True, - }, - {"res": "selene:network", "version": "1", "required": False}, - { - "res": "craftingtweaks:network", - "version": "1.0", - "required": False, - }, - { - "res": "minecraft:unregister", - "version": "FML3", - "required": True, - }, - { - "res": "minecraft:register", - "version": "FML3", - "required": True, - }, - {"res": "titanium:network", "version": "1.0", "required": True}, - { - "res": "easy_villagers:default", - "version": "1.0.0", - "required": True, - }, - {"res": "pipez:default", "version": "1.0.0", "required": True}, - {"res": "mantle:network", "version": "1", "required": False}, - {"res": "quark:main", "version": "1", "required": False}, - { - "res": "xaerominimap:main", - "version": "1.0", - "required": True, - }, - { - "res": "fastbench:channel", - "version": "4.6.0", - "required": True, - }, - {"res": "polymorph:main", "version": "1", "required": False}, - { - "res": "storagedrawers:main_channel", - "version": "1", - "required": False, - }, - { - "res": "enercell:network", - "version": "0.0.0", - "required": False, - }, - {"res": "appleskin:sync", "version": "1", "required": True}, - { - "res": "modularrouters:main_channel", - "version": "2", - "required": False, - }, - { - "res": "the_vault:network", - "version": "0.26.0", - "required": False, - }, - { - "res": "modernui:fluxnetworks", - "version": "707", - "required": False, - }, - ], - mods=[ - {"modid": "rsrequestify", "modmarker": "2.2.0"}, - {"modid": "cyclopscore", "modmarker": "1.15.1"}, - {"modid": "auudio", "modmarker": "1.0.3"}, - {"modid": "auxiliaryblocks", "modmarker": "1.18.2-0.0.14"}, - {"modid": "supermartijn642configlib", "modmarker": "1.1.6"}, - {"modid": "alexsmobs", "modmarker": "1.18.6"}, - {"modid": "architects_palette", "modmarker": "1.1.2"}, - {"modid": "cagerium", "modmarker": "1.18.2-1.1.0"}, - {"modid": "mcwwindows", "modmarker": "2.0.3"}, - { - "modid": "sophisticatedcore", - "modmarker": "1.18.2-0.5.32.179", - }, - {"modid": "thermal", "modmarker": "1.6.3.28"}, - {"modid": "rftoolsbase", "modmarker": "1.18-3.0.9"}, - {"modid": "initialinventory", "modmarker": "6.0.8"}, - {"modid": "irongenerators", "modmarker": "2.0.1"}, - {"modid": "xaeroworldmap", "modmarker": "1.25.1"}, - {"modid": "cookingforblockheads", "modmarker": "12.0.2"}, - { - "modid": "controlling", - "modmarker": "", - }, - {"modid": "xnet", "modmarker": "1.18-4.0.5"}, - {"modid": "placebo", "modmarker": "6.4.1"}, - {"modid": "citadel", "modmarker": "1.11.3"}, - {"modid": "powah", "modmarker": "3.0.1-beta"}, - {"modid": "bookshelf", "modmarker": "13.2.50"}, - {"modid": "lootbeams", "modmarker": "1.18.1"}, - { - "modid": "sophisticatedbackpacks", - "modmarker": "1.18.2-3.18.35.752", - }, - {"modid": "twigs", "modmarker": "1.1.4-patch1+1.18.2"}, - { - "modid": "buildinggadgets", - "modmarker": "3.13.0-build.5+mc1.18.2}", - }, - {"modid": "darkutils", "modmarker": "10.0.5"}, - {"modid": "mcwdoors", "modmarker": "1.0.6"}, - {"modid": "waddles", "modmarker": "1.18.2-0.8.19"}, - {"modid": "mekanismgenerators", "modmarker": "10.2.5"}, - {"modid": "balm", "modmarker": "3.2.0+0"}, - {"modid": "waila", "modmarker": ""}, - {"modid": "jeresources", "modmarker": "0.14.1.171"}, - { - "modid": "cloth_config", - "modmarker": "", - }, - {"modid": "shetiphiancore", "modmarker": "3.10.10"}, - {"modid": "dummmmmmy", "modmarker": "1.18-1.5.2"}, - {"modid": "supplementaries", "modmarker": "1.18.2-1.5.13"}, - {"modid": "refinedstorage", "modmarker": "1.10.2"}, - {"modid": "konkrete", "modmarker": "1.3.3"}, - {"modid": "easy_piglins", "modmarker": "1.18.2-1.0.0"}, - {"modid": "corpse", "modmarker": "1.18.2-1.0.2"}, - {"modid": "packmenu", "modmarker": ""}, - {"modid": "mcwbridges", "modmarker": "2.0.3"}, - {"modid": "torchmaster", "modmarker": "18.1.0"}, - {"modid": "compressium", "modmarker": "1.4.2-build.9+mc1.18.2"}, - {"modid": "ping", "modmarker": "1.18-1.8.0"}, - {"modid": "ironfurnaces", "modmarker": "3.3.1"}, - {"modid": "mcwtrpdoors", "modmarker": "1.0.6"}, - {"modid": "mcwfences", "modmarker": "1.0.5"}, - {"modid": "supermartijn642corelib", "modmarker": "1.0.19"}, - {"modid": "simplylight", "modmarker": "1.18.2-1.4.2-build.31"}, - {"modid": "botania", "modmarker": "1.18.2-434"}, - {"modid": "highlighter", "modmarker": "ANY"}, - {"modid": "spark", "modmarker": ""}, - {"modid": "curios", "modmarker": "1.18.2-5.0.7.1"}, - {"modid": "patchouli", "modmarker": "1.18.2-71.1"}, - {"modid": "camera", "modmarker": "1.18.2-1.0.4"}, - {"modid": "blockcarpentry", "modmarker": "1.18-0.3.0"}, - {"modid": "thermal_foundation", "modmarker": "1.6.3.28"}, - {"modid": "thermal_expansion", "modmarker": "1.6.3.13"}, - {"modid": "libnonymous", "modmarker": "2.1.0"}, - {"modid": "elevatorid", "modmarker": "1.18.2-1.8.4"}, - {"modid": "runelic", "modmarker": "11.0.1"}, - { - "modid": "worldedit", - "modmarker": "", - }, - {"modid": "cfm", "modmarker": "7.0.0-pre29"}, - {"modid": "architectury", "modmarker": "4.9.84"}, - {"modid": "weirdinggadget", "modmarker": "2.2.11"}, - {"modid": "mcwfurnitures", "modmarker": "3.0.0"}, - {"modid": "trashcans", "modmarker": "1.0.15"}, - {"modid": "mcwlights", "modmarker": "1.0.3"}, - {"modid": "cucumber", "modmarker": "5.1.2"}, - {"modid": "snad", "modmarker": "1.18.2-1.22.04.15a"}, - {"modid": "jei", "modmarker": "9.7.0.209"}, - {"modid": "ae2", "modmarker": "11.1.4"}, - {"modid": "mekanism", "modmarker": "10.2.5"}, - {"modid": "bdlib", "modmarker": "1.19.3.7"}, - {"modid": "create", "modmarker": "0.5.0.d"}, - {"modid": "waystones", "modmarker": "10.1.0"}, - {"modid": "clumps", "modmarker": "8.0.0+10"}, - {"modid": "shutupexperimentalsettings", "modmarker": "1.0.5"}, - {"modid": "comforts", "modmarker": "1.18.2-5.0.0.4"}, - {"modid": "naturescompass", "modmarker": "1.18.2-1.9.7-forge"}, - {"modid": "storagenetwork", "modmarker": "1.18.2-1.6.1"}, - {"modid": "framedcompactdrawers", "modmarker": "1.18-4.1.0"}, - {"modid": "decorative_blocks", "modmarker": "2.1.0"}, - {"modid": "botanypots", "modmarker": "8.0.12"}, - {"modid": "ftbbackups2", "modmarker": "1.0.17"}, - {"modid": "cofh_core", "modmarker": "1.6.4.21"}, - {"modid": "mcjtylib", "modmarker": "1.18-6.0.15"}, - {"modid": "ispawner", "modmarker": "1.0"}, - {"modid": "everycomp", "modmarker": "1.18.2-1.5.7"}, - {"modid": "jeitweaker", "modmarker": "3.0.0.8"}, - {"modid": "terralith", "modmarker": "0.0NONE"}, - {"modid": "mininggadgets", "modmarker": "1.11.0"}, - {"modid": "crafttweaker", "modmarker": "9.1.197"}, - {"modid": "akashictome", "modmarker": "1.5-20"}, - {"modid": "forge", "modmarker": "ANY"}, - {"modid": "colossalchests", "modmarker": "1.8.3"}, - {"modid": "selene", "modmarker": "1.18.2-1.17.9"}, - {"modid": "drippyloadingscreen", "modmarker": "1.6.4"}, - { - "modid": "craftingtweaks", - "modmarker": "", - }, - {"modid": "minecraft", "modmarker": "1.18.2"}, - {"modid": "terrablender", "modmarker": "1.18.2-1.1.0.102"}, - { - "modid": "sophisticatedbackpacksvh", - "modmarker": "1.18.2-1.0.4.12", - }, - {"modid": "mousetweaks", "modmarker": "ANY"}, - {"modid": "titanium", "modmarker": "3.5.6"}, - {"modid": "jade", "modmarker": ""}, - {"modid": "createtweaker", "modmarker": "2.0.0.17"}, - {"modid": "easy_villagers", "modmarker": "1.18.2-1.0.10"}, - {"modid": "pipez", "modmarker": "1.18.2-1.1.5"}, - {"modid": "iceberg", "modmarker": "ANY"}, - {"modid": "flywheel", "modmarker": ""}, - {"modid": "mantle", "modmarker": "1.9.27"}, - {"modid": "ecologics", "modmarker": "1.7.3"}, - {"modid": "quark", "modmarker": "3.2-358"}, - {"modid": "xaerominimap", "modmarker": "22.11.1"}, - {"modid": "pigpen", "modmarker": "8.0.1"}, - {"modid": "fastbench", "modmarker": "6.0.2"}, - {"modid": "polymorph", "modmarker": "1.18.2-0.44"}, - {"modid": "autoreglib", "modmarker": "1.7-53"}, - {"modid": "storagedrawers", "modmarker": "10.2.1"}, - {"modid": "fluxnetworks", "modmarker": "7.0.7.8"}, - {"modid": "neoncraft2", "modmarker": "2.2"}, - {"modid": "enercell", "modmarker": "0.0NONE"}, - {"modid": "appleskin", "modmarker": "2.4.0+mc1.18"}, - { - "modid": "ferritecore", - "modmarker": "", - }, - {"modid": "modularrouters", "modmarker": "9.1.1-93"}, - {"modid": "refinedstorageaddons", "modmarker": "0.8.2"}, - {"modid": "openloader", "modmarker": "12.0.1"}, - {"modid": "the_vault", "modmarker": "1.18.2-2.0.10.869"}, - ], - truncated=False, - ) From 0ea7af070a7da576481da343f81373b125c7fc12 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 17:13:19 -0500 Subject: [PATCH 22/67] Move forge data decoding into build --- mcstatus/forge_data.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 1dbafbbe..63b93c42 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -97,22 +97,19 @@ def build(cls, raw: RawForgeData) -> Self: :param raw: ``forgeData`` attribute in raw response :class:`dict`. :return: :class:`ForgeData` object. """ - return cls._decode_forge_data(raw) - - @classmethod - def _decode_forge_data(cls, response: RawForgeData) -> ForgeData: - """Decode the encoded forge data if it exists.""" + fml_network_version = raw.get("fmlNetworkVersion", 0) + # Decode the encoded forge data if it exists. # see https://github.com/MinecraftForge/MinecraftForge/blob/7d0330eb08299935714e34ac651a293e2609aa86/src/main/java/net/minecraftforge/network/ServerStatusPing.java#L27-L73 - if "d" not in response: + if "d" not in raw: return cls( - fml_network_version=response["fmlNetworkVersion"], - channels=response["channels"], - mods=response["mods"], + fml_network_version=fml_network_version, + channels=raw.get("channels", []), + mods=raw.get("mods", []), truncated=False, ) - buffer = decode_optimized(response["d"]) + buffer = decode_optimized(raw["d"]) channels: list[ForgeDataChannel] = [] mods: list[ForgeDataMod] = [] @@ -174,7 +171,7 @@ def _decode_forge_data(cls, response: RawForgeData) -> ForgeData: # Semi-expect errors if truncated, we are missing data return cls( - fml_network_version=response["fmlNetworkVersion"], + fml_network_version=fml_network_version, channels=channels, mods=mods, truncated=truncated, From 82cfbafab10b907739c4bd4fde5ceeebebc82562 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 17:17:48 -0500 Subject: [PATCH 23/67] Move `decode_optimized` into `ForgeData` --- mcstatus/forge_data.py | 60 +++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 63b93c42..5a8ee1bf 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -50,35 +50,6 @@ class RawForgeData(TypedDict): RawForgeData = dict -def decode_optimized(string: str) -> Connection: - """Decode buffer UTF-16 optimized binary data from `string`.""" - text = io.StringIO(string) - - def read() -> int: - result = text.read(1) - if not result: - return 0 - return ord(result) - - size = read() | (read() << 15) - - buffer = Connection() - value, bits = 0, 0 - for _ in range(len(string) - 2): - while bits >= 8: - buffer.receive((value & 0xFF).to_bytes(length=1, byteorder="big", signed=False)) - value >>= 8 - bits -= 8 - value |= (read() & 0x7FFF) << bits - bits += 15 - - while buffer.remaining() < size: - buffer.receive((value & 0xFF).to_bytes(length=1, byteorder="big", signed=False)) - value >>= 8 - bits -= 8 - return buffer - - @dataclass class ForgeData: fml_network_version: int @@ -90,6 +61,35 @@ class ForgeData: truncated: bool """Is the mods list and or channel list incomplete?""" + @staticmethod + def _decode_optimized(string: str) -> Connection: + """Decode buffer from UTF-16 optimized binary data `string`.""" + text = io.StringIO(string) + + def read() -> int: + result = text.read(1) + if not result: + return 0 + return ord(result) + + size = read() | (read() << 15) + + buffer = Connection() + value, bits = 0, 0 + for _ in range(len(string) - 2): + while bits >= 8: + buffer.receive((value & 0xFF).to_bytes(length=1, byteorder="big", signed=False)) + value >>= 8 + bits -= 8 + value |= (read() & 0x7FFF) << bits + bits += 15 + + while buffer.remaining() < size: + buffer.receive((value & 0xFF).to_bytes(length=1, byteorder="big", signed=False)) + value >>= 8 + bits -= 8 + return buffer + @classmethod def build(cls, raw: RawForgeData) -> Self: """Build an object about Forge mods from raw response. @@ -109,7 +109,7 @@ def build(cls, raw: RawForgeData) -> Self: truncated=False, ) - buffer = decode_optimized(raw["d"]) + buffer = _decode_optimized(raw["d"]) channels: list[ForgeDataChannel] = [] mods: list[ForgeDataMod] = [] From 8ec22a4f9381c425f6088835b2946ac6a76d92aa Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 17:24:49 -0500 Subject: [PATCH 24/67] Forgot to call from class --- mcstatus/forge_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 5a8ee1bf..f05e5275 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -109,7 +109,7 @@ def build(cls, raw: RawForgeData) -> Self: truncated=False, ) - buffer = _decode_optimized(raw["d"]) + buffer = cls._decode_optimized(raw["d"]) channels: list[ForgeDataChannel] = [] mods: list[ForgeDataMod] = [] From b06aeb7c3457a8e9cb915f6fbf698f3fc58302f8 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 2 Jul 2023 17:28:34 -0500 Subject: [PATCH 25/67] Ignore line with url being too long --- mcstatus/forge_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index f05e5275..b6745f4a 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -100,7 +100,7 @@ def build(cls, raw: RawForgeData) -> Self: fml_network_version = raw.get("fmlNetworkVersion", 0) # Decode the encoded forge data if it exists. - # see https://github.com/MinecraftForge/MinecraftForge/blob/7d0330eb08299935714e34ac651a293e2609aa86/src/main/java/net/minecraftforge/network/ServerStatusPing.java#L27-L73 + # see https://github.com/MinecraftForge/MinecraftForge/blob/7d0330eb08299935714e34ac651a293e2609aa86/src/main/java/net/minecraftforge/network/ServerStatusPing.java#L27-L73 # noqa: E501 # line too long if "d" not in raw: return cls( fml_network_version=fml_network_version, From ce034276b695487846f3177610fc2b59698924cc Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Mon, 3 Jul 2023 12:21:35 -0500 Subject: [PATCH 26/67] Apply suggestions from code review Co-authored-by: ItsDrike --- mcstatus/forge_data.py | 2 +- mcstatus/status_response.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index b6745f4a..e69b2290 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -63,7 +63,7 @@ class ForgeData: @staticmethod def _decode_optimized(string: str) -> Connection: - """Decode buffer from UTF-16 optimized binary data `string`.""" + """Decode buffer from UTF-16 optimized binary data ``string``.""" text = io.StringIO(string) def read() -> int: diff --git a/mcstatus/status_response.py b/mcstatus/status_response.py index 37fe954c..33ff9933 100644 --- a/mcstatus/status_response.py +++ b/mcstatus/status_response.py @@ -117,7 +117,7 @@ class JavaStatusResponse(BaseStatusResponse): .. seealso:: :ref:`pages/faq:how to get server image?` """ forge_data: ForgeData | None - """Forge mod data (mod list, channels, etc) if the server is modded""" + """Forge mod data (mod list, channels, etc). Only present if this is a forge (modded) server.""" @classmethod def build(cls, raw: RawJavaResponse, latency: float = 0) -> Self: From 875099445184590c8886133e37a9524e5791014c Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Mon, 3 Jul 2023 21:55:35 -0500 Subject: [PATCH 27/67] Don't use get, they should exist --- mcstatus/forge_data.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index e69b2290..c7cfaad6 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -97,15 +97,15 @@ def build(cls, raw: RawForgeData) -> Self: :param raw: ``forgeData`` attribute in raw response :class:`dict`. :return: :class:`ForgeData` object. """ - fml_network_version = raw.get("fmlNetworkVersion", 0) + fml_network_version = raw["fmlNetworkVersion"] # Decode the encoded forge data if it exists. # see https://github.com/MinecraftForge/MinecraftForge/blob/7d0330eb08299935714e34ac651a293e2609aa86/src/main/java/net/minecraftforge/network/ServerStatusPing.java#L27-L73 # noqa: E501 # line too long if "d" not in raw: return cls( fml_network_version=fml_network_version, - channels=raw.get("channels", []), - mods=raw.get("mods", []), + channels=raw["channels"], + mods=raw["mods"], truncated=False, ) From 8ccf57aa378760e9a4e376e925f9904b8d3032a4 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sat, 15 Jul 2023 18:36:27 -0500 Subject: [PATCH 28/67] Apply suggestions from code review Co-authored-by: Perchun Pak --- mcstatus/forge_data.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index c7cfaad6..23875edd 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -1,12 +1,14 @@ -"""Forge Data Decoder +"""Decoder for data from Forge, that is included into a response object. Forge mod data is encoded into a UTF-16 string that represents binary data containing data like the forge mod loader network version, a big list of channels that all the forge mods use, and a list of mods the server has. +Before 1.18.1, the mod data was in `forgeData` attribute inside a response object. We support this implementation too. + For more information see this file from forge itself: -https://github.com/MinecraftForge/MinecraftForge/blob/42115d37d6a46856e3dc914b54a1ce6d33b9872a/src/main/java/net/minecraftforge/network/ServerStatusPing.java +https://github.com/MinecraftForge/MinecraftForge/blob/54b08d2711a15418130694342a3fe9a5dfe005d2/src/main/java/net/minecraftforge/network/ServerStatusPing.java#L27-L73 """ from __future__ import annotations From 02b932da8db0c725889ecc4a35de492dd6df7c57 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sat, 15 Jul 2023 20:12:15 -0500 Subject: [PATCH 29/67] Change module docstring from suggestion by @PerchunPak --- mcstatus/forge_data.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 23875edd..090ea3bb 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -1,11 +1,12 @@ """Decoder for data from Forge, that is included into a response object. -Forge mod data is encoded into a UTF-16 string that represents -binary data containing data like the forge mod loader network -version, a big list of channels that all the forge mods use, -and a list of mods the server has. +After 1.18.1, Forge started to compress its mod data into a +UTF-16 string that represents binary data containing data like +the forge mod loader network version, a big list of channels +that all the forge mods use, and a list of mods the server has. -Before 1.18.1, the mod data was in `forgeData` attribute inside a response object. We support this implementation too. +Before 1.18.1, the mod data was in `forgeData` attribute inside +a response object. We support this implementation too. For more information see this file from forge itself: https://github.com/MinecraftForge/MinecraftForge/blob/54b08d2711a15418130694342a3fe9a5dfe005d2/src/main/java/net/minecraftforge/network/ServerStatusPing.java#L27-L73 From 626854f850c59583c60b3d2dd36db984c8d7323d Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sat, 15 Jul 2023 20:19:30 -0500 Subject: [PATCH 30/67] Add test for older response --- tests/status_response/test_java.py | 45 ++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/tests/status_response/test_java.py b/tests/status_response/test_java.py index 07c32fc0..dfc58402 100644 --- a/tests/status_response/test_java.py +++ b/tests/status_response/test_java.py @@ -103,6 +103,51 @@ def build(self): return JavaStatusVersion.build({"name": "1.8-pre1", "protocol": 44}) +@BaseStatusResponseTest.construct +class TestOldForgeData(BaseStatusResponseTest): + EXPECTED_VALUES = [ + ("fml_network_version", 2), + ( + "channels", + [ + { + "res": "cyclopscore:channel_main", + "version": "1.0.0", + "required": True, + }, + ], + ), + ( + "mods", + [ + {"modid": "rsrequestify", "modmarker": "2.2.0"}, + ], + ), + ("truncated", False), + ] + + @fixture(scope="class") + def build(self): + return ForgeData.build( + RawForgeData( + { + "channels": [ + { + "res": "cyclopscore:channel_main", + "version": "1.0.0", + "required": True, + }, + ], + "fmlNetworkVersion": 2, + "mods": [ + {"modid": "rsrequestify", "modmarker": "2.2.0"}, + ], + "truncated": False, + } + ) + ) + + @BaseStatusResponseTest.construct class TestForgeData(BaseStatusResponseTest): EXPECTED_VALUES = [ From cb07c119684a915ed4e1176823893c4ac2e923a7 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sat, 15 Jul 2023 20:52:16 -0500 Subject: [PATCH 31/67] Make `ForgeModData` and `ForgeModChannel` into dataclasses --- mcstatus/forge_data.py | 85 ++- mcstatus/status_response.py | 2 +- tests/status_response/test_java.py | 834 +++++++++++++++-------------- 3 files changed, 480 insertions(+), 441 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 090ea3bb..90feb22b 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -27,7 +27,7 @@ if TYPE_CHECKING: from typing_extensions import NotRequired, Self, TypedDict - class ForgeDataChannel(TypedDict): + class RawForgeDataChannel(TypedDict): res: str """Channel name and ID (for example ``fml:handshake``).""" version: str @@ -35,24 +35,59 @@ class ForgeDataChannel(TypedDict): required: bool """Is this channel required for client to join?""" - class ForgeDataMod(TypedDict): + class RawForgeDataMod(TypedDict): modid: str modmarker: str """Mod version.""" class RawForgeData(TypedDict): fmlNetworkVersion: int # noqa: N815 # camel case - channels: list[ForgeDataChannel] - mods: list[ForgeDataMod] + channels: list[RawForgeDataChannel] + mods: list[RawForgeDataMod] d: NotRequired[str] truncated: NotRequired[bool] else: - ForgeDataChannel = dict - ForgeDataMod = dict + RawForgeDataChannel = dict + RawForgeDataMod = dict RawForgeData = dict +@dataclass +class ForgeDataChannel: + res: str + """Channel name and ID (for example ``fml:handshake``).""" + version: str + """Channel version (for example ``1.2.3.4``).""" + required: bool + """Is this channel required for client to join?""" + + @classmethod + def build(cls, raw: RawForgeDataChannel) -> Self: + """Build an object about Forge channel from raw response. + + :param raw: ``forgeData`` attribute in raw response :class:`dict`. + :return: :class:`ForgeDataChannel` object. + """ + return cls(res=raw["res"], version=raw["version"], required=raw["required"]) + + +@dataclass +class ForgeDataMod: + modid: str + modmarker: str + """Mod version.""" + + @classmethod + def build(cls, raw: RawForgeDataMod) -> Self: + """Build an object about Forge mod from raw response. + + :param raw: ``forgeData`` attribute in raw response :class:`dict`. + :return: :class:`ForgeDataMod` object. + """ + return cls(modid=raw["modid"], modmarker=raw["modmarker"]) + + @dataclass class ForgeData: fml_network_version: int @@ -107,8 +142,8 @@ def build(cls, raw: RawForgeData) -> Self: if "d" not in raw: return cls( fml_network_version=fml_network_version, - channels=raw["channels"], - mods=raw["mods"], + channels=[ForgeDataChannel.build(channel) for channel in raw["channels"]], + mods=[ForgeDataMod.build(mod) for mod in raw["mods"]], truncated=False, ) @@ -118,12 +153,12 @@ def build(cls, raw: RawForgeData) -> Self: mods: list[ForgeDataMod] = [] truncated = buffer.read_bool() - mod_size = buffer.read_ushort() + mod_count = buffer.read_ushort() try: - for _ in range(mod_size): + for _ in range(mod_count): channel_version_flags = buffer.read_varint() - channel_size = channel_version_flags >> 1 + channel_count = channel_version_flags >> 1 is_server = channel_version_flags & VERSION_FLAG_IGNORE_SERVER_ONLY != 0 mod_id = buffer.read_utf() @@ -131,41 +166,35 @@ def build(cls, raw: RawForgeData) -> Self: if not is_server: mod_version = buffer.read_utf() - for _ in range(channel_size): + for _ in range(channel_count): name = buffer.read_utf() version = buffer.read_utf() client_required = buffer.read_bool() channels.append( ForgeDataChannel( - { - "res": f"{mod_id}:{name}", - "version": version, - "required": client_required, - } + res=f"{mod_id}:{name}", + version=version, + required=client_required, ) ) mods.append( ForgeDataMod( - { - "modid": mod_id, - "modmarker": mod_version, - } + modid=mod_id, + modmarker=mod_version, ) ) - non_mod_channel_size = buffer.read_varint() - for _ in range(non_mod_channel_size): + non_mod_channel_count = buffer.read_varint() + for _ in range(non_mod_channel_count): channel_identifier = buffer.read_utf() version = buffer.read_utf() client_required = buffer.read_bool() channels.append( ForgeDataChannel( - { - "res": channel_identifier, - "version": version, - "required": client_required, - } + res=channel_identifier, + version=version, + required=client_required, ) ) except IOError: diff --git a/mcstatus/status_response.py b/mcstatus/status_response.py index 33ff9933..c35a01e4 100644 --- a/mcstatus/status_response.py +++ b/mcstatus/status_response.py @@ -4,7 +4,7 @@ from dataclasses import dataclass from typing import Any, TYPE_CHECKING -from mcstatus.forge_data import ForgeData, RawForgeData +from mcstatus.forge_data import ForgeData, ForgeDataChannel, ForgeDataMod, RawForgeData from mcstatus.motd import Motd if TYPE_CHECKING: diff --git a/tests/status_response/test_java.py b/tests/status_response/test_java.py index dfc58402..a57dbf21 100644 --- a/tests/status_response/test_java.py +++ b/tests/status_response/test_java.py @@ -1,8 +1,16 @@ from pytest import fixture -from mcstatus.forge_data import RawForgeData +from mcstatus.forge_data import RawForgeData, RawForgeDataChannel, RawForgeDataMod from mcstatus.motd import Motd -from mcstatus.status_response import ForgeData, JavaStatusPlayer, JavaStatusPlayers, JavaStatusResponse, JavaStatusVersion +from mcstatus.status_response import ( + ForgeData, + ForgeDataChannel, + ForgeDataMod, + JavaStatusPlayer, + JavaStatusPlayers, + JavaStatusResponse, + JavaStatusVersion, +) from tests.status_response import BaseStatusResponseTest @@ -110,17 +118,17 @@ class TestOldForgeData(BaseStatusResponseTest): ( "channels", [ - { - "res": "cyclopscore:channel_main", - "version": "1.0.0", - "required": True, - }, + ForgeDataChannel( + res="cyclopscore:channel_main", + version="1.0.0", + required=True, + ), ], ), ( "mods", [ - {"modid": "rsrequestify", "modmarker": "2.2.0"}, + ForgeDataMod(modid="rsrequestify", modmarker="2.2.0"), ], ), ("truncated", False), @@ -132,15 +140,17 @@ def build(self): RawForgeData( { "channels": [ - { - "res": "cyclopscore:channel_main", - "version": "1.0.0", - "required": True, - }, + RawForgeDataChannel( + { + "res": "cyclopscore:channel_main", + "version": "1.0.0", + "required": True, + } + ), ], "fmlNetworkVersion": 2, "mods": [ - {"modid": "rsrequestify", "modmarker": "2.2.0"}, + RawForgeDataMod({"modid": "rsrequestify", "modmarker": "2.2.0"}), ], "truncated": False, } @@ -155,409 +165,409 @@ class TestForgeData(BaseStatusResponseTest): ( "channels", [ - { - "res": "cyclopscore:channel_main", - "version": "1.0.0", - "required": True, - }, - { - "res": "supermartijn642configlib:sync_configs", - "version": "1", - "required": False, - }, - { - "res": "alexsmobs:main_channel", - "version": "1", - "required": False, - }, - { - "res": "sophisticatedcore:channel", - "version": "1", - "required": False, - }, - { - "res": "rftoolsbase:rftoolsbase", - "version": "1.0", - "required": True, - }, - { - "res": "irongenerators:irongenerators", - "version": "1", - "required": False, - }, - { - "res": "xaeroworldmap:main", - "version": "1.0", - "required": True, - }, - { - "res": "cookingforblockheads:network", - "version": "1.0", - "required": False, - }, - {"res": "xnet:xnet", "version": "1.0", "required": True}, - { - "res": "placebo:placebo", - "version": "1.0.0", - "required": True, - }, - { - "res": "citadel:main_channel", - "version": "1", - "required": False, - }, - { - "res": "sophisticatedbackpacks:channel", - "version": "1", - "required": False, - }, - { - "res": "buildinggadgets:main", - "version": "4", - "required": False, - }, - { - "res": "mekanismgenerators:mekanismgenerators", - "version": "10.2.5", - "required": False, - }, - { - "res": "waila:networking", - "version": "1.0.0", - "required": True, - }, - { - "res": "shetiphiancore:main_channel", - "version": "1.0.0", - "required": False, - }, - { - "res": "dummmmmmy:dummychannel", - "version": "1", - "required": False, - }, - { - "res": "supplementaries:network", - "version": "1", - "required": False, - }, - { - "res": "refinedstorage:main_channel", - "version": "1", - "required": False, - }, - {"res": "corpse:default", "version": "1.0.0", "required": True}, - { - "res": "ping:ping_channel", - "version": "PING1", - "required": True, - }, - { - "res": "ironfurnaces:ironfurnaces_network", - "version": "1.0", - "required": True, - }, - {"res": "botania:main", "version": "0", "required": False}, - {"res": "curios:main", "version": "1", "required": False}, - {"res": "patchouli:main", "version": "1", "required": False}, - {"res": "camera:default", "version": "1.0.0", "required": True}, - { - "res": "libnonymous:channel", - "version": "1.0", - "required": True, - }, - { - "res": "elevatorid:main_channel", - "version": "1", - "required": False, - }, - {"res": "worldedit:cui", "version": "1", "required": True}, - {"res": "worldedit:internal", "version": "1", "required": True}, - {"res": "cfm:network", "version": "1", "required": False}, - { - "res": "architectury:network", - "version": "1", - "required": True, - }, - {"res": "trashcans:main", "version": "1", "required": False}, - {"res": "jei:channel", "version": "1.0.0", "required": True}, - {"res": "ae2:main", "version": "1", "required": True}, - { - "res": "mekanism:mekanism", - "version": "10.2.5", - "required": False, - }, - {"res": "bdlib:multiblock", "version": "2", "required": False}, - {"res": "bdlib:misc", "version": "1", "required": False}, - {"res": "create:main", "version": "1", "required": False}, - { - "res": "waystones:network", - "version": "1.0", - "required": False, - }, - {"res": "comforts:main", "version": "1", "required": False}, - { - "res": "naturescompass:naturescompass", - "version": "1.0", - "required": True, - }, - { - "res": "storagenetwork:main_channel", - "version": "1", - "required": False, - }, - {"res": "cofh_core:general", "version": "1", "required": True}, - { - "res": "mcjtylib:mcjtylib", - "version": "1.0", - "required": True, - }, - { - "res": "mininggadgets:main_network_channel", - "version": "2", - "required": False, - }, - { - "res": "crafttweaker:main", - "version": "1.0.0", - "required": False, - }, - {"res": "akashictome:main", "version": "1", "required": False}, - { - "res": "forge:tier_sorting", - "version": "1.0", - "required": False, - }, - {"res": "forge:split", "version": "1.1", "required": True}, - { - "res": "colossalchests:channel_main", - "version": "1.0.0", - "required": True, - }, - {"res": "selene:network", "version": "1", "required": False}, - { - "res": "craftingtweaks:network", - "version": "1.0", - "required": False, - }, - { - "res": "minecraft:unregister", - "version": "FML3", - "required": True, - }, - { - "res": "minecraft:register", - "version": "FML3", - "required": True, - }, - {"res": "titanium:network", "version": "1.0", "required": True}, - { - "res": "easy_villagers:default", - "version": "1.0.0", - "required": True, - }, - {"res": "pipez:default", "version": "1.0.0", "required": True}, - {"res": "mantle:network", "version": "1", "required": False}, - {"res": "quark:main", "version": "1", "required": False}, - { - "res": "xaerominimap:main", - "version": "1.0", - "required": True, - }, - { - "res": "fastbench:channel", - "version": "4.6.0", - "required": True, - }, - {"res": "polymorph:main", "version": "1", "required": False}, - { - "res": "storagedrawers:main_channel", - "version": "1", - "required": False, - }, - { - "res": "enercell:network", - "version": "0.0.0", - "required": False, - }, - {"res": "appleskin:sync", "version": "1", "required": True}, - { - "res": "modularrouters:main_channel", - "version": "2", - "required": False, - }, - { - "res": "the_vault:network", - "version": "0.26.0", - "required": False, - }, - { - "res": "modernui:fluxnetworks", - "version": "707", - "required": False, - }, + ForgeDataChannel( + res="cyclopscore:channel_main", + version="1.0.0", + required=True, + ), + ForgeDataChannel( + res="supermartijn642configlib:sync_configs", + version="1", + required=False, + ), + ForgeDataChannel( + res="alexsmobs:main_channel", + version="1", + required=False, + ), + ForgeDataChannel( + res="sophisticatedcore:channel", + version="1", + required=False, + ), + ForgeDataChannel( + res="rftoolsbase:rftoolsbase", + version="1.0", + required=True, + ), + ForgeDataChannel( + res="irongenerators:irongenerators", + version="1", + required=False, + ), + ForgeDataChannel( + res="xaeroworldmap:main", + version="1.0", + required=True, + ), + ForgeDataChannel( + res="cookingforblockheads:network", + version="1.0", + required=False, + ), + ForgeDataChannel(res="xnet:xnet", version="1.0", required=True), + ForgeDataChannel( + res="placebo:placebo", + version="1.0.0", + required=True, + ), + ForgeDataChannel( + res="citadel:main_channel", + version="1", + required=False, + ), + ForgeDataChannel( + res="sophisticatedbackpacks:channel", + version="1", + required=False, + ), + ForgeDataChannel( + res="buildinggadgets:main", + version="4", + required=False, + ), + ForgeDataChannel( + res="mekanismgenerators:mekanismgenerators", + version="10.2.5", + required=False, + ), + ForgeDataChannel( + res="waila:networking", + version="1.0.0", + required=True, + ), + ForgeDataChannel( + res="shetiphiancore:main_channel", + version="1.0.0", + required=False, + ), + ForgeDataChannel( + res="dummmmmmy:dummychannel", + version="1", + required=False, + ), + ForgeDataChannel( + res="supplementaries:network", + version="1", + required=False, + ), + ForgeDataChannel( + res="refinedstorage:main_channel", + version="1", + required=False, + ), + ForgeDataChannel(res="corpse:default", version="1.0.0", required=True), + ForgeDataChannel( + res="ping:ping_channel", + version="PING1", + required=True, + ), + ForgeDataChannel( + res="ironfurnaces:ironfurnaces_network", + version="1.0", + required=True, + ), + ForgeDataChannel(res="botania:main", version="0", required=False), + ForgeDataChannel(res="curios:main", version="1", required=False), + ForgeDataChannel(res="patchouli:main", version="1", required=False), + ForgeDataChannel(res="camera:default", version="1.0.0", required=True), + ForgeDataChannel( + res="libnonymous:channel", + version="1.0", + required=True, + ), + ForgeDataChannel( + res="elevatorid:main_channel", + version="1", + required=False, + ), + ForgeDataChannel(res="worldedit:cui", version="1", required=True), + ForgeDataChannel(res="worldedit:internal", version="1", required=True), + ForgeDataChannel(res="cfm:network", version="1", required=False), + ForgeDataChannel( + res="architectury:network", + version="1", + required=True, + ), + ForgeDataChannel(res="trashcans:main", version="1", required=False), + ForgeDataChannel(res="jei:channel", version="1.0.0", required=True), + ForgeDataChannel(res="ae2:main", version="1", required=True), + ForgeDataChannel( + res="mekanism:mekanism", + version="10.2.5", + required=False, + ), + ForgeDataChannel(res="bdlib:multiblock", version="2", required=False), + ForgeDataChannel(res="bdlib:misc", version="1", required=False), + ForgeDataChannel(res="create:main", version="1", required=False), + ForgeDataChannel( + res="waystones:network", + version="1.0", + required=False, + ), + ForgeDataChannel(res="comforts:main", version="1", required=False), + ForgeDataChannel( + res="naturescompass:naturescompass", + version="1.0", + required=True, + ), + ForgeDataChannel( + res="storagenetwork:main_channel", + version="1", + required=False, + ), + ForgeDataChannel(res="cofh_core:general", version="1", required=True), + ForgeDataChannel( + res="mcjtylib:mcjtylib", + version="1.0", + required=True, + ), + ForgeDataChannel( + res="mininggadgets:main_network_channel", + version="2", + required=False, + ), + ForgeDataChannel( + res="crafttweaker:main", + version="1.0.0", + required=False, + ), + ForgeDataChannel(res="akashictome:main", version="1", required=False), + ForgeDataChannel( + res="forge:tier_sorting", + version="1.0", + required=False, + ), + ForgeDataChannel(res="forge:split", version="1.1", required=True), + ForgeDataChannel( + res="colossalchests:channel_main", + version="1.0.0", + required=True, + ), + ForgeDataChannel(res="selene:network", version="1", required=False), + ForgeDataChannel( + res="craftingtweaks:network", + version="1.0", + required=False, + ), + ForgeDataChannel( + res="minecraft:unregister", + version="FML3", + required=True, + ), + ForgeDataChannel( + res="minecraft:register", + version="FML3", + required=True, + ), + ForgeDataChannel(res="titanium:network", version="1.0", required=True), + ForgeDataChannel( + res="easy_villagers:default", + version="1.0.0", + required=True, + ), + ForgeDataChannel(res="pipez:default", version="1.0.0", required=True), + ForgeDataChannel(res="mantle:network", version="1", required=False), + ForgeDataChannel(res="quark:main", version="1", required=False), + ForgeDataChannel( + res="xaerominimap:main", + version="1.0", + required=True, + ), + ForgeDataChannel( + res="fastbench:channel", + version="4.6.0", + required=True, + ), + ForgeDataChannel(res="polymorph:main", version="1", required=False), + ForgeDataChannel( + res="storagedrawers:main_channel", + version="1", + required=False, + ), + ForgeDataChannel( + res="enercell:network", + version="0.0.0", + required=False, + ), + ForgeDataChannel(res="appleskin:sync", version="1", required=True), + ForgeDataChannel( + res="modularrouters:main_channel", + version="2", + required=False, + ), + ForgeDataChannel( + res="the_vault:network", + version="0.26.0", + required=False, + ), + ForgeDataChannel( + res="modernui:fluxnetworks", + version="707", + required=False, + ), ], ), ( "mods", [ - {"modid": "rsrequestify", "modmarker": "2.2.0"}, - {"modid": "cyclopscore", "modmarker": "1.15.1"}, - {"modid": "auudio", "modmarker": "1.0.3"}, - {"modid": "auxiliaryblocks", "modmarker": "1.18.2-0.0.14"}, - {"modid": "supermartijn642configlib", "modmarker": "1.1.6"}, - {"modid": "alexsmobs", "modmarker": "1.18.6"}, - {"modid": "architects_palette", "modmarker": "1.1.2"}, - {"modid": "cagerium", "modmarker": "1.18.2-1.1.0"}, - {"modid": "mcwwindows", "modmarker": "2.0.3"}, - { - "modid": "sophisticatedcore", - "modmarker": "1.18.2-0.5.32.179", - }, - {"modid": "thermal", "modmarker": "1.6.3.28"}, - {"modid": "rftoolsbase", "modmarker": "1.18-3.0.9"}, - {"modid": "initialinventory", "modmarker": "6.0.8"}, - {"modid": "irongenerators", "modmarker": "2.0.1"}, - {"modid": "xaeroworldmap", "modmarker": "1.25.1"}, - {"modid": "cookingforblockheads", "modmarker": "12.0.2"}, - { - "modid": "controlling", - "modmarker": "", - }, - {"modid": "xnet", "modmarker": "1.18-4.0.5"}, - {"modid": "placebo", "modmarker": "6.4.1"}, - {"modid": "citadel", "modmarker": "1.11.3"}, - {"modid": "powah", "modmarker": "3.0.1-beta"}, - {"modid": "bookshelf", "modmarker": "13.2.50"}, - {"modid": "lootbeams", "modmarker": "1.18.1"}, - { - "modid": "sophisticatedbackpacks", - "modmarker": "1.18.2-3.18.35.752", - }, - {"modid": "twigs", "modmarker": "1.1.4-patch1+1.18.2"}, - { - "modid": "buildinggadgets", - "modmarker": "3.13.0-build.5+mc1.18.2}", - }, - {"modid": "darkutils", "modmarker": "10.0.5"}, - {"modid": "mcwdoors", "modmarker": "1.0.6"}, - {"modid": "waddles", "modmarker": "1.18.2-0.8.19"}, - {"modid": "mekanismgenerators", "modmarker": "10.2.5"}, - {"modid": "balm", "modmarker": "3.2.0+0"}, - {"modid": "waila", "modmarker": ""}, - {"modid": "jeresources", "modmarker": "0.14.1.171"}, - { - "modid": "cloth_config", - "modmarker": "", - }, - {"modid": "shetiphiancore", "modmarker": "3.10.10"}, - {"modid": "dummmmmmy", "modmarker": "1.18-1.5.2"}, - {"modid": "supplementaries", "modmarker": "1.18.2-1.5.13"}, - {"modid": "refinedstorage", "modmarker": "1.10.2"}, - {"modid": "konkrete", "modmarker": "1.3.3"}, - {"modid": "easy_piglins", "modmarker": "1.18.2-1.0.0"}, - {"modid": "corpse", "modmarker": "1.18.2-1.0.2"}, - {"modid": "packmenu", "modmarker": ""}, - {"modid": "mcwbridges", "modmarker": "2.0.3"}, - {"modid": "torchmaster", "modmarker": "18.1.0"}, - {"modid": "compressium", "modmarker": "1.4.2-build.9+mc1.18.2"}, - {"modid": "ping", "modmarker": "1.18-1.8.0"}, - {"modid": "ironfurnaces", "modmarker": "3.3.1"}, - {"modid": "mcwtrpdoors", "modmarker": "1.0.6"}, - {"modid": "mcwfences", "modmarker": "1.0.5"}, - {"modid": "supermartijn642corelib", "modmarker": "1.0.19"}, - {"modid": "simplylight", "modmarker": "1.18.2-1.4.2-build.31"}, - {"modid": "botania", "modmarker": "1.18.2-434"}, - {"modid": "highlighter", "modmarker": "ANY"}, - {"modid": "spark", "modmarker": ""}, - {"modid": "curios", "modmarker": "1.18.2-5.0.7.1"}, - {"modid": "patchouli", "modmarker": "1.18.2-71.1"}, - {"modid": "camera", "modmarker": "1.18.2-1.0.4"}, - {"modid": "blockcarpentry", "modmarker": "1.18-0.3.0"}, - {"modid": "thermal_foundation", "modmarker": "1.6.3.28"}, - {"modid": "thermal_expansion", "modmarker": "1.6.3.13"}, - {"modid": "libnonymous", "modmarker": "2.1.0"}, - {"modid": "elevatorid", "modmarker": "1.18.2-1.8.4"}, - {"modid": "runelic", "modmarker": "11.0.1"}, - { - "modid": "worldedit", - "modmarker": "", - }, - {"modid": "cfm", "modmarker": "7.0.0-pre29"}, - {"modid": "architectury", "modmarker": "4.9.84"}, - {"modid": "weirdinggadget", "modmarker": "2.2.11"}, - {"modid": "mcwfurnitures", "modmarker": "3.0.0"}, - {"modid": "trashcans", "modmarker": "1.0.15"}, - {"modid": "mcwlights", "modmarker": "1.0.3"}, - {"modid": "cucumber", "modmarker": "5.1.2"}, - {"modid": "snad", "modmarker": "1.18.2-1.22.04.15a"}, - {"modid": "jei", "modmarker": "9.7.0.209"}, - {"modid": "ae2", "modmarker": "11.1.4"}, - {"modid": "mekanism", "modmarker": "10.2.5"}, - {"modid": "bdlib", "modmarker": "1.19.3.7"}, - {"modid": "create", "modmarker": "0.5.0.d"}, - {"modid": "waystones", "modmarker": "10.1.0"}, - {"modid": "clumps", "modmarker": "8.0.0+10"}, - {"modid": "shutupexperimentalsettings", "modmarker": "1.0.5"}, - {"modid": "comforts", "modmarker": "1.18.2-5.0.0.4"}, - {"modid": "naturescompass", "modmarker": "1.18.2-1.9.7-forge"}, - {"modid": "storagenetwork", "modmarker": "1.18.2-1.6.1"}, - {"modid": "framedcompactdrawers", "modmarker": "1.18-4.1.0"}, - {"modid": "decorative_blocks", "modmarker": "2.1.0"}, - {"modid": "botanypots", "modmarker": "8.0.12"}, - {"modid": "ftbbackups2", "modmarker": "1.0.17"}, - {"modid": "cofh_core", "modmarker": "1.6.4.21"}, - {"modid": "mcjtylib", "modmarker": "1.18-6.0.15"}, - {"modid": "ispawner", "modmarker": "1.0"}, - {"modid": "everycomp", "modmarker": "1.18.2-1.5.7"}, - {"modid": "jeitweaker", "modmarker": "3.0.0.8"}, - {"modid": "terralith", "modmarker": "0.0NONE"}, - {"modid": "mininggadgets", "modmarker": "1.11.0"}, - {"modid": "crafttweaker", "modmarker": "9.1.197"}, - {"modid": "akashictome", "modmarker": "1.5-20"}, - {"modid": "forge", "modmarker": "ANY"}, - {"modid": "colossalchests", "modmarker": "1.8.3"}, - {"modid": "selene", "modmarker": "1.18.2-1.17.9"}, - {"modid": "drippyloadingscreen", "modmarker": "1.6.4"}, - { - "modid": "craftingtweaks", - "modmarker": "", - }, - {"modid": "minecraft", "modmarker": "1.18.2"}, - {"modid": "terrablender", "modmarker": "1.18.2-1.1.0.102"}, - { - "modid": "sophisticatedbackpacksvh", - "modmarker": "1.18.2-1.0.4.12", - }, - {"modid": "mousetweaks", "modmarker": "ANY"}, - {"modid": "titanium", "modmarker": "3.5.6"}, - {"modid": "jade", "modmarker": ""}, - {"modid": "createtweaker", "modmarker": "2.0.0.17"}, - {"modid": "easy_villagers", "modmarker": "1.18.2-1.0.10"}, - {"modid": "pipez", "modmarker": "1.18.2-1.1.5"}, - {"modid": "iceberg", "modmarker": "ANY"}, - {"modid": "flywheel", "modmarker": ""}, - {"modid": "mantle", "modmarker": "1.9.27"}, - {"modid": "ecologics", "modmarker": "1.7.3"}, - {"modid": "quark", "modmarker": "3.2-358"}, - {"modid": "xaerominimap", "modmarker": "22.11.1"}, - {"modid": "pigpen", "modmarker": "8.0.1"}, - {"modid": "fastbench", "modmarker": "6.0.2"}, - {"modid": "polymorph", "modmarker": "1.18.2-0.44"}, - {"modid": "autoreglib", "modmarker": "1.7-53"}, - {"modid": "storagedrawers", "modmarker": "10.2.1"}, - {"modid": "fluxnetworks", "modmarker": "7.0.7.8"}, - {"modid": "neoncraft2", "modmarker": "2.2"}, - {"modid": "enercell", "modmarker": "0.0NONE"}, - {"modid": "appleskin", "modmarker": "2.4.0+mc1.18"}, - { - "modid": "ferritecore", - "modmarker": "", - }, - {"modid": "modularrouters", "modmarker": "9.1.1-93"}, - {"modid": "refinedstorageaddons", "modmarker": "0.8.2"}, - {"modid": "openloader", "modmarker": "12.0.1"}, - {"modid": "the_vault", "modmarker": "1.18.2-2.0.10.869"}, + ForgeDataMod(modid="rsrequestify", modmarker="2.2.0"), + ForgeDataMod(modid="cyclopscore", modmarker="1.15.1"), + ForgeDataMod(modid="auudio", modmarker="1.0.3"), + ForgeDataMod(modid="auxiliaryblocks", modmarker="1.18.2-0.0.14"), + ForgeDataMod(modid="supermartijn642configlib", modmarker="1.1.6"), + ForgeDataMod(modid="alexsmobs", modmarker="1.18.6"), + ForgeDataMod(modid="architects_palette", modmarker="1.1.2"), + ForgeDataMod(modid="cagerium", modmarker="1.18.2-1.1.0"), + ForgeDataMod(modid="mcwwindows", modmarker="2.0.3"), + ForgeDataMod( + modid="sophisticatedcore", + modmarker="1.18.2-0.5.32.179", + ), + ForgeDataMod(modid="thermal", modmarker="1.6.3.28"), + ForgeDataMod(modid="rftoolsbase", modmarker="1.18-3.0.9"), + ForgeDataMod(modid="initialinventory", modmarker="6.0.8"), + ForgeDataMod(modid="irongenerators", modmarker="2.0.1"), + ForgeDataMod(modid="xaeroworldmap", modmarker="1.25.1"), + ForgeDataMod(modid="cookingforblockheads", modmarker="12.0.2"), + ForgeDataMod( + modid="controlling", + modmarker="", + ), + ForgeDataMod(modid="xnet", modmarker="1.18-4.0.5"), + ForgeDataMod(modid="placebo", modmarker="6.4.1"), + ForgeDataMod(modid="citadel", modmarker="1.11.3"), + ForgeDataMod(modid="powah", modmarker="3.0.1-beta"), + ForgeDataMod(modid="bookshelf", modmarker="13.2.50"), + ForgeDataMod(modid="lootbeams", modmarker="1.18.1"), + ForgeDataMod( + modid="sophisticatedbackpacks", + modmarker="1.18.2-3.18.35.752", + ), + ForgeDataMod(modid="twigs", modmarker="1.1.4-patch1+1.18.2"), + ForgeDataMod( + modid="buildinggadgets", + modmarker="3.13.0-build.5+mc1.18.2}", + ), + ForgeDataMod(modid="darkutils", modmarker="10.0.5"), + ForgeDataMod(modid="mcwdoors", modmarker="1.0.6"), + ForgeDataMod(modid="waddles", modmarker="1.18.2-0.8.19"), + ForgeDataMod(modid="mekanismgenerators", modmarker="10.2.5"), + ForgeDataMod(modid="balm", modmarker="3.2.0+0"), + ForgeDataMod(modid="waila", modmarker=""), + ForgeDataMod(modid="jeresources", modmarker="0.14.1.171"), + ForgeDataMod( + modid="cloth_config", + modmarker="", + ), + ForgeDataMod(modid="shetiphiancore", modmarker="3.10.10"), + ForgeDataMod(modid="dummmmmmy", modmarker="1.18-1.5.2"), + ForgeDataMod(modid="supplementaries", modmarker="1.18.2-1.5.13"), + ForgeDataMod(modid="refinedstorage", modmarker="1.10.2"), + ForgeDataMod(modid="konkrete", modmarker="1.3.3"), + ForgeDataMod(modid="easy_piglins", modmarker="1.18.2-1.0.0"), + ForgeDataMod(modid="corpse", modmarker="1.18.2-1.0.2"), + ForgeDataMod(modid="packmenu", modmarker=""), + ForgeDataMod(modid="mcwbridges", modmarker="2.0.3"), + ForgeDataMod(modid="torchmaster", modmarker="18.1.0"), + ForgeDataMod(modid="compressium", modmarker="1.4.2-build.9+mc1.18.2"), + ForgeDataMod(modid="ping", modmarker="1.18-1.8.0"), + ForgeDataMod(modid="ironfurnaces", modmarker="3.3.1"), + ForgeDataMod(modid="mcwtrpdoors", modmarker="1.0.6"), + ForgeDataMod(modid="mcwfences", modmarker="1.0.5"), + ForgeDataMod(modid="supermartijn642corelib", modmarker="1.0.19"), + ForgeDataMod(modid="simplylight", modmarker="1.18.2-1.4.2-build.31"), + ForgeDataMod(modid="botania", modmarker="1.18.2-434"), + ForgeDataMod(modid="highlighter", modmarker="ANY"), + ForgeDataMod(modid="spark", modmarker=""), + ForgeDataMod(modid="curios", modmarker="1.18.2-5.0.7.1"), + ForgeDataMod(modid="patchouli", modmarker="1.18.2-71.1"), + ForgeDataMod(modid="camera", modmarker="1.18.2-1.0.4"), + ForgeDataMod(modid="blockcarpentry", modmarker="1.18-0.3.0"), + ForgeDataMod(modid="thermal_foundation", modmarker="1.6.3.28"), + ForgeDataMod(modid="thermal_expansion", modmarker="1.6.3.13"), + ForgeDataMod(modid="libnonymous", modmarker="2.1.0"), + ForgeDataMod(modid="elevatorid", modmarker="1.18.2-1.8.4"), + ForgeDataMod(modid="runelic", modmarker="11.0.1"), + ForgeDataMod( + modid="worldedit", + modmarker="", + ), + ForgeDataMod(modid="cfm", modmarker="7.0.0-pre29"), + ForgeDataMod(modid="architectury", modmarker="4.9.84"), + ForgeDataMod(modid="weirdinggadget", modmarker="2.2.11"), + ForgeDataMod(modid="mcwfurnitures", modmarker="3.0.0"), + ForgeDataMod(modid="trashcans", modmarker="1.0.15"), + ForgeDataMod(modid="mcwlights", modmarker="1.0.3"), + ForgeDataMod(modid="cucumber", modmarker="5.1.2"), + ForgeDataMod(modid="snad", modmarker="1.18.2-1.22.04.15a"), + ForgeDataMod(modid="jei", modmarker="9.7.0.209"), + ForgeDataMod(modid="ae2", modmarker="11.1.4"), + ForgeDataMod(modid="mekanism", modmarker="10.2.5"), + ForgeDataMod(modid="bdlib", modmarker="1.19.3.7"), + ForgeDataMod(modid="create", modmarker="0.5.0.d"), + ForgeDataMod(modid="waystones", modmarker="10.1.0"), + ForgeDataMod(modid="clumps", modmarker="8.0.0+10"), + ForgeDataMod(modid="shutupexperimentalsettings", modmarker="1.0.5"), + ForgeDataMod(modid="comforts", modmarker="1.18.2-5.0.0.4"), + ForgeDataMod(modid="naturescompass", modmarker="1.18.2-1.9.7-forge"), + ForgeDataMod(modid="storagenetwork", modmarker="1.18.2-1.6.1"), + ForgeDataMod(modid="framedcompactdrawers", modmarker="1.18-4.1.0"), + ForgeDataMod(modid="decorative_blocks", modmarker="2.1.0"), + ForgeDataMod(modid="botanypots", modmarker="8.0.12"), + ForgeDataMod(modid="ftbbackups2", modmarker="1.0.17"), + ForgeDataMod(modid="cofh_core", modmarker="1.6.4.21"), + ForgeDataMod(modid="mcjtylib", modmarker="1.18-6.0.15"), + ForgeDataMod(modid="ispawner", modmarker="1.0"), + ForgeDataMod(modid="everycomp", modmarker="1.18.2-1.5.7"), + ForgeDataMod(modid="jeitweaker", modmarker="3.0.0.8"), + ForgeDataMod(modid="terralith", modmarker="0.0NONE"), + ForgeDataMod(modid="mininggadgets", modmarker="1.11.0"), + ForgeDataMod(modid="crafttweaker", modmarker="9.1.197"), + ForgeDataMod(modid="akashictome", modmarker="1.5-20"), + ForgeDataMod(modid="forge", modmarker="ANY"), + ForgeDataMod(modid="colossalchests", modmarker="1.8.3"), + ForgeDataMod(modid="selene", modmarker="1.18.2-1.17.9"), + ForgeDataMod(modid="drippyloadingscreen", modmarker="1.6.4"), + ForgeDataMod( + modid="craftingtweaks", + modmarker="", + ), + ForgeDataMod(modid="minecraft", modmarker="1.18.2"), + ForgeDataMod(modid="terrablender", modmarker="1.18.2-1.1.0.102"), + ForgeDataMod( + modid="sophisticatedbackpacksvh", + modmarker="1.18.2-1.0.4.12", + ), + ForgeDataMod(modid="mousetweaks", modmarker="ANY"), + ForgeDataMod(modid="titanium", modmarker="3.5.6"), + ForgeDataMod(modid="jade", modmarker=""), + ForgeDataMod(modid="createtweaker", modmarker="2.0.0.17"), + ForgeDataMod(modid="easy_villagers", modmarker="1.18.2-1.0.10"), + ForgeDataMod(modid="pipez", modmarker="1.18.2-1.1.5"), + ForgeDataMod(modid="iceberg", modmarker="ANY"), + ForgeDataMod(modid="flywheel", modmarker=""), + ForgeDataMod(modid="mantle", modmarker="1.9.27"), + ForgeDataMod(modid="ecologics", modmarker="1.7.3"), + ForgeDataMod(modid="quark", modmarker="3.2-358"), + ForgeDataMod(modid="xaerominimap", modmarker="22.11.1"), + ForgeDataMod(modid="pigpen", modmarker="8.0.1"), + ForgeDataMod(modid="fastbench", modmarker="6.0.2"), + ForgeDataMod(modid="polymorph", modmarker="1.18.2-0.44"), + ForgeDataMod(modid="autoreglib", modmarker="1.7-53"), + ForgeDataMod(modid="storagedrawers", modmarker="10.2.1"), + ForgeDataMod(modid="fluxnetworks", modmarker="7.0.7.8"), + ForgeDataMod(modid="neoncraft2", modmarker="2.2"), + ForgeDataMod(modid="enercell", modmarker="0.0NONE"), + ForgeDataMod(modid="appleskin", modmarker="2.4.0+mc1.18"), + ForgeDataMod( + modid="ferritecore", + modmarker="", + ), + ForgeDataMod(modid="modularrouters", modmarker="9.1.1-93"), + ForgeDataMod(modid="refinedstorageaddons", modmarker="0.8.2"), + ForgeDataMod(modid="openloader", modmarker="12.0.1"), + ForgeDataMod(modid="the_vault", modmarker="1.18.2-2.0.10.869"), ], ), ("truncated", False), From c6372a08eea76c7860d476ef4f3f0e9455242872 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sat, 15 Jul 2023 20:56:21 -0500 Subject: [PATCH 32/67] Remove unused imports --- mcstatus/status_response.py | 2 +- tests/status_response/test_java.py | 12 ++---------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/mcstatus/status_response.py b/mcstatus/status_response.py index c35a01e4..33ff9933 100644 --- a/mcstatus/status_response.py +++ b/mcstatus/status_response.py @@ -4,7 +4,7 @@ from dataclasses import dataclass from typing import Any, TYPE_CHECKING -from mcstatus.forge_data import ForgeData, ForgeDataChannel, ForgeDataMod, RawForgeData +from mcstatus.forge_data import ForgeData, RawForgeData from mcstatus.motd import Motd if TYPE_CHECKING: diff --git a/tests/status_response/test_java.py b/tests/status_response/test_java.py index a57dbf21..f4c4df0a 100644 --- a/tests/status_response/test_java.py +++ b/tests/status_response/test_java.py @@ -1,16 +1,8 @@ from pytest import fixture -from mcstatus.forge_data import RawForgeData, RawForgeDataChannel, RawForgeDataMod +from mcstatus.forge_data import ForgeDataChannel, ForgeDataMod, RawForgeData, RawForgeDataChannel, RawForgeDataMod from mcstatus.motd import Motd -from mcstatus.status_response import ( - ForgeData, - ForgeDataChannel, - ForgeDataMod, - JavaStatusPlayer, - JavaStatusPlayers, - JavaStatusResponse, - JavaStatusVersion, -) +from mcstatus.status_response import ForgeData, JavaStatusPlayer, JavaStatusPlayers, JavaStatusResponse, JavaStatusVersion from tests.status_response import BaseStatusResponseTest From 02914eb2058f5eaa91ad51f61b204f6dd5b57d8c Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sat, 15 Jul 2023 21:27:52 -0500 Subject: [PATCH 33/67] Seperate forge channel and mod decoding into their new respective dataclasses --- mcstatus/forge_data.py | 90 +++++++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 40 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 90feb22b..ee08f815 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -66,11 +66,31 @@ class ForgeDataChannel: def build(cls, raw: RawForgeDataChannel) -> Self: """Build an object about Forge channel from raw response. - :param raw: ``forgeData`` attribute in raw response :class:`dict`. + :param raw: ``channel`` element in raw forge response :class:`dict`. :return: :class:`ForgeDataChannel` object. """ return cls(res=raw["res"], version=raw["version"], required=raw["required"]) + @classmethod + def decode(cls, buffer: Connection, mod_id: str | None = None) -> Self: + """Decode an object about Forge channel from decoded optimized buffer. + + :param buffer: :class:`Connection` object from UTF-16 encoded binary data. + :param mod_id: Optional mod id prefix :class:`str`. + :return: :class:`ForgeDataChannel` object. + """ + channel_identifier = buffer.read_utf() + if mod_id is not None: + channel_identifier = f"{mod_id}:{channel_identifier}" + version = buffer.read_utf() + client_required = buffer.read_bool() + + return cls( + res=channel_identifier, + version=version, + required=client_required, + ) + @dataclass class ForgeDataMod: @@ -82,11 +102,34 @@ class ForgeDataMod: def build(cls, raw: RawForgeDataMod) -> Self: """Build an object about Forge mod from raw response. - :param raw: ``forgeData`` attribute in raw response :class:`dict`. + :param raw: ``mod`` element in raw forge response :class:`dict`. :return: :class:`ForgeDataMod` object. """ return cls(modid=raw["modid"], modmarker=raw["modmarker"]) + @classmethod + def decode(cls, buffer: Connection) -> tuple[Self, list[ForgeDataChannel]]: + """Decode data about a Forge mod from decoded optimized buffer. + + :param buffer: :class:`Connection` object from UTF-16 encoded binary data. + :return: :class:`tuple` object of :class:`ForgeDataMod` object and :class:`list` of :class:`ForgeDataChannel` objects. + """ + channel_version_flags = buffer.read_varint() + + channel_count = channel_version_flags >> 1 + is_server = channel_version_flags & VERSION_FLAG_IGNORE_SERVER_ONLY != 0 + mod_id = buffer.read_utf() + + mod_version = IGNORE_SERVER_ONLY + if not is_server: + mod_version = buffer.read_utf() + + channels = [] + for _ in range(channel_count): + channels.append(ForgeDataChannel.decode(buffer, mod_id)) + + return cls(modid=mod_id, modmarker=mod_version), channels + @dataclass class ForgeData: @@ -156,47 +199,14 @@ def build(cls, raw: RawForgeData) -> Self: mod_count = buffer.read_ushort() try: for _ in range(mod_count): - channel_version_flags = buffer.read_varint() - - channel_count = channel_version_flags >> 1 - is_server = channel_version_flags & VERSION_FLAG_IGNORE_SERVER_ONLY != 0 - mod_id = buffer.read_utf() - - mod_version = IGNORE_SERVER_ONLY - if not is_server: - mod_version = buffer.read_utf() - - for _ in range(channel_count): - name = buffer.read_utf() - version = buffer.read_utf() - client_required = buffer.read_bool() - channels.append( - ForgeDataChannel( - res=f"{mod_id}:{name}", - version=version, - required=client_required, - ) - ) - - mods.append( - ForgeDataMod( - modid=mod_id, - modmarker=mod_version, - ) - ) + mod, mod_channels = ForgeDataMod.decode(buffer) + + channels.extend(mod_channels) + mods.append(mod) non_mod_channel_count = buffer.read_varint() for _ in range(non_mod_channel_count): - channel_identifier = buffer.read_utf() - version = buffer.read_utf() - client_required = buffer.read_bool() - channels.append( - ForgeDataChannel( - res=channel_identifier, - version=version, - required=client_required, - ) - ) + channels.append(ForgeDataChannel.decode(buffer)) except IOError: if not truncated: raise From 64ee784e38f37f212067842f0ce33c27f8c76c34 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sat, 15 Jul 2023 23:05:05 -0500 Subject: [PATCH 34/67] Initial work on string buffer --- mcstatus/forge_data.py | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index ee08f815..1938e13b 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -16,9 +16,9 @@ import io from dataclasses import dataclass -from typing import Final, TYPE_CHECKING +from typing import Final, IO, TYPE_CHECKING -from mcstatus.protocol.connection import Connection +from mcstatus.protocol.connection import BaseConnection, BaseReadSync, Connection VERSION_FLAG_IGNORE_SERVER_ONLY: Final = 0b1 IGNORE_SERVER_ONLY: Final = "" @@ -131,6 +131,30 @@ def decode(cls, buffer: Connection) -> tuple[Self, list[ForgeDataChannel]]: return cls(modid=mod_id, modmarker=mod_version), channels +class StringBuffer(BaseReadSync, BaseConnection): + """String Buffer""" + + __slots__ = ("stringio", "received") + + def __init__(self, stringio: IO[str]) -> None: + self.stringio = stringio + self.received = bytearray() + + def read(self, length: int) -> bytearray: + """Read length bytes from ``self``, and return a byte array.""" + data = bytearray() + while self.received and len(data) < length: + data.append(self.received.pop(0)) + for _ in range(length - len(data)): + result = self.stringio.read(1) + if not result: + raise IOError(f"Not enough data to read! {len(data)} < {length}") + data.extend(result.encode("utf-8")) + while len(data) > length: + self.received.append(data.pop()) + return data + + @dataclass class ForgeData: fml_network_version: int From 9025ce8a0ec50c225af2d826e4d2920a07975a32 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 16 Jul 2023 14:14:22 -0500 Subject: [PATCH 35/67] Update mcstatus/forge_data.py Co-authored-by: Perchun Pak --- mcstatus/forge_data.py | 1 - 1 file changed, 1 deletion(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 1938e13b..b327a2c9 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -203,7 +203,6 @@ def build(cls, raw: RawForgeData) -> Self: :return: :class:`ForgeData` object. """ fml_network_version = raw["fmlNetworkVersion"] - # Decode the encoded forge data if it exists. # see https://github.com/MinecraftForge/MinecraftForge/blob/7d0330eb08299935714e34ac651a293e2609aa86/src/main/java/net/minecraftforge/network/ServerStatusPing.java#L27-L73 # noqa: E501 # line too long if "d" not in raw: From 6ca01f7db12a6c0a423f721a2e1413d30f5396cc Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 16 Jul 2023 14:22:44 -0500 Subject: [PATCH 36/67] Add support for older FML network versions --- mcstatus/forge_data.py | 6 ++++-- mcstatus/status_response.py | 8 +++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index b327a2c9..2f0d7e1f 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -36,7 +36,8 @@ class RawForgeDataChannel(TypedDict): """Is this channel required for client to join?""" class RawForgeDataMod(TypedDict): - modid: str + modid: NotRequired[str] + modId: NotRequired[str] modmarker: str """Mod version.""" @@ -105,7 +106,8 @@ def build(cls, raw: RawForgeDataMod) -> Self: :param raw: ``mod`` element in raw forge response :class:`dict`. :return: :class:`ForgeDataMod` object. """ - return cls(modid=raw["modid"], modmarker=raw["modmarker"]) + # In FML v2, modid was modId instead. At least one of the two should exist. + return cls(modid=raw.get("modid", raw["modId"]), modmarker=raw["modmarker"]) @classmethod def decode(cls, buffer: Connection) -> tuple[Self, list[ForgeDataChannel]]: diff --git a/mcstatus/status_response.py b/mcstatus/status_response.py index 33ff9933..e177ccb6 100644 --- a/mcstatus/status_response.py +++ b/mcstatus/status_response.py @@ -43,6 +43,7 @@ class RawJavaResponse(TypedDict): version: RawJavaResponseVersion favicon: NotRequired[str] forgeData: NotRequired[RawForgeData] # noqa: N815 + modinfo: NotRequired[RawForgeData] else: RawJavaResponsePlayer = dict @@ -131,6 +132,11 @@ def build(cls, raw: RawJavaResponse, latency: float = 0) -> Self: ``description`` - :class:`str`) are not of the expected type. :return: :class:`JavaStatusResponse` object. """ + forge_data = None + if "forgeData" in raw: + forge_data = ForgeData.build(raw["forgeData"]) + elif "modinfo" in raw: + forge_data = ForgeData.build(raw["modinfo"]) return cls( raw=raw, players=JavaStatusPlayers.build(raw["players"]), @@ -138,7 +144,7 @@ def build(cls, raw: RawJavaResponse, latency: float = 0) -> Self: motd=Motd.parse(raw["description"], bedrock=False), icon=raw.get("favicon"), latency=latency, - forge_data=ForgeData.build(raw["forgeData"]) if "forgeData" in raw else None, + forge_data=forge_data, ) @property From bc6863c3ef05dee6ab3118f5c462bdf2e0806617 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 16 Jul 2023 14:27:03 -0500 Subject: [PATCH 37/67] Fix modid handling --- mcstatus/forge_data.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 2f0d7e1f..42172dd0 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -107,7 +107,10 @@ def build(cls, raw: RawForgeDataMod) -> Self: :return: :class:`ForgeDataMod` object. """ # In FML v2, modid was modId instead. At least one of the two should exist. - return cls(modid=raw.get("modid", raw["modId"]), modmarker=raw["modmarker"]) + modid = raw.get("modid") or raw.get("modId") + if modid is None: + raise ValueError("Mod ID must not be None") + return cls(modid=modid, modmarker=raw["modmarker"]) @classmethod def decode(cls, buffer: Connection) -> tuple[Self, list[ForgeDataChannel]]: From 32faf69a4296e40d6dfd3eff476f30e2af9805ff Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 16 Jul 2023 14:28:27 -0500 Subject: [PATCH 38/67] Ignore mixed case from network json that we can't change --- mcstatus/forge_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 42172dd0..91c9cefc 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -37,7 +37,7 @@ class RawForgeDataChannel(TypedDict): class RawForgeDataMod(TypedDict): modid: NotRequired[str] - modId: NotRequired[str] + modId: NotRequired[str] # noqa: N815 # camel case modmarker: str """Mod version.""" From 7d53e3ab2a775f3a0faaafec46c602abf599d7aa Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Mon, 17 Jul 2023 09:34:57 -0500 Subject: [PATCH 39/67] Apply suggestions from code review Co-authored-by: Perchun Pak --- mcstatus/forge_data.py | 3 ++- mcstatus/status_response.py | 7 +++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 91c9cefc..e449af86 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -109,7 +109,8 @@ def build(cls, raw: RawForgeDataMod) -> Self: # In FML v2, modid was modId instead. At least one of the two should exist. modid = raw.get("modid") or raw.get("modId") if modid is None: - raise ValueError("Mod ID must not be None") + raise ValueError(f"Mod ID in Forge mod data must be provided. Mod marker: {raw['modmarker']!r}.") + return cls(modid=modid, modmarker=raw["modmarker"]) @classmethod diff --git a/mcstatus/status_response.py b/mcstatus/status_response.py index e177ccb6..43094d77 100644 --- a/mcstatus/status_response.py +++ b/mcstatus/status_response.py @@ -133,10 +133,9 @@ def build(cls, raw: RawJavaResponse, latency: float = 0) -> Self: :return: :class:`JavaStatusResponse` object. """ forge_data = None - if "forgeData" in raw: - forge_data = ForgeData.build(raw["forgeData"]) - elif "modinfo" in raw: - forge_data = ForgeData.build(raw["modinfo"]) + if "forgeData" in raw or "modinfo" in raw: + forge_data = ForgeData.build(raw.get("forgeData") or raw.get("modinfo")) + return cls( raw=raw, players=JavaStatusPlayers.build(raw["players"]), From 1be455410369648a4ab719a90438a3acc808110d Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Mon, 17 Jul 2023 19:59:52 -0500 Subject: [PATCH 40/67] Implement tests and fixes for older versions of FML network --- mcstatus/forge_data.py | 36 ++++-- tests/status_response/test_java.py | 186 +++++++++++++++++++++-------- 2 files changed, 162 insertions(+), 60 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index e449af86..892d07a6 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -38,13 +38,15 @@ class RawForgeDataChannel(TypedDict): class RawForgeDataMod(TypedDict): modid: NotRequired[str] modId: NotRequired[str] # noqa: N815 # camel case - modmarker: str + modmarker: NotRequired[str] """Mod version.""" + version: NotRequired[str] class RawForgeData(TypedDict): - fmlNetworkVersion: int # noqa: N815 # camel case - channels: list[RawForgeDataChannel] - mods: list[RawForgeDataMod] + fmlNetworkVersion: NotRequired[int] # noqa: N815 # camel case + channels: NotRequired[list[RawForgeDataChannel]] + mods: NotRequired[list[RawForgeDataMod]] + modList: NotRequired[list[RawForgeDataMod]] d: NotRequired[str] truncated: NotRequired[bool] @@ -106,12 +108,17 @@ def build(cls, raw: RawForgeDataMod) -> Self: :param raw: ``mod`` element in raw forge response :class:`dict`. :return: :class:`ForgeDataMod` object. """ + # In FML v1, modmarker was version instead. + mod_version = raw.get("modmarker") or raw.get("version") + if mod_version is None: + raise ValueError("Mod version in Forge mod data must be provided.") + # In FML v2, modid was modId instead. At least one of the two should exist. - modid = raw.get("modid") or raw.get("modId") - if modid is None: - raise ValueError(f"Mod ID in Forge mod data must be provided. Mod marker: {raw['modmarker']!r}.") + mod_id = raw.get("modid") or raw.get("modId") + if mod_id is None: + raise ValueError(f"Mod ID in Forge mod data must be provided. Mod version: {mod_version!r}.") - return cls(modid=modid, modmarker=raw["modmarker"]) + return cls(modid=mod_id, modmarker=mod_version) @classmethod def decode(cls, buffer: Connection) -> tuple[Self, list[ForgeDataChannel]]: @@ -202,20 +209,25 @@ def read() -> int: return buffer @classmethod - def build(cls, raw: RawForgeData) -> Self: + def build(cls, raw: RawForgeData) -> Self | None: """Build an object about Forge mods from raw response. :param raw: ``forgeData`` attribute in raw response :class:`dict`. :return: :class:`ForgeData` object. """ - fml_network_version = raw["fmlNetworkVersion"] + fml_network_version = 1 + if "fmlNetworkVersion" in raw: + fml_network_version = raw["fmlNetworkVersion"] # see https://github.com/MinecraftForge/MinecraftForge/blob/7d0330eb08299935714e34ac651a293e2609aa86/src/main/java/net/minecraftforge/network/ServerStatusPing.java#L27-L73 # noqa: E501 # line too long if "d" not in raw: + mod_list = raw.get("mods") or raw.get("modList") + if mod_list is None: + return None return cls( fml_network_version=fml_network_version, - channels=[ForgeDataChannel.build(channel) for channel in raw["channels"]], - mods=[ForgeDataMod.build(mod) for mod in raw["mods"]], + channels=[ForgeDataChannel.build(channel) for channel in raw.get("channels", ())], + mods=[ForgeDataMod.build(mod) for mod in mod_list], truncated=False, ) diff --git a/tests/status_response/test_java.py b/tests/status_response/test_java.py index f4c4df0a..846cda8b 100644 --- a/tests/status_response/test_java.py +++ b/tests/status_response/test_java.py @@ -1,7 +1,7 @@ from pytest import fixture from mcstatus.forge_data import ForgeDataChannel, ForgeDataMod, RawForgeData, RawForgeDataChannel, RawForgeDataMod -from mcstatus.motd import Motd +from mcstatus.motd import Formatting, Motd from mcstatus.status_response import ForgeData, JavaStatusPlayer, JavaStatusPlayers, JavaStatusResponse, JavaStatusVersion from tests.status_response import BaseStatusResponseTest @@ -103,53 +103,6 @@ def build(self): return JavaStatusVersion.build({"name": "1.8-pre1", "protocol": 44}) -@BaseStatusResponseTest.construct -class TestOldForgeData(BaseStatusResponseTest): - EXPECTED_VALUES = [ - ("fml_network_version", 2), - ( - "channels", - [ - ForgeDataChannel( - res="cyclopscore:channel_main", - version="1.0.0", - required=True, - ), - ], - ), - ( - "mods", - [ - ForgeDataMod(modid="rsrequestify", modmarker="2.2.0"), - ], - ), - ("truncated", False), - ] - - @fixture(scope="class") - def build(self): - return ForgeData.build( - RawForgeData( - { - "channels": [ - RawForgeDataChannel( - { - "res": "cyclopscore:channel_main", - "version": "1.0.0", - "required": True, - } - ), - ], - "fmlNetworkVersion": 2, - "mods": [ - RawForgeDataMod({"modid": "rsrequestify", "modmarker": "2.2.0"}), - ], - "truncated": False, - } - ) - ) - - @BaseStatusResponseTest.construct class TestForgeData(BaseStatusResponseTest): EXPECTED_VALUES = [ @@ -700,3 +653,140 @@ def build(self): } ) ) + + +@BaseStatusResponseTest.construct +class TestForgeDataV1(TestJavaStatusResponse): + RAW = { + "description": {"text": "A Minecraft Server"}, + "players": {"max": 20, "online": 0}, + "version": {"name": "1.12.2", "protocol": 340}, + "modinfo": { + "type": "FML", + "modList": [ + {"modid": "minecraft", "version": "1.12.2"}, + {"modid": "mcp", "version": "9.42"}, + {"modid": "FML", "version": "8.0.99.99"}, + {"modid": "forge", "version": "14.23.5.2859"}, + ], + }, + } + + EXPECTED_VALUES = [ + ("players", JavaStatusPlayers(0, 20, None)), + ("version", JavaStatusVersion("1.12.2", 340)), + ("motd", Motd(parsed=["A Minecraft Server", Formatting.RESET], raw={"text": "A Minecraft Server"}, bedrock=False)), + ("latency", 0), + ("raw", RAW), + ( + "forge_data", + ForgeData( + fml_network_version=1, + channels=[], + mods=[ + ForgeDataMod(modid="minecraft", modmarker="1.12.2"), + ForgeDataMod(modid="mcp", modmarker="9.42"), + ForgeDataMod(modid="FML", modmarker="8.0.99.99"), + ForgeDataMod(modid="forge", modmarker="14.23.5.2859"), + ], + truncated=False, + ), + ), + ] + OPTIONAL_FIELDS = [], { + "players": {"max": 20, "online": 0}, + "version": {"name": "1.12.2", "protocol": 340}, + "description": "A Minecraft Server", + } + + +@BaseStatusResponseTest.construct +class TestForgeDataV2(TestJavaStatusResponse): + RAW = { + "description": {"text": "A Minecraft Server"}, + "players": {"max": 20, "online": 0}, + "version": {"name": "1.13.2", "protocol": 404}, + "forgeData": { + "fmlNetworkVersion": 2, + "channels": [], + "mods": [ + {"modId": "forge", "modmarker": "ANY"}, + ], + }, + } + + EXPECTED_VALUES = [ + ("players", JavaStatusPlayers(0, 20, None)), + ("version", JavaStatusVersion("1.13.2", 404)), + ("motd", Motd(parsed=["A Minecraft Server", Formatting.RESET], raw={"text": "A Minecraft Server"}, bedrock=False)), + ("latency", 0), + ("raw", RAW), + ( + "forge_data", + ForgeData( + fml_network_version=2, + channels=[], + mods=[ + ForgeDataMod(modid="forge", modmarker="ANY"), + ], + truncated=False, + ), + ), + ] + OPTIONAL_FIELDS = [], { + "players": {"max": 20, "online": 0}, + "version": {"name": "1.13.2", "protocol": 404}, + "description": "A Minecraft Server", + } + + +@BaseStatusResponseTest.construct +class TestForgeDataV3(TestJavaStatusResponse): + RAW = { + "enforcesSecureChat": True, + "forgeData": { + "channels": [], + "mods": [], + "truncated": False, + "fmlNetworkVersion": 3, + "d": bytes.fromhex( + "5e0000e0a084e390a4e78d8be39996e2b98ce1a698ccbae2b8b1e681a4e492b8e2a191e29ba7e6b2aee5a" + "999e3a8b9e789a5e0b088e384b5e0a69ae28280e6b2aee5a999e3a8b9e789a5e0b088e384b5e0a69ae581" + "80e6b380e5b29be38ab3e48483e38a9ce580b1e2ad8be79ca6e6b9abe1b29be392bae69daee68886e482b" + "8e2a081dcb0e2b68ee5b49ae1a281e384ae02" + ).decode("utf8"), + }, + "description": {"text": "A Minecraft Server"}, + "players": {"max": 20, "online": 0}, + "version": {"name": "1.20.1", "protocol": 763}, + } + + EXPECTED_VALUES = [ + ("players", JavaStatusPlayers(0, 20, None)), + ("version", JavaStatusVersion("1.20.1", 763)), + ("motd", Motd(parsed=["A Minecraft Server", Formatting.RESET], raw={"text": "A Minecraft Server"}, bedrock=False)), + ("latency", 0), + ("raw", RAW), + ( + "forge_data", + ForgeData( + fml_network_version=3, + channels=[ + ForgeDataChannel(res="minecraft:unregister", version="FML3", required=True), + ForgeDataChannel(res="minecraft:register", version="FML3", required=True), + ForgeDataChannel(res="forge:tier_sorting", version="1.0", required=False), + ForgeDataChannel(res="forge:split", version="1.1", required=True), + ], + mods=[ + ForgeDataMod(modid="minecraft", modmarker="1.20.1"), + ForgeDataMod(modid="forge", modmarker="ANY"), + ], + truncated=False, + ), + ), + ] + OPTIONAL_FIELDS = [], { + "players": {"max": 20, "online": 0}, + "version": {"name": "1.20.1", "protocol": 763}, + "description": "A Minecraft Server", + } From 200c834c71f505ad0e621105c8940071ee53ba29 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Mon, 17 Jul 2023 20:04:45 -0500 Subject: [PATCH 41/67] Rename `ForgeMod` attributes to be more pythonic --- mcstatus/forge_data.py | 9 +- tests/status_response/test_java.py | 304 ++++++++++++++--------------- 2 files changed, 156 insertions(+), 157 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 892d07a6..00960325 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -97,9 +97,8 @@ def decode(cls, buffer: Connection, mod_id: str | None = None) -> Self: @dataclass class ForgeDataMod: - modid: str - modmarker: str - """Mod version.""" + mod_id: str + mod_version: str @classmethod def build(cls, raw: RawForgeDataMod) -> Self: @@ -118,7 +117,7 @@ def build(cls, raw: RawForgeDataMod) -> Self: if mod_id is None: raise ValueError(f"Mod ID in Forge mod data must be provided. Mod version: {mod_version!r}.") - return cls(modid=mod_id, modmarker=mod_version) + return cls(mod_id=mod_id, mod_version=mod_version) @classmethod def decode(cls, buffer: Connection) -> tuple[Self, list[ForgeDataChannel]]: @@ -141,7 +140,7 @@ def decode(cls, buffer: Connection) -> tuple[Self, list[ForgeDataChannel]]: for _ in range(channel_count): channels.append(ForgeDataChannel.decode(buffer, mod_id)) - return cls(modid=mod_id, modmarker=mod_version), channels + return cls(mod_id=mod_id, mod_version=mod_version), channels class StringBuffer(BaseReadSync, BaseConnection): diff --git a/tests/status_response/test_java.py b/tests/status_response/test_java.py index 846cda8b..5b4f98a9 100644 --- a/tests/status_response/test_java.py +++ b/tests/status_response/test_java.py @@ -356,163 +356,163 @@ class TestForgeData(BaseStatusResponseTest): ( "mods", [ - ForgeDataMod(modid="rsrequestify", modmarker="2.2.0"), - ForgeDataMod(modid="cyclopscore", modmarker="1.15.1"), - ForgeDataMod(modid="auudio", modmarker="1.0.3"), - ForgeDataMod(modid="auxiliaryblocks", modmarker="1.18.2-0.0.14"), - ForgeDataMod(modid="supermartijn642configlib", modmarker="1.1.6"), - ForgeDataMod(modid="alexsmobs", modmarker="1.18.6"), - ForgeDataMod(modid="architects_palette", modmarker="1.1.2"), - ForgeDataMod(modid="cagerium", modmarker="1.18.2-1.1.0"), - ForgeDataMod(modid="mcwwindows", modmarker="2.0.3"), + ForgeDataMod(mod_id="rsrequestify", mod_version="2.2.0"), + ForgeDataMod(mod_id="cyclopscore", mod_version="1.15.1"), + ForgeDataMod(mod_id="auudio", mod_version="1.0.3"), + ForgeDataMod(mod_id="auxiliaryblocks", mod_version="1.18.2-0.0.14"), + ForgeDataMod(mod_id="supermartijn642configlib", mod_version="1.1.6"), + ForgeDataMod(mod_id="alexsmobs", mod_version="1.18.6"), + ForgeDataMod(mod_id="architects_palette", mod_version="1.1.2"), + ForgeDataMod(mod_id="cagerium", mod_version="1.18.2-1.1.0"), + ForgeDataMod(mod_id="mcwwindows", mod_version="2.0.3"), ForgeDataMod( - modid="sophisticatedcore", - modmarker="1.18.2-0.5.32.179", - ), - ForgeDataMod(modid="thermal", modmarker="1.6.3.28"), - ForgeDataMod(modid="rftoolsbase", modmarker="1.18-3.0.9"), - ForgeDataMod(modid="initialinventory", modmarker="6.0.8"), - ForgeDataMod(modid="irongenerators", modmarker="2.0.1"), - ForgeDataMod(modid="xaeroworldmap", modmarker="1.25.1"), - ForgeDataMod(modid="cookingforblockheads", modmarker="12.0.2"), + mod_id="sophisticatedcore", + mod_version="1.18.2-0.5.32.179", + ), + ForgeDataMod(mod_id="thermal", mod_version="1.6.3.28"), + ForgeDataMod(mod_id="rftoolsbase", mod_version="1.18-3.0.9"), + ForgeDataMod(mod_id="initialinventory", mod_version="6.0.8"), + ForgeDataMod(mod_id="irongenerators", mod_version="2.0.1"), + ForgeDataMod(mod_id="xaeroworldmap", mod_version="1.25.1"), + ForgeDataMod(mod_id="cookingforblockheads", mod_version="12.0.2"), ForgeDataMod( - modid="controlling", - modmarker="", - ), - ForgeDataMod(modid="xnet", modmarker="1.18-4.0.5"), - ForgeDataMod(modid="placebo", modmarker="6.4.1"), - ForgeDataMod(modid="citadel", modmarker="1.11.3"), - ForgeDataMod(modid="powah", modmarker="3.0.1-beta"), - ForgeDataMod(modid="bookshelf", modmarker="13.2.50"), - ForgeDataMod(modid="lootbeams", modmarker="1.18.1"), + mod_id="controlling", + mod_version="", + ), + ForgeDataMod(mod_id="xnet", mod_version="1.18-4.0.5"), + ForgeDataMod(mod_id="placebo", mod_version="6.4.1"), + ForgeDataMod(mod_id="citadel", mod_version="1.11.3"), + ForgeDataMod(mod_id="powah", mod_version="3.0.1-beta"), + ForgeDataMod(mod_id="bookshelf", mod_version="13.2.50"), + ForgeDataMod(mod_id="lootbeams", mod_version="1.18.1"), ForgeDataMod( - modid="sophisticatedbackpacks", - modmarker="1.18.2-3.18.35.752", + mod_id="sophisticatedbackpacks", + mod_version="1.18.2-3.18.35.752", ), - ForgeDataMod(modid="twigs", modmarker="1.1.4-patch1+1.18.2"), + ForgeDataMod(mod_id="twigs", mod_version="1.1.4-patch1+1.18.2"), ForgeDataMod( - modid="buildinggadgets", - modmarker="3.13.0-build.5+mc1.18.2}", - ), - ForgeDataMod(modid="darkutils", modmarker="10.0.5"), - ForgeDataMod(modid="mcwdoors", modmarker="1.0.6"), - ForgeDataMod(modid="waddles", modmarker="1.18.2-0.8.19"), - ForgeDataMod(modid="mekanismgenerators", modmarker="10.2.5"), - ForgeDataMod(modid="balm", modmarker="3.2.0+0"), - ForgeDataMod(modid="waila", modmarker=""), - ForgeDataMod(modid="jeresources", modmarker="0.14.1.171"), + mod_id="buildinggadgets", + mod_version="3.13.0-build.5+mc1.18.2}", + ), + ForgeDataMod(mod_id="darkutils", mod_version="10.0.5"), + ForgeDataMod(mod_id="mcwdoors", mod_version="1.0.6"), + ForgeDataMod(mod_id="waddles", mod_version="1.18.2-0.8.19"), + ForgeDataMod(mod_id="mekanismgenerators", mod_version="10.2.5"), + ForgeDataMod(mod_id="balm", mod_version="3.2.0+0"), + ForgeDataMod(mod_id="waila", mod_version=""), + ForgeDataMod(mod_id="jeresources", mod_version="0.14.1.171"), ForgeDataMod( - modid="cloth_config", - modmarker="", - ), - ForgeDataMod(modid="shetiphiancore", modmarker="3.10.10"), - ForgeDataMod(modid="dummmmmmy", modmarker="1.18-1.5.2"), - ForgeDataMod(modid="supplementaries", modmarker="1.18.2-1.5.13"), - ForgeDataMod(modid="refinedstorage", modmarker="1.10.2"), - ForgeDataMod(modid="konkrete", modmarker="1.3.3"), - ForgeDataMod(modid="easy_piglins", modmarker="1.18.2-1.0.0"), - ForgeDataMod(modid="corpse", modmarker="1.18.2-1.0.2"), - ForgeDataMod(modid="packmenu", modmarker=""), - ForgeDataMod(modid="mcwbridges", modmarker="2.0.3"), - ForgeDataMod(modid="torchmaster", modmarker="18.1.0"), - ForgeDataMod(modid="compressium", modmarker="1.4.2-build.9+mc1.18.2"), - ForgeDataMod(modid="ping", modmarker="1.18-1.8.0"), - ForgeDataMod(modid="ironfurnaces", modmarker="3.3.1"), - ForgeDataMod(modid="mcwtrpdoors", modmarker="1.0.6"), - ForgeDataMod(modid="mcwfences", modmarker="1.0.5"), - ForgeDataMod(modid="supermartijn642corelib", modmarker="1.0.19"), - ForgeDataMod(modid="simplylight", modmarker="1.18.2-1.4.2-build.31"), - ForgeDataMod(modid="botania", modmarker="1.18.2-434"), - ForgeDataMod(modid="highlighter", modmarker="ANY"), - ForgeDataMod(modid="spark", modmarker=""), - ForgeDataMod(modid="curios", modmarker="1.18.2-5.0.7.1"), - ForgeDataMod(modid="patchouli", modmarker="1.18.2-71.1"), - ForgeDataMod(modid="camera", modmarker="1.18.2-1.0.4"), - ForgeDataMod(modid="blockcarpentry", modmarker="1.18-0.3.0"), - ForgeDataMod(modid="thermal_foundation", modmarker="1.6.3.28"), - ForgeDataMod(modid="thermal_expansion", modmarker="1.6.3.13"), - ForgeDataMod(modid="libnonymous", modmarker="2.1.0"), - ForgeDataMod(modid="elevatorid", modmarker="1.18.2-1.8.4"), - ForgeDataMod(modid="runelic", modmarker="11.0.1"), + mod_id="cloth_config", + mod_version="", + ), + ForgeDataMod(mod_id="shetiphiancore", mod_version="3.10.10"), + ForgeDataMod(mod_id="dummmmmmy", mod_version="1.18-1.5.2"), + ForgeDataMod(mod_id="supplementaries", mod_version="1.18.2-1.5.13"), + ForgeDataMod(mod_id="refinedstorage", mod_version="1.10.2"), + ForgeDataMod(mod_id="konkrete", mod_version="1.3.3"), + ForgeDataMod(mod_id="easy_piglins", mod_version="1.18.2-1.0.0"), + ForgeDataMod(mod_id="corpse", mod_version="1.18.2-1.0.2"), + ForgeDataMod(mod_id="packmenu", mod_version=""), + ForgeDataMod(mod_id="mcwbridges", mod_version="2.0.3"), + ForgeDataMod(mod_id="torchmaster", mod_version="18.1.0"), + ForgeDataMod(mod_id="compressium", mod_version="1.4.2-build.9+mc1.18.2"), + ForgeDataMod(mod_id="ping", mod_version="1.18-1.8.0"), + ForgeDataMod(mod_id="ironfurnaces", mod_version="3.3.1"), + ForgeDataMod(mod_id="mcwtrpdoors", mod_version="1.0.6"), + ForgeDataMod(mod_id="mcwfences", mod_version="1.0.5"), + ForgeDataMod(mod_id="supermartijn642corelib", mod_version="1.0.19"), + ForgeDataMod(mod_id="simplylight", mod_version="1.18.2-1.4.2-build.31"), + ForgeDataMod(mod_id="botania", mod_version="1.18.2-434"), + ForgeDataMod(mod_id="highlighter", mod_version="ANY"), + ForgeDataMod(mod_id="spark", mod_version=""), + ForgeDataMod(mod_id="curios", mod_version="1.18.2-5.0.7.1"), + ForgeDataMod(mod_id="patchouli", mod_version="1.18.2-71.1"), + ForgeDataMod(mod_id="camera", mod_version="1.18.2-1.0.4"), + ForgeDataMod(mod_id="blockcarpentry", mod_version="1.18-0.3.0"), + ForgeDataMod(mod_id="thermal_foundation", mod_version="1.6.3.28"), + ForgeDataMod(mod_id="thermal_expansion", mod_version="1.6.3.13"), + ForgeDataMod(mod_id="libnonymous", mod_version="2.1.0"), + ForgeDataMod(mod_id="elevatorid", mod_version="1.18.2-1.8.4"), + ForgeDataMod(mod_id="runelic", mod_version="11.0.1"), ForgeDataMod( - modid="worldedit", - modmarker="", - ), - ForgeDataMod(modid="cfm", modmarker="7.0.0-pre29"), - ForgeDataMod(modid="architectury", modmarker="4.9.84"), - ForgeDataMod(modid="weirdinggadget", modmarker="2.2.11"), - ForgeDataMod(modid="mcwfurnitures", modmarker="3.0.0"), - ForgeDataMod(modid="trashcans", modmarker="1.0.15"), - ForgeDataMod(modid="mcwlights", modmarker="1.0.3"), - ForgeDataMod(modid="cucumber", modmarker="5.1.2"), - ForgeDataMod(modid="snad", modmarker="1.18.2-1.22.04.15a"), - ForgeDataMod(modid="jei", modmarker="9.7.0.209"), - ForgeDataMod(modid="ae2", modmarker="11.1.4"), - ForgeDataMod(modid="mekanism", modmarker="10.2.5"), - ForgeDataMod(modid="bdlib", modmarker="1.19.3.7"), - ForgeDataMod(modid="create", modmarker="0.5.0.d"), - ForgeDataMod(modid="waystones", modmarker="10.1.0"), - ForgeDataMod(modid="clumps", modmarker="8.0.0+10"), - ForgeDataMod(modid="shutupexperimentalsettings", modmarker="1.0.5"), - ForgeDataMod(modid="comforts", modmarker="1.18.2-5.0.0.4"), - ForgeDataMod(modid="naturescompass", modmarker="1.18.2-1.9.7-forge"), - ForgeDataMod(modid="storagenetwork", modmarker="1.18.2-1.6.1"), - ForgeDataMod(modid="framedcompactdrawers", modmarker="1.18-4.1.0"), - ForgeDataMod(modid="decorative_blocks", modmarker="2.1.0"), - ForgeDataMod(modid="botanypots", modmarker="8.0.12"), - ForgeDataMod(modid="ftbbackups2", modmarker="1.0.17"), - ForgeDataMod(modid="cofh_core", modmarker="1.6.4.21"), - ForgeDataMod(modid="mcjtylib", modmarker="1.18-6.0.15"), - ForgeDataMod(modid="ispawner", modmarker="1.0"), - ForgeDataMod(modid="everycomp", modmarker="1.18.2-1.5.7"), - ForgeDataMod(modid="jeitweaker", modmarker="3.0.0.8"), - ForgeDataMod(modid="terralith", modmarker="0.0NONE"), - ForgeDataMod(modid="mininggadgets", modmarker="1.11.0"), - ForgeDataMod(modid="crafttweaker", modmarker="9.1.197"), - ForgeDataMod(modid="akashictome", modmarker="1.5-20"), - ForgeDataMod(modid="forge", modmarker="ANY"), - ForgeDataMod(modid="colossalchests", modmarker="1.8.3"), - ForgeDataMod(modid="selene", modmarker="1.18.2-1.17.9"), - ForgeDataMod(modid="drippyloadingscreen", modmarker="1.6.4"), + mod_id="worldedit", + mod_version="", + ), + ForgeDataMod(mod_id="cfm", mod_version="7.0.0-pre29"), + ForgeDataMod(mod_id="architectury", mod_version="4.9.84"), + ForgeDataMod(mod_id="weirdinggadget", mod_version="2.2.11"), + ForgeDataMod(mod_id="mcwfurnitures", mod_version="3.0.0"), + ForgeDataMod(mod_id="trashcans", mod_version="1.0.15"), + ForgeDataMod(mod_id="mcwlights", mod_version="1.0.3"), + ForgeDataMod(mod_id="cucumber", mod_version="5.1.2"), + ForgeDataMod(mod_id="snad", mod_version="1.18.2-1.22.04.15a"), + ForgeDataMod(mod_id="jei", mod_version="9.7.0.209"), + ForgeDataMod(mod_id="ae2", mod_version="11.1.4"), + ForgeDataMod(mod_id="mekanism", mod_version="10.2.5"), + ForgeDataMod(mod_id="bdlib", mod_version="1.19.3.7"), + ForgeDataMod(mod_id="create", mod_version="0.5.0.d"), + ForgeDataMod(mod_id="waystones", mod_version="10.1.0"), + ForgeDataMod(mod_id="clumps", mod_version="8.0.0+10"), + ForgeDataMod(mod_id="shutupexperimentalsettings", mod_version="1.0.5"), + ForgeDataMod(mod_id="comforts", mod_version="1.18.2-5.0.0.4"), + ForgeDataMod(mod_id="naturescompass", mod_version="1.18.2-1.9.7-forge"), + ForgeDataMod(mod_id="storagenetwork", mod_version="1.18.2-1.6.1"), + ForgeDataMod(mod_id="framedcompactdrawers", mod_version="1.18-4.1.0"), + ForgeDataMod(mod_id="decorative_blocks", mod_version="2.1.0"), + ForgeDataMod(mod_id="botanypots", mod_version="8.0.12"), + ForgeDataMod(mod_id="ftbbackups2", mod_version="1.0.17"), + ForgeDataMod(mod_id="cofh_core", mod_version="1.6.4.21"), + ForgeDataMod(mod_id="mcjtylib", mod_version="1.18-6.0.15"), + ForgeDataMod(mod_id="ispawner", mod_version="1.0"), + ForgeDataMod(mod_id="everycomp", mod_version="1.18.2-1.5.7"), + ForgeDataMod(mod_id="jeitweaker", mod_version="3.0.0.8"), + ForgeDataMod(mod_id="terralith", mod_version="0.0NONE"), + ForgeDataMod(mod_id="mininggadgets", mod_version="1.11.0"), + ForgeDataMod(mod_id="crafttweaker", mod_version="9.1.197"), + ForgeDataMod(mod_id="akashictome", mod_version="1.5-20"), + ForgeDataMod(mod_id="forge", mod_version="ANY"), + ForgeDataMod(mod_id="colossalchests", mod_version="1.8.3"), + ForgeDataMod(mod_id="selene", mod_version="1.18.2-1.17.9"), + ForgeDataMod(mod_id="drippyloadingscreen", mod_version="1.6.4"), ForgeDataMod( - modid="craftingtweaks", - modmarker="", + mod_id="craftingtweaks", + mod_version="", ), - ForgeDataMod(modid="minecraft", modmarker="1.18.2"), - ForgeDataMod(modid="terrablender", modmarker="1.18.2-1.1.0.102"), + ForgeDataMod(mod_id="minecraft", mod_version="1.18.2"), + ForgeDataMod(mod_id="terrablender", mod_version="1.18.2-1.1.0.102"), ForgeDataMod( - modid="sophisticatedbackpacksvh", - modmarker="1.18.2-1.0.4.12", - ), - ForgeDataMod(modid="mousetweaks", modmarker="ANY"), - ForgeDataMod(modid="titanium", modmarker="3.5.6"), - ForgeDataMod(modid="jade", modmarker=""), - ForgeDataMod(modid="createtweaker", modmarker="2.0.0.17"), - ForgeDataMod(modid="easy_villagers", modmarker="1.18.2-1.0.10"), - ForgeDataMod(modid="pipez", modmarker="1.18.2-1.1.5"), - ForgeDataMod(modid="iceberg", modmarker="ANY"), - ForgeDataMod(modid="flywheel", modmarker=""), - ForgeDataMod(modid="mantle", modmarker="1.9.27"), - ForgeDataMod(modid="ecologics", modmarker="1.7.3"), - ForgeDataMod(modid="quark", modmarker="3.2-358"), - ForgeDataMod(modid="xaerominimap", modmarker="22.11.1"), - ForgeDataMod(modid="pigpen", modmarker="8.0.1"), - ForgeDataMod(modid="fastbench", modmarker="6.0.2"), - ForgeDataMod(modid="polymorph", modmarker="1.18.2-0.44"), - ForgeDataMod(modid="autoreglib", modmarker="1.7-53"), - ForgeDataMod(modid="storagedrawers", modmarker="10.2.1"), - ForgeDataMod(modid="fluxnetworks", modmarker="7.0.7.8"), - ForgeDataMod(modid="neoncraft2", modmarker="2.2"), - ForgeDataMod(modid="enercell", modmarker="0.0NONE"), - ForgeDataMod(modid="appleskin", modmarker="2.4.0+mc1.18"), + mod_id="sophisticatedbackpacksvh", + mod_version="1.18.2-1.0.4.12", + ), + ForgeDataMod(mod_id="mousetweaks", mod_version="ANY"), + ForgeDataMod(mod_id="titanium", mod_version="3.5.6"), + ForgeDataMod(mod_id="jade", mod_version=""), + ForgeDataMod(mod_id="createtweaker", mod_version="2.0.0.17"), + ForgeDataMod(mod_id="easy_villagers", mod_version="1.18.2-1.0.10"), + ForgeDataMod(mod_id="pipez", mod_version="1.18.2-1.1.5"), + ForgeDataMod(mod_id="iceberg", mod_version="ANY"), + ForgeDataMod(mod_id="flywheel", mod_version=""), + ForgeDataMod(mod_id="mantle", mod_version="1.9.27"), + ForgeDataMod(mod_id="ecologics", mod_version="1.7.3"), + ForgeDataMod(mod_id="quark", mod_version="3.2-358"), + ForgeDataMod(mod_id="xaerominimap", mod_version="22.11.1"), + ForgeDataMod(mod_id="pigpen", mod_version="8.0.1"), + ForgeDataMod(mod_id="fastbench", mod_version="6.0.2"), + ForgeDataMod(mod_id="polymorph", mod_version="1.18.2-0.44"), + ForgeDataMod(mod_id="autoreglib", mod_version="1.7-53"), + ForgeDataMod(mod_id="storagedrawers", mod_version="10.2.1"), + ForgeDataMod(mod_id="fluxnetworks", mod_version="7.0.7.8"), + ForgeDataMod(mod_id="neoncraft2", mod_version="2.2"), + ForgeDataMod(mod_id="enercell", mod_version="0.0NONE"), + ForgeDataMod(mod_id="appleskin", mod_version="2.4.0+mc1.18"), ForgeDataMod( - modid="ferritecore", - modmarker="", + mod_id="ferritecore", + mod_version="", ), - ForgeDataMod(modid="modularrouters", modmarker="9.1.1-93"), - ForgeDataMod(modid="refinedstorageaddons", modmarker="0.8.2"), - ForgeDataMod(modid="openloader", modmarker="12.0.1"), - ForgeDataMod(modid="the_vault", modmarker="1.18.2-2.0.10.869"), + ForgeDataMod(mod_id="modularrouters", mod_version="9.1.1-93"), + ForgeDataMod(mod_id="refinedstorageaddons", mod_version="0.8.2"), + ForgeDataMod(mod_id="openloader", mod_version="12.0.1"), + ForgeDataMod(mod_id="the_vault", mod_version="1.18.2-2.0.10.869"), ], ), ("truncated", False), @@ -684,10 +684,10 @@ class TestForgeDataV1(TestJavaStatusResponse): fml_network_version=1, channels=[], mods=[ - ForgeDataMod(modid="minecraft", modmarker="1.12.2"), - ForgeDataMod(modid="mcp", modmarker="9.42"), - ForgeDataMod(modid="FML", modmarker="8.0.99.99"), - ForgeDataMod(modid="forge", modmarker="14.23.5.2859"), + ForgeDataMod(mod_id="minecraft", mod_version="1.12.2"), + ForgeDataMod(mod_id="mcp", mod_version="9.42"), + ForgeDataMod(mod_id="FML", mod_version="8.0.99.99"), + ForgeDataMod(mod_id="forge", mod_version="14.23.5.2859"), ], truncated=False, ), @@ -727,7 +727,7 @@ class TestForgeDataV2(TestJavaStatusResponse): fml_network_version=2, channels=[], mods=[ - ForgeDataMod(modid="forge", modmarker="ANY"), + ForgeDataMod(mod_id="forge", mod_version="ANY"), ], truncated=False, ), @@ -778,8 +778,8 @@ class TestForgeDataV3(TestJavaStatusResponse): ForgeDataChannel(res="forge:split", version="1.1", required=True), ], mods=[ - ForgeDataMod(modid="minecraft", modmarker="1.20.1"), - ForgeDataMod(modid="forge", modmarker="ANY"), + ForgeDataMod(mod_id="minecraft", mod_version="1.20.1"), + ForgeDataMod(mod_id="forge", mod_version="ANY"), ], truncated=False, ), From 5c7ac1883f65f002bb72c106420e1e5965f532df Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Mon, 17 Jul 2023 20:10:51 -0500 Subject: [PATCH 42/67] Fix type errors --- mcstatus/status_response.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mcstatus/status_response.py b/mcstatus/status_response.py index 43094d77..ebc317e2 100644 --- a/mcstatus/status_response.py +++ b/mcstatus/status_response.py @@ -91,6 +91,7 @@ def description(self) -> str: @classmethod @abstractmethod + # types: no-untyped-def error: Function is missing a type annotation for one or more arguments def build(cls, *args, **kwargs) -> Self: """Build BaseStatusResponse and check is it valid. @@ -132,9 +133,11 @@ def build(cls, raw: RawJavaResponse, latency: float = 0) -> Self: ``description`` - :class:`str`) are not of the expected type. :return: :class:`JavaStatusResponse` object. """ - forge_data = None + forge_data: ForgeData | None = None if "forgeData" in raw or "modinfo" in raw: - forge_data = ForgeData.build(raw.get("forgeData") or raw.get("modinfo")) + raw_forge = raw.get("forgeData") or raw.get("modinfo") + assert raw_forge is not None + forge_data = ForgeData.build(raw_forge) return cls( raw=raw, From ee1872b3ba651c3716e53e224d21c6cd7c5ce6a9 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Mon, 17 Jul 2023 20:13:27 -0500 Subject: [PATCH 43/67] Fix function annotation --- mcstatus/status_response.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mcstatus/status_response.py b/mcstatus/status_response.py index ebc317e2..08f9bc34 100644 --- a/mcstatus/status_response.py +++ b/mcstatus/status_response.py @@ -91,8 +91,7 @@ def description(self) -> str: @classmethod @abstractmethod - # types: no-untyped-def error: Function is missing a type annotation for one or more arguments - def build(cls, *args, **kwargs) -> Self: + def build(cls, *args: Any, **kwargs: Any) -> Self: """Build BaseStatusResponse and check is it valid. :param args: Arguments in specific realisation. From 1942b5640b7f91b467ad52ddc76d8c4f98c21eca Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Mon, 17 Jul 2023 20:18:37 -0500 Subject: [PATCH 44/67] Fix type issues --- mcstatus/forge_data.py | 2 +- mcstatus/status_response.py | 2 +- tests/status_response/test_java.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 00960325..9f56375f 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -46,7 +46,7 @@ class RawForgeData(TypedDict): fmlNetworkVersion: NotRequired[int] # noqa: N815 # camel case channels: NotRequired[list[RawForgeDataChannel]] mods: NotRequired[list[RawForgeDataMod]] - modList: NotRequired[list[RawForgeDataMod]] + modList: NotRequired[list[RawForgeDataMod]] # noqa: N815 # camel case d: NotRequired[str] truncated: NotRequired[bool] diff --git a/mcstatus/status_response.py b/mcstatus/status_response.py index 08f9bc34..64a708c5 100644 --- a/mcstatus/status_response.py +++ b/mcstatus/status_response.py @@ -91,7 +91,7 @@ def description(self) -> str: @classmethod @abstractmethod - def build(cls, *args: Any, **kwargs: Any) -> Self: + def build(cls, *args: Any, **kwargs: Any) -> Self: # noqa: ANN401 # Any is bad, but this is abstract """Build BaseStatusResponse and check is it valid. :param args: Arguments in specific realisation. diff --git a/tests/status_response/test_java.py b/tests/status_response/test_java.py index 5b4f98a9..af9a332f 100644 --- a/tests/status_response/test_java.py +++ b/tests/status_response/test_java.py @@ -1,6 +1,6 @@ from pytest import fixture -from mcstatus.forge_data import ForgeDataChannel, ForgeDataMod, RawForgeData, RawForgeDataChannel, RawForgeDataMod +from mcstatus.forge_data import ForgeDataChannel, ForgeDataMod, RawForgeData from mcstatus.motd import Formatting, Motd from mcstatus.status_response import ForgeData, JavaStatusPlayer, JavaStatusPlayers, JavaStatusResponse, JavaStatusVersion from tests.status_response import BaseStatusResponseTest From 93c9ab4836e0959bc7fa54af6fe7f26d8d31eb42 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Tue, 18 Jul 2023 18:02:13 -0500 Subject: [PATCH 45/67] Apply suggestions from code review Co-authored-by: Perchun Pak --- mcstatus/forge_data.py | 11 ++++------- mcstatus/status_response.py | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 9f56375f..11bf6cc0 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -97,8 +97,8 @@ def decode(cls, buffer: Connection, mod_id: str | None = None) -> Self: @dataclass class ForgeDataMod: - mod_id: str - mod_version: str + id: str + version: str @classmethod def build(cls, raw: RawForgeDataMod) -> Self: @@ -214,15 +214,12 @@ def build(cls, raw: RawForgeData) -> Self | None: :param raw: ``forgeData`` attribute in raw response :class:`dict`. :return: :class:`ForgeData` object. """ - fml_network_version = 1 - if "fmlNetworkVersion" in raw: - fml_network_version = raw["fmlNetworkVersion"] + fml_network_version = raw.get("fmlNetworkVersion", 1) # see https://github.com/MinecraftForge/MinecraftForge/blob/7d0330eb08299935714e34ac651a293e2609aa86/src/main/java/net/minecraftforge/network/ServerStatusPing.java#L27-L73 # noqa: E501 # line too long if "d" not in raw: mod_list = raw.get("mods") or raw.get("modList") - if mod_list is None: - return None + assert mod_list is not None return cls( fml_network_version=fml_network_version, channels=[ForgeDataChannel.build(channel) for channel in raw.get("channels", ())], diff --git a/mcstatus/status_response.py b/mcstatus/status_response.py index 64a708c5..f3bf2c27 100644 --- a/mcstatus/status_response.py +++ b/mcstatus/status_response.py @@ -91,7 +91,7 @@ def description(self) -> str: @classmethod @abstractmethod - def build(cls, *args: Any, **kwargs: Any) -> Self: # noqa: ANN401 # Any is bad, but this is abstract + def build(cls, *args, **kwargs) -> Self: """Build BaseStatusResponse and check is it valid. :param args: Arguments in specific realisation. From b103235e59bde9d8300d36f7a5ad40b2d69fbb0e Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Tue, 18 Jul 2023 18:06:40 -0500 Subject: [PATCH 46/67] Rename attributes on `ForgeDataMod` and `ForgeDataChannel` --- mcstatus/forge_data.py | 12 +- tests/status_response/test_java.py | 450 ++++++++++++++--------------- 2 files changed, 231 insertions(+), 231 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 11bf6cc0..0f49d873 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -58,7 +58,7 @@ class RawForgeData(TypedDict): @dataclass class ForgeDataChannel: - res: str + name: str """Channel name and ID (for example ``fml:handshake``).""" version: str """Channel version (for example ``1.2.3.4``).""" @@ -72,7 +72,7 @@ def build(cls, raw: RawForgeDataChannel) -> Self: :param raw: ``channel`` element in raw forge response :class:`dict`. :return: :class:`ForgeDataChannel` object. """ - return cls(res=raw["res"], version=raw["version"], required=raw["required"]) + return cls(name=raw["res"], version=raw["version"], required=raw["required"]) @classmethod def decode(cls, buffer: Connection, mod_id: str | None = None) -> Self: @@ -89,7 +89,7 @@ def decode(cls, buffer: Connection, mod_id: str | None = None) -> Self: client_required = buffer.read_bool() return cls( - res=channel_identifier, + name=channel_identifier, version=version, required=client_required, ) @@ -97,7 +97,7 @@ def decode(cls, buffer: Connection, mod_id: str | None = None) -> Self: @dataclass class ForgeDataMod: - id: str + name: str version: str @classmethod @@ -117,7 +117,7 @@ def build(cls, raw: RawForgeDataMod) -> Self: if mod_id is None: raise ValueError(f"Mod ID in Forge mod data must be provided. Mod version: {mod_version!r}.") - return cls(mod_id=mod_id, mod_version=mod_version) + return cls(name=mod_id, version=mod_version) @classmethod def decode(cls, buffer: Connection) -> tuple[Self, list[ForgeDataChannel]]: @@ -140,7 +140,7 @@ def decode(cls, buffer: Connection) -> tuple[Self, list[ForgeDataChannel]]: for _ in range(channel_count): channels.append(ForgeDataChannel.decode(buffer, mod_id)) - return cls(mod_id=mod_id, mod_version=mod_version), channels + return cls(name=mod_id, version=mod_version), channels class StringBuffer(BaseReadSync, BaseConnection): diff --git a/tests/status_response/test_java.py b/tests/status_response/test_java.py index af9a332f..53ca6e79 100644 --- a/tests/status_response/test_java.py +++ b/tests/status_response/test_java.py @@ -111,243 +111,243 @@ class TestForgeData(BaseStatusResponseTest): "channels", [ ForgeDataChannel( - res="cyclopscore:channel_main", + name="cyclopscore:channel_main", version="1.0.0", required=True, ), ForgeDataChannel( - res="supermartijn642configlib:sync_configs", + name="supermartijn642configlib:sync_configs", version="1", required=False, ), ForgeDataChannel( - res="alexsmobs:main_channel", + name="alexsmobs:main_channel", version="1", required=False, ), ForgeDataChannel( - res="sophisticatedcore:channel", + name="sophisticatedcore:channel", version="1", required=False, ), ForgeDataChannel( - res="rftoolsbase:rftoolsbase", + name="rftoolsbase:rftoolsbase", version="1.0", required=True, ), ForgeDataChannel( - res="irongenerators:irongenerators", + name="irongenerators:irongenerators", version="1", required=False, ), ForgeDataChannel( - res="xaeroworldmap:main", + name="xaeroworldmap:main", version="1.0", required=True, ), ForgeDataChannel( - res="cookingforblockheads:network", + name="cookingforblockheads:network", version="1.0", required=False, ), - ForgeDataChannel(res="xnet:xnet", version="1.0", required=True), + ForgeDataChannel(name="xnet:xnet", version="1.0", required=True), ForgeDataChannel( - res="placebo:placebo", + name="placebo:placebo", version="1.0.0", required=True, ), ForgeDataChannel( - res="citadel:main_channel", + name="citadel:main_channel", version="1", required=False, ), ForgeDataChannel( - res="sophisticatedbackpacks:channel", + name="sophisticatedbackpacks:channel", version="1", required=False, ), ForgeDataChannel( - res="buildinggadgets:main", + name="buildinggadgets:main", version="4", required=False, ), ForgeDataChannel( - res="mekanismgenerators:mekanismgenerators", + name="mekanismgenerators:mekanismgenerators", version="10.2.5", required=False, ), ForgeDataChannel( - res="waila:networking", + name="waila:networking", version="1.0.0", required=True, ), ForgeDataChannel( - res="shetiphiancore:main_channel", + name="shetiphiancore:main_channel", version="1.0.0", required=False, ), ForgeDataChannel( - res="dummmmmmy:dummychannel", + name="dummmmmmy:dummychannel", version="1", required=False, ), ForgeDataChannel( - res="supplementaries:network", + name="supplementaries:network", version="1", required=False, ), ForgeDataChannel( - res="refinedstorage:main_channel", + name="refinedstorage:main_channel", version="1", required=False, ), - ForgeDataChannel(res="corpse:default", version="1.0.0", required=True), + ForgeDataChannel(name="corpse:default", version="1.0.0", required=True), ForgeDataChannel( - res="ping:ping_channel", + name="ping:ping_channel", version="PING1", required=True, ), ForgeDataChannel( - res="ironfurnaces:ironfurnaces_network", + name="ironfurnaces:ironfurnaces_network", version="1.0", required=True, ), - ForgeDataChannel(res="botania:main", version="0", required=False), - ForgeDataChannel(res="curios:main", version="1", required=False), - ForgeDataChannel(res="patchouli:main", version="1", required=False), - ForgeDataChannel(res="camera:default", version="1.0.0", required=True), + ForgeDataChannel(name="botania:main", version="0", required=False), + ForgeDataChannel(name="curios:main", version="1", required=False), + ForgeDataChannel(name="patchouli:main", version="1", required=False), + ForgeDataChannel(name="camera:default", version="1.0.0", required=True), ForgeDataChannel( - res="libnonymous:channel", + name="libnonymous:channel", version="1.0", required=True, ), ForgeDataChannel( - res="elevatorid:main_channel", + name="elevatorid:main_channel", version="1", required=False, ), - ForgeDataChannel(res="worldedit:cui", version="1", required=True), - ForgeDataChannel(res="worldedit:internal", version="1", required=True), - ForgeDataChannel(res="cfm:network", version="1", required=False), + ForgeDataChannel(name="worldedit:cui", version="1", required=True), + ForgeDataChannel(name="worldedit:internal", version="1", required=True), + ForgeDataChannel(name="cfm:network", version="1", required=False), ForgeDataChannel( - res="architectury:network", + name="architectury:network", version="1", required=True, ), - ForgeDataChannel(res="trashcans:main", version="1", required=False), - ForgeDataChannel(res="jei:channel", version="1.0.0", required=True), - ForgeDataChannel(res="ae2:main", version="1", required=True), + ForgeDataChannel(name="trashcans:main", version="1", required=False), + ForgeDataChannel(name="jei:channel", version="1.0.0", required=True), + ForgeDataChannel(name="ae2:main", version="1", required=True), ForgeDataChannel( - res="mekanism:mekanism", + name="mekanism:mekanism", version="10.2.5", required=False, ), - ForgeDataChannel(res="bdlib:multiblock", version="2", required=False), - ForgeDataChannel(res="bdlib:misc", version="1", required=False), - ForgeDataChannel(res="create:main", version="1", required=False), + ForgeDataChannel(name="bdlib:multiblock", version="2", required=False), + ForgeDataChannel(name="bdlib:misc", version="1", required=False), + ForgeDataChannel(name="create:main", version="1", required=False), ForgeDataChannel( - res="waystones:network", + name="waystones:network", version="1.0", required=False, ), - ForgeDataChannel(res="comforts:main", version="1", required=False), + ForgeDataChannel(name="comforts:main", version="1", required=False), ForgeDataChannel( - res="naturescompass:naturescompass", + name="naturescompass:naturescompass", version="1.0", required=True, ), ForgeDataChannel( - res="storagenetwork:main_channel", + name="storagenetwork:main_channel", version="1", required=False, ), - ForgeDataChannel(res="cofh_core:general", version="1", required=True), + ForgeDataChannel(name="cofh_core:general", version="1", required=True), ForgeDataChannel( - res="mcjtylib:mcjtylib", + name="mcjtylib:mcjtylib", version="1.0", required=True, ), ForgeDataChannel( - res="mininggadgets:main_network_channel", + name="mininggadgets:main_network_channel", version="2", required=False, ), ForgeDataChannel( - res="crafttweaker:main", + name="crafttweaker:main", version="1.0.0", required=False, ), - ForgeDataChannel(res="akashictome:main", version="1", required=False), + ForgeDataChannel(name="akashictome:main", version="1", required=False), ForgeDataChannel( - res="forge:tier_sorting", + name="forge:tier_sorting", version="1.0", required=False, ), - ForgeDataChannel(res="forge:split", version="1.1", required=True), + ForgeDataChannel(name="forge:split", version="1.1", required=True), ForgeDataChannel( - res="colossalchests:channel_main", + name="colossalchests:channel_main", version="1.0.0", required=True, ), - ForgeDataChannel(res="selene:network", version="1", required=False), + ForgeDataChannel(name="selene:network", version="1", required=False), ForgeDataChannel( - res="craftingtweaks:network", + name="craftingtweaks:network", version="1.0", required=False, ), ForgeDataChannel( - res="minecraft:unregister", + name="minecraft:unregister", version="FML3", required=True, ), ForgeDataChannel( - res="minecraft:register", + name="minecraft:register", version="FML3", required=True, ), - ForgeDataChannel(res="titanium:network", version="1.0", required=True), + ForgeDataChannel(name="titanium:network", version="1.0", required=True), ForgeDataChannel( - res="easy_villagers:default", + name="easy_villagers:default", version="1.0.0", required=True, ), - ForgeDataChannel(res="pipez:default", version="1.0.0", required=True), - ForgeDataChannel(res="mantle:network", version="1", required=False), - ForgeDataChannel(res="quark:main", version="1", required=False), + ForgeDataChannel(name="pipez:default", version="1.0.0", required=True), + ForgeDataChannel(name="mantle:network", version="1", required=False), + ForgeDataChannel(name="quark:main", version="1", required=False), ForgeDataChannel( - res="xaerominimap:main", + name="xaerominimap:main", version="1.0", required=True, ), ForgeDataChannel( - res="fastbench:channel", + name="fastbench:channel", version="4.6.0", required=True, ), - ForgeDataChannel(res="polymorph:main", version="1", required=False), + ForgeDataChannel(name="polymorph:main", version="1", required=False), ForgeDataChannel( - res="storagedrawers:main_channel", + name="storagedrawers:main_channel", version="1", required=False, ), ForgeDataChannel( - res="enercell:network", + name="enercell:network", version="0.0.0", required=False, ), - ForgeDataChannel(res="appleskin:sync", version="1", required=True), + ForgeDataChannel(name="appleskin:sync", version="1", required=True), ForgeDataChannel( - res="modularrouters:main_channel", + name="modularrouters:main_channel", version="2", required=False, ), ForgeDataChannel( - res="the_vault:network", + name="the_vault:network", version="0.26.0", required=False, ), ForgeDataChannel( - res="modernui:fluxnetworks", + name="modernui:fluxnetworks", version="707", required=False, ), @@ -356,163 +356,163 @@ class TestForgeData(BaseStatusResponseTest): ( "mods", [ - ForgeDataMod(mod_id="rsrequestify", mod_version="2.2.0"), - ForgeDataMod(mod_id="cyclopscore", mod_version="1.15.1"), - ForgeDataMod(mod_id="auudio", mod_version="1.0.3"), - ForgeDataMod(mod_id="auxiliaryblocks", mod_version="1.18.2-0.0.14"), - ForgeDataMod(mod_id="supermartijn642configlib", mod_version="1.1.6"), - ForgeDataMod(mod_id="alexsmobs", mod_version="1.18.6"), - ForgeDataMod(mod_id="architects_palette", mod_version="1.1.2"), - ForgeDataMod(mod_id="cagerium", mod_version="1.18.2-1.1.0"), - ForgeDataMod(mod_id="mcwwindows", mod_version="2.0.3"), + ForgeDataMod(name="rsrequestify", version="2.2.0"), + ForgeDataMod(name="cyclopscore", version="1.15.1"), + ForgeDataMod(name="auudio", version="1.0.3"), + ForgeDataMod(name="auxiliaryblocks", version="1.18.2-0.0.14"), + ForgeDataMod(name="supermartijn642configlib", version="1.1.6"), + ForgeDataMod(name="alexsmobs", version="1.18.6"), + ForgeDataMod(name="architects_palette", version="1.1.2"), + ForgeDataMod(name="cagerium", version="1.18.2-1.1.0"), + ForgeDataMod(name="mcwwindows", version="2.0.3"), ForgeDataMod( - mod_id="sophisticatedcore", - mod_version="1.18.2-0.5.32.179", - ), - ForgeDataMod(mod_id="thermal", mod_version="1.6.3.28"), - ForgeDataMod(mod_id="rftoolsbase", mod_version="1.18-3.0.9"), - ForgeDataMod(mod_id="initialinventory", mod_version="6.0.8"), - ForgeDataMod(mod_id="irongenerators", mod_version="2.0.1"), - ForgeDataMod(mod_id="xaeroworldmap", mod_version="1.25.1"), - ForgeDataMod(mod_id="cookingforblockheads", mod_version="12.0.2"), + name="sophisticatedcore", + version="1.18.2-0.5.32.179", + ), + ForgeDataMod(name="thermal", version="1.6.3.28"), + ForgeDataMod(name="rftoolsbase", version="1.18-3.0.9"), + ForgeDataMod(name="initialinventory", version="6.0.8"), + ForgeDataMod(name="irongenerators", version="2.0.1"), + ForgeDataMod(name="xaeroworldmap", version="1.25.1"), + ForgeDataMod(name="cookingforblockheads", version="12.0.2"), ForgeDataMod( - mod_id="controlling", - mod_version="", - ), - ForgeDataMod(mod_id="xnet", mod_version="1.18-4.0.5"), - ForgeDataMod(mod_id="placebo", mod_version="6.4.1"), - ForgeDataMod(mod_id="citadel", mod_version="1.11.3"), - ForgeDataMod(mod_id="powah", mod_version="3.0.1-beta"), - ForgeDataMod(mod_id="bookshelf", mod_version="13.2.50"), - ForgeDataMod(mod_id="lootbeams", mod_version="1.18.1"), + name="controlling", + version="", + ), + ForgeDataMod(name="xnet", version="1.18-4.0.5"), + ForgeDataMod(name="placebo", version="6.4.1"), + ForgeDataMod(name="citadel", version="1.11.3"), + ForgeDataMod(name="powah", version="3.0.1-beta"), + ForgeDataMod(name="bookshelf", version="13.2.50"), + ForgeDataMod(name="lootbeams", version="1.18.1"), ForgeDataMod( - mod_id="sophisticatedbackpacks", - mod_version="1.18.2-3.18.35.752", + name="sophisticatedbackpacks", + version="1.18.2-3.18.35.752", ), - ForgeDataMod(mod_id="twigs", mod_version="1.1.4-patch1+1.18.2"), + ForgeDataMod(name="twigs", version="1.1.4-patch1+1.18.2"), ForgeDataMod( - mod_id="buildinggadgets", - mod_version="3.13.0-build.5+mc1.18.2}", - ), - ForgeDataMod(mod_id="darkutils", mod_version="10.0.5"), - ForgeDataMod(mod_id="mcwdoors", mod_version="1.0.6"), - ForgeDataMod(mod_id="waddles", mod_version="1.18.2-0.8.19"), - ForgeDataMod(mod_id="mekanismgenerators", mod_version="10.2.5"), - ForgeDataMod(mod_id="balm", mod_version="3.2.0+0"), - ForgeDataMod(mod_id="waila", mod_version=""), - ForgeDataMod(mod_id="jeresources", mod_version="0.14.1.171"), + name="buildinggadgets", + version="3.13.0-build.5+mc1.18.2}", + ), + ForgeDataMod(name="darkutils", version="10.0.5"), + ForgeDataMod(name="mcwdoors", version="1.0.6"), + ForgeDataMod(name="waddles", version="1.18.2-0.8.19"), + ForgeDataMod(name="mekanismgenerators", version="10.2.5"), + ForgeDataMod(name="balm", version="3.2.0+0"), + ForgeDataMod(name="waila", version=""), + ForgeDataMod(name="jeresources", version="0.14.1.171"), ForgeDataMod( - mod_id="cloth_config", - mod_version="", - ), - ForgeDataMod(mod_id="shetiphiancore", mod_version="3.10.10"), - ForgeDataMod(mod_id="dummmmmmy", mod_version="1.18-1.5.2"), - ForgeDataMod(mod_id="supplementaries", mod_version="1.18.2-1.5.13"), - ForgeDataMod(mod_id="refinedstorage", mod_version="1.10.2"), - ForgeDataMod(mod_id="konkrete", mod_version="1.3.3"), - ForgeDataMod(mod_id="easy_piglins", mod_version="1.18.2-1.0.0"), - ForgeDataMod(mod_id="corpse", mod_version="1.18.2-1.0.2"), - ForgeDataMod(mod_id="packmenu", mod_version=""), - ForgeDataMod(mod_id="mcwbridges", mod_version="2.0.3"), - ForgeDataMod(mod_id="torchmaster", mod_version="18.1.0"), - ForgeDataMod(mod_id="compressium", mod_version="1.4.2-build.9+mc1.18.2"), - ForgeDataMod(mod_id="ping", mod_version="1.18-1.8.0"), - ForgeDataMod(mod_id="ironfurnaces", mod_version="3.3.1"), - ForgeDataMod(mod_id="mcwtrpdoors", mod_version="1.0.6"), - ForgeDataMod(mod_id="mcwfences", mod_version="1.0.5"), - ForgeDataMod(mod_id="supermartijn642corelib", mod_version="1.0.19"), - ForgeDataMod(mod_id="simplylight", mod_version="1.18.2-1.4.2-build.31"), - ForgeDataMod(mod_id="botania", mod_version="1.18.2-434"), - ForgeDataMod(mod_id="highlighter", mod_version="ANY"), - ForgeDataMod(mod_id="spark", mod_version=""), - ForgeDataMod(mod_id="curios", mod_version="1.18.2-5.0.7.1"), - ForgeDataMod(mod_id="patchouli", mod_version="1.18.2-71.1"), - ForgeDataMod(mod_id="camera", mod_version="1.18.2-1.0.4"), - ForgeDataMod(mod_id="blockcarpentry", mod_version="1.18-0.3.0"), - ForgeDataMod(mod_id="thermal_foundation", mod_version="1.6.3.28"), - ForgeDataMod(mod_id="thermal_expansion", mod_version="1.6.3.13"), - ForgeDataMod(mod_id="libnonymous", mod_version="2.1.0"), - ForgeDataMod(mod_id="elevatorid", mod_version="1.18.2-1.8.4"), - ForgeDataMod(mod_id="runelic", mod_version="11.0.1"), + name="cloth_config", + version="", + ), + ForgeDataMod(name="shetiphiancore", version="3.10.10"), + ForgeDataMod(name="dummmmmmy", version="1.18-1.5.2"), + ForgeDataMod(name="supplementaries", version="1.18.2-1.5.13"), + ForgeDataMod(name="refinedstorage", version="1.10.2"), + ForgeDataMod(name="konkrete", version="1.3.3"), + ForgeDataMod(name="easy_piglins", version="1.18.2-1.0.0"), + ForgeDataMod(name="corpse", version="1.18.2-1.0.2"), + ForgeDataMod(name="packmenu", version=""), + ForgeDataMod(name="mcwbridges", version="2.0.3"), + ForgeDataMod(name="torchmaster", version="18.1.0"), + ForgeDataMod(name="compressium", version="1.4.2-build.9+mc1.18.2"), + ForgeDataMod(name="ping", version="1.18-1.8.0"), + ForgeDataMod(name="ironfurnaces", version="3.3.1"), + ForgeDataMod(name="mcwtrpdoors", version="1.0.6"), + ForgeDataMod(name="mcwfences", version="1.0.5"), + ForgeDataMod(name="supermartijn642corelib", version="1.0.19"), + ForgeDataMod(name="simplylight", version="1.18.2-1.4.2-build.31"), + ForgeDataMod(name="botania", version="1.18.2-434"), + ForgeDataMod(name="highlighter", version="ANY"), + ForgeDataMod(name="spark", version=""), + ForgeDataMod(name="curios", version="1.18.2-5.0.7.1"), + ForgeDataMod(name="patchouli", version="1.18.2-71.1"), + ForgeDataMod(name="camera", version="1.18.2-1.0.4"), + ForgeDataMod(name="blockcarpentry", version="1.18-0.3.0"), + ForgeDataMod(name="thermal_foundation", version="1.6.3.28"), + ForgeDataMod(name="thermal_expansion", version="1.6.3.13"), + ForgeDataMod(name="libnonymous", version="2.1.0"), + ForgeDataMod(name="elevatorid", version="1.18.2-1.8.4"), + ForgeDataMod(name="runelic", version="11.0.1"), ForgeDataMod( - mod_id="worldedit", - mod_version="", - ), - ForgeDataMod(mod_id="cfm", mod_version="7.0.0-pre29"), - ForgeDataMod(mod_id="architectury", mod_version="4.9.84"), - ForgeDataMod(mod_id="weirdinggadget", mod_version="2.2.11"), - ForgeDataMod(mod_id="mcwfurnitures", mod_version="3.0.0"), - ForgeDataMod(mod_id="trashcans", mod_version="1.0.15"), - ForgeDataMod(mod_id="mcwlights", mod_version="1.0.3"), - ForgeDataMod(mod_id="cucumber", mod_version="5.1.2"), - ForgeDataMod(mod_id="snad", mod_version="1.18.2-1.22.04.15a"), - ForgeDataMod(mod_id="jei", mod_version="9.7.0.209"), - ForgeDataMod(mod_id="ae2", mod_version="11.1.4"), - ForgeDataMod(mod_id="mekanism", mod_version="10.2.5"), - ForgeDataMod(mod_id="bdlib", mod_version="1.19.3.7"), - ForgeDataMod(mod_id="create", mod_version="0.5.0.d"), - ForgeDataMod(mod_id="waystones", mod_version="10.1.0"), - ForgeDataMod(mod_id="clumps", mod_version="8.0.0+10"), - ForgeDataMod(mod_id="shutupexperimentalsettings", mod_version="1.0.5"), - ForgeDataMod(mod_id="comforts", mod_version="1.18.2-5.0.0.4"), - ForgeDataMod(mod_id="naturescompass", mod_version="1.18.2-1.9.7-forge"), - ForgeDataMod(mod_id="storagenetwork", mod_version="1.18.2-1.6.1"), - ForgeDataMod(mod_id="framedcompactdrawers", mod_version="1.18-4.1.0"), - ForgeDataMod(mod_id="decorative_blocks", mod_version="2.1.0"), - ForgeDataMod(mod_id="botanypots", mod_version="8.0.12"), - ForgeDataMod(mod_id="ftbbackups2", mod_version="1.0.17"), - ForgeDataMod(mod_id="cofh_core", mod_version="1.6.4.21"), - ForgeDataMod(mod_id="mcjtylib", mod_version="1.18-6.0.15"), - ForgeDataMod(mod_id="ispawner", mod_version="1.0"), - ForgeDataMod(mod_id="everycomp", mod_version="1.18.2-1.5.7"), - ForgeDataMod(mod_id="jeitweaker", mod_version="3.0.0.8"), - ForgeDataMod(mod_id="terralith", mod_version="0.0NONE"), - ForgeDataMod(mod_id="mininggadgets", mod_version="1.11.0"), - ForgeDataMod(mod_id="crafttweaker", mod_version="9.1.197"), - ForgeDataMod(mod_id="akashictome", mod_version="1.5-20"), - ForgeDataMod(mod_id="forge", mod_version="ANY"), - ForgeDataMod(mod_id="colossalchests", mod_version="1.8.3"), - ForgeDataMod(mod_id="selene", mod_version="1.18.2-1.17.9"), - ForgeDataMod(mod_id="drippyloadingscreen", mod_version="1.6.4"), + name="worldedit", + version="", + ), + ForgeDataMod(name="cfm", version="7.0.0-pre29"), + ForgeDataMod(name="architectury", version="4.9.84"), + ForgeDataMod(name="weirdinggadget", version="2.2.11"), + ForgeDataMod(name="mcwfurnitures", version="3.0.0"), + ForgeDataMod(name="trashcans", version="1.0.15"), + ForgeDataMod(name="mcwlights", version="1.0.3"), + ForgeDataMod(name="cucumber", version="5.1.2"), + ForgeDataMod(name="snad", version="1.18.2-1.22.04.15a"), + ForgeDataMod(name="jei", version="9.7.0.209"), + ForgeDataMod(name="ae2", version="11.1.4"), + ForgeDataMod(name="mekanism", version="10.2.5"), + ForgeDataMod(name="bdlib", version="1.19.3.7"), + ForgeDataMod(name="create", version="0.5.0.d"), + ForgeDataMod(name="waystones", version="10.1.0"), + ForgeDataMod(name="clumps", version="8.0.0+10"), + ForgeDataMod(name="shutupexperimentalsettings", version="1.0.5"), + ForgeDataMod(name="comforts", version="1.18.2-5.0.0.4"), + ForgeDataMod(name="naturescompass", version="1.18.2-1.9.7-forge"), + ForgeDataMod(name="storagenetwork", version="1.18.2-1.6.1"), + ForgeDataMod(name="framedcompactdrawers", version="1.18-4.1.0"), + ForgeDataMod(name="decorative_blocks", version="2.1.0"), + ForgeDataMod(name="botanypots", version="8.0.12"), + ForgeDataMod(name="ftbbackups2", version="1.0.17"), + ForgeDataMod(name="cofh_core", version="1.6.4.21"), + ForgeDataMod(name="mcjtylib", version="1.18-6.0.15"), + ForgeDataMod(name="ispawner", version="1.0"), + ForgeDataMod(name="everycomp", version="1.18.2-1.5.7"), + ForgeDataMod(name="jeitweaker", version="3.0.0.8"), + ForgeDataMod(name="terralith", version="0.0NONE"), + ForgeDataMod(name="mininggadgets", version="1.11.0"), + ForgeDataMod(name="crafttweaker", version="9.1.197"), + ForgeDataMod(name="akashictome", version="1.5-20"), + ForgeDataMod(name="forge", version="ANY"), + ForgeDataMod(name="colossalchests", version="1.8.3"), + ForgeDataMod(name="selene", version="1.18.2-1.17.9"), + ForgeDataMod(name="drippyloadingscreen", version="1.6.4"), ForgeDataMod( - mod_id="craftingtweaks", - mod_version="", + name="craftingtweaks", + version="", ), - ForgeDataMod(mod_id="minecraft", mod_version="1.18.2"), - ForgeDataMod(mod_id="terrablender", mod_version="1.18.2-1.1.0.102"), + ForgeDataMod(name="minecraft", version="1.18.2"), + ForgeDataMod(name="terrablender", version="1.18.2-1.1.0.102"), ForgeDataMod( - mod_id="sophisticatedbackpacksvh", - mod_version="1.18.2-1.0.4.12", - ), - ForgeDataMod(mod_id="mousetweaks", mod_version="ANY"), - ForgeDataMod(mod_id="titanium", mod_version="3.5.6"), - ForgeDataMod(mod_id="jade", mod_version=""), - ForgeDataMod(mod_id="createtweaker", mod_version="2.0.0.17"), - ForgeDataMod(mod_id="easy_villagers", mod_version="1.18.2-1.0.10"), - ForgeDataMod(mod_id="pipez", mod_version="1.18.2-1.1.5"), - ForgeDataMod(mod_id="iceberg", mod_version="ANY"), - ForgeDataMod(mod_id="flywheel", mod_version=""), - ForgeDataMod(mod_id="mantle", mod_version="1.9.27"), - ForgeDataMod(mod_id="ecologics", mod_version="1.7.3"), - ForgeDataMod(mod_id="quark", mod_version="3.2-358"), - ForgeDataMod(mod_id="xaerominimap", mod_version="22.11.1"), - ForgeDataMod(mod_id="pigpen", mod_version="8.0.1"), - ForgeDataMod(mod_id="fastbench", mod_version="6.0.2"), - ForgeDataMod(mod_id="polymorph", mod_version="1.18.2-0.44"), - ForgeDataMod(mod_id="autoreglib", mod_version="1.7-53"), - ForgeDataMod(mod_id="storagedrawers", mod_version="10.2.1"), - ForgeDataMod(mod_id="fluxnetworks", mod_version="7.0.7.8"), - ForgeDataMod(mod_id="neoncraft2", mod_version="2.2"), - ForgeDataMod(mod_id="enercell", mod_version="0.0NONE"), - ForgeDataMod(mod_id="appleskin", mod_version="2.4.0+mc1.18"), + name="sophisticatedbackpacksvh", + version="1.18.2-1.0.4.12", + ), + ForgeDataMod(name="mousetweaks", version="ANY"), + ForgeDataMod(name="titanium", version="3.5.6"), + ForgeDataMod(name="jade", version=""), + ForgeDataMod(name="createtweaker", version="2.0.0.17"), + ForgeDataMod(name="easy_villagers", version="1.18.2-1.0.10"), + ForgeDataMod(name="pipez", version="1.18.2-1.1.5"), + ForgeDataMod(name="iceberg", version="ANY"), + ForgeDataMod(name="flywheel", version=""), + ForgeDataMod(name="mantle", version="1.9.27"), + ForgeDataMod(name="ecologics", version="1.7.3"), + ForgeDataMod(name="quark", version="3.2-358"), + ForgeDataMod(name="xaerominimap", version="22.11.1"), + ForgeDataMod(name="pigpen", version="8.0.1"), + ForgeDataMod(name="fastbench", version="6.0.2"), + ForgeDataMod(name="polymorph", version="1.18.2-0.44"), + ForgeDataMod(name="autoreglib", version="1.7-53"), + ForgeDataMod(name="storagedrawers", version="10.2.1"), + ForgeDataMod(name="fluxnetworks", version="7.0.7.8"), + ForgeDataMod(name="neoncraft2", version="2.2"), + ForgeDataMod(name="enercell", version="0.0NONE"), + ForgeDataMod(name="appleskin", version="2.4.0+mc1.18"), ForgeDataMod( - mod_id="ferritecore", - mod_version="", + name="ferritecore", + version="", ), - ForgeDataMod(mod_id="modularrouters", mod_version="9.1.1-93"), - ForgeDataMod(mod_id="refinedstorageaddons", mod_version="0.8.2"), - ForgeDataMod(mod_id="openloader", mod_version="12.0.1"), - ForgeDataMod(mod_id="the_vault", mod_version="1.18.2-2.0.10.869"), + ForgeDataMod(name="modularrouters", version="9.1.1-93"), + ForgeDataMod(name="refinedstorageaddons", version="0.8.2"), + ForgeDataMod(name="openloader", version="12.0.1"), + ForgeDataMod(name="the_vault", version="1.18.2-2.0.10.869"), ], ), ("truncated", False), @@ -684,10 +684,10 @@ class TestForgeDataV1(TestJavaStatusResponse): fml_network_version=1, channels=[], mods=[ - ForgeDataMod(mod_id="minecraft", mod_version="1.12.2"), - ForgeDataMod(mod_id="mcp", mod_version="9.42"), - ForgeDataMod(mod_id="FML", mod_version="8.0.99.99"), - ForgeDataMod(mod_id="forge", mod_version="14.23.5.2859"), + ForgeDataMod(name="minecraft", version="1.12.2"), + ForgeDataMod(name="mcp", version="9.42"), + ForgeDataMod(name="FML", version="8.0.99.99"), + ForgeDataMod(name="forge", version="14.23.5.2859"), ], truncated=False, ), @@ -727,7 +727,7 @@ class TestForgeDataV2(TestJavaStatusResponse): fml_network_version=2, channels=[], mods=[ - ForgeDataMod(mod_id="forge", mod_version="ANY"), + ForgeDataMod(name="forge", version="ANY"), ], truncated=False, ), @@ -772,14 +772,14 @@ class TestForgeDataV3(TestJavaStatusResponse): ForgeData( fml_network_version=3, channels=[ - ForgeDataChannel(res="minecraft:unregister", version="FML3", required=True), - ForgeDataChannel(res="minecraft:register", version="FML3", required=True), - ForgeDataChannel(res="forge:tier_sorting", version="1.0", required=False), - ForgeDataChannel(res="forge:split", version="1.1", required=True), + ForgeDataChannel(name="minecraft:unregister", version="FML3", required=True), + ForgeDataChannel(name="minecraft:register", version="FML3", required=True), + ForgeDataChannel(name="forge:tier_sorting", version="1.0", required=False), + ForgeDataChannel(name="forge:split", version="1.1", required=True), ], mods=[ - ForgeDataMod(mod_id="minecraft", mod_version="1.20.1"), - ForgeDataMod(mod_id="forge", mod_version="ANY"), + ForgeDataMod(name="minecraft", version="1.20.1"), + ForgeDataMod(name="forge", version="ANY"), ], truncated=False, ), From 76f728ba8a0e178ed88de6755ea582d9496c601b Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Wed, 20 Sep 2023 20:21:47 -0500 Subject: [PATCH 47/67] Formatting --- mcstatus/forge_data.py | 6 +++--- mcstatus/status_response.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 0f49d873..5fdc76cc 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -37,16 +37,16 @@ class RawForgeDataChannel(TypedDict): class RawForgeDataMod(TypedDict): modid: NotRequired[str] - modId: NotRequired[str] # noqa: N815 # camel case + modId: NotRequired[str] # camel case modmarker: NotRequired[str] """Mod version.""" version: NotRequired[str] class RawForgeData(TypedDict): - fmlNetworkVersion: NotRequired[int] # noqa: N815 # camel case + fmlNetworkVersion: NotRequired[int] # camel case channels: NotRequired[list[RawForgeDataChannel]] mods: NotRequired[list[RawForgeDataMod]] - modList: NotRequired[list[RawForgeDataMod]] # noqa: N815 # camel case + modList: NotRequired[list[RawForgeDataMod]] # camel case d: NotRequired[str] truncated: NotRequired[bool] diff --git a/mcstatus/status_response.py b/mcstatus/status_response.py index 84d77db6..ca0657cc 100644 --- a/mcstatus/status_response.py +++ b/mcstatus/status_response.py @@ -42,7 +42,7 @@ class RawJavaResponse(TypedDict): players: RawJavaResponsePlayers version: RawJavaResponseVersion favicon: NotRequired[str] - forgeData: NotRequired[RawForgeData] # noqa: N815 + forgeData: NotRequired[RawForgeData] modinfo: NotRequired[RawForgeData] else: From 80a4bc5c6360da974c3f484abecc474550e70407 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 1 Oct 2023 10:20:04 -0500 Subject: [PATCH 48/67] Update mcstatus/forge_data.py Co-authored-by: Perchun Pak --- mcstatus/forge_data.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 5fdc76cc..168bee82 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -246,8 +246,7 @@ def build(cls, raw: RawForgeData) -> Self | None: channels.append(ForgeDataChannel.decode(buffer)) except IOError: if not truncated: - raise - # Semi-expect errors if truncated, we are missing data + raise # If answer wasn't truncated, we lost some data on the way return cls( fml_network_version=fml_network_version, From 7675af1972ebccb201dc695fa691b7d84df349e2 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 1 Oct 2023 10:22:53 -0500 Subject: [PATCH 49/67] Remove old comments --- .pre-commit-config.yaml | 8 ++++---- mcstatus/forge_data.py | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e49d0eb3..d9adfb2c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,7 +20,7 @@ repos: - id: black name: Black description: Auto-format the code with black - entry: poetry run black + entry: black language: system types: [python] @@ -29,7 +29,7 @@ repos: - id: ruff name: Ruff description: Run ruff checks on the code - entry: poetry run ruff check --force-exclude + entry: ruff check --force-exclude language: system types: [python] require_serial: true @@ -40,7 +40,7 @@ repos: - id: isort name: ISort description: Sort imports with isort - entry: poetry run isort + entry: isort language: system types: [python] @@ -49,7 +49,7 @@ repos: - id: pyright name: Pyright description: Run pyright type checker - entry: poetry run pyright + entry: pyright language: system types: [python] pass_filenames: false # pyright runs for the entire project, it can't run for single files diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 168bee82..705150a6 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -37,16 +37,16 @@ class RawForgeDataChannel(TypedDict): class RawForgeDataMod(TypedDict): modid: NotRequired[str] - modId: NotRequired[str] # camel case + modId: NotRequired[str] modmarker: NotRequired[str] """Mod version.""" version: NotRequired[str] class RawForgeData(TypedDict): - fmlNetworkVersion: NotRequired[int] # camel case + fmlNetworkVersion: NotRequired[int] channels: NotRequired[list[RawForgeDataChannel]] mods: NotRequired[list[RawForgeDataMod]] - modList: NotRequired[list[RawForgeDataMod]] # camel case + modList: NotRequired[list[RawForgeDataMod]] d: NotRequired[str] truncated: NotRequired[bool] From 740503f62f0e6aeb7b17d404567c61fb5235f24e Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 1 Oct 2023 15:49:55 -0500 Subject: [PATCH 50/67] Handle reading shorts with StringBuffer --- .pre-commit-config.yaml | 8 ++++---- mcstatus/forge_data.py | 23 +++++++++-------------- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d9adfb2c..e49d0eb3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,7 +20,7 @@ repos: - id: black name: Black description: Auto-format the code with black - entry: black + entry: poetry run black language: system types: [python] @@ -29,7 +29,7 @@ repos: - id: ruff name: Ruff description: Run ruff checks on the code - entry: ruff check --force-exclude + entry: poetry run ruff check --force-exclude language: system types: [python] require_serial: true @@ -40,7 +40,7 @@ repos: - id: isort name: ISort description: Sort imports with isort - entry: isort + entry: poetry run isort language: system types: [python] @@ -49,7 +49,7 @@ repos: - id: pyright name: Pyright description: Run pyright type checker - entry: pyright + entry: poetry run pyright language: system types: [python] pass_filenames: false # pyright runs for the entire project, it can't run for single files diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 705150a6..51a2e98d 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -157,11 +157,11 @@ def read(self, length: int) -> bytearray: data = bytearray() while self.received and len(data) < length: data.append(self.received.pop(0)) - for _ in range(length - len(data)): + while len(data) < length: result = self.stringio.read(1) if not result: raise IOError(f"Not enough data to read! {len(data)} < {length}") - data.extend(result.encode("utf-8")) + data.extend(result.encode("utf-16be")) while len(data) > length: self.received.append(data.pop()) return data @@ -181,28 +181,23 @@ class ForgeData: @staticmethod def _decode_optimized(string: str) -> Connection: """Decode buffer from UTF-16 optimized binary data ``string``.""" - text = io.StringIO(string) + str_buffer = StringBuffer(io.StringIO(string)) - def read() -> int: - result = text.read(1) - if not result: - return 0 - return ord(result) - - size = read() | (read() << 15) + size = str_buffer.read_short() | (str_buffer.read_short() << 15) buffer = Connection() value, bits = 0, 0 for _ in range(len(string) - 2): + # Ignoring sign bit + value |= (str_buffer.read_short() & 0x7FFF) << bits + bits += 15 while bits >= 8: - buffer.receive((value & 0xFF).to_bytes(length=1, byteorder="big", signed=False)) + buffer.receive((value & 0xFF).to_bytes()) value >>= 8 bits -= 8 - value |= (read() & 0x7FFF) << bits - bits += 15 while buffer.remaining() < size: - buffer.receive((value & 0xFF).to_bytes(length=1, byteorder="big", signed=False)) + buffer.receive((value & 0xFF).to_bytes()) value >>= 8 bits -= 8 return buffer From 89b85d9f542349a00317ea043cc67b7a7b541ff1 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 1 Oct 2023 15:53:58 -0500 Subject: [PATCH 51/67] Pyright complains arguments with defaults aren't set --- mcstatus/forge_data.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 51a2e98d..d43ec809 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -192,12 +192,12 @@ def _decode_optimized(string: str) -> Connection: value |= (str_buffer.read_short() & 0x7FFF) << bits bits += 15 while bits >= 8: - buffer.receive((value & 0xFF).to_bytes()) + buffer.receive((value & 0xFF).to_bytes(1, 'big')) value >>= 8 bits -= 8 while buffer.remaining() < size: - buffer.receive((value & 0xFF).to_bytes()) + buffer.receive((value & 0xFF).to_bytes(1, 'big')) value >>= 8 bits -= 8 return buffer From 7cd51b60182f1c4c48e28c5b8b9f10b60ba04b7f Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Sun, 1 Oct 2023 15:56:13 -0500 Subject: [PATCH 52/67] update quotes --- mcstatus/forge_data.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index d43ec809..e8955d62 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -192,12 +192,12 @@ def _decode_optimized(string: str) -> Connection: value |= (str_buffer.read_short() & 0x7FFF) << bits bits += 15 while bits >= 8: - buffer.receive((value & 0xFF).to_bytes(1, 'big')) + buffer.receive((value & 0xFF).to_bytes(1, "big")) value >>= 8 bits -= 8 while buffer.remaining() < size: - buffer.receive((value & 0xFF).to_bytes(1, 'big')) + buffer.receive((value & 0xFF).to_bytes(1, "big")) value >>= 8 bits -= 8 return buffer From 534c366018361383e972b35ab7109fa0ca93ad36 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Mon, 2 Oct 2023 21:59:51 -0500 Subject: [PATCH 53/67] Move reading code to `StringBuffer` --- mcstatus/forge_data.py | 50 ++++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index e8955d62..6ffa1250 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -144,7 +144,7 @@ def decode(cls, buffer: Connection) -> tuple[Self, list[ForgeDataChannel]]: class StringBuffer(BaseReadSync, BaseConnection): - """String Buffer""" + """String Buffer for reading utf-16 encoded binary data.""" __slots__ = ("stringio", "received") @@ -166,6 +166,31 @@ def read(self, length: int) -> bytearray: self.received.append(data.pop()) return data + def remaining(self) -> int: + """Return number of reads remaining.""" + return len(self.stringio.getvalue()) - self.stringio.tell() + len(self.received) + + def read_optimized_size(self) -> int: + """Read encoded data length.""" + return self.read_short() | (self.read_short() << 15) + + def read_optimized_buffer(self) -> Connection: + """Read encoded buffer.""" + size = self.read_optimized_size() + + buffer = Connection() + value, bits = 0, 0 + while buffer.remaining() < size: + if bits < 8 and self.remaining(): + # Ignoring sign bit + value |= (self.read_short() & 0x7FFF) << bits + bits += 15 + buffer.receive((value & 0xFF).to_bytes(1, "big")) + value >>= 8 + bits -= 8 + + return buffer + @dataclass class ForgeData: @@ -181,26 +206,9 @@ class ForgeData: @staticmethod def _decode_optimized(string: str) -> Connection: """Decode buffer from UTF-16 optimized binary data ``string``.""" - str_buffer = StringBuffer(io.StringIO(string)) - - size = str_buffer.read_short() | (str_buffer.read_short() << 15) - - buffer = Connection() - value, bits = 0, 0 - for _ in range(len(string) - 2): - # Ignoring sign bit - value |= (str_buffer.read_short() & 0x7FFF) << bits - bits += 15 - while bits >= 8: - buffer.receive((value & 0xFF).to_bytes(1, "big")) - value >>= 8 - bits -= 8 - - while buffer.remaining() < size: - buffer.receive((value & 0xFF).to_bytes(1, "big")) - value >>= 8 - bits -= 8 - return buffer + with io.StringIO(string) as text: + str_buffer = StringBuffer(text) + return str_buffer.read_optimized_buffer() @classmethod def build(cls, raw: RawForgeData) -> Self | None: From b4f30cf6d3505c22757fa9aa64c6210631bb614e Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Tue, 3 Oct 2023 14:35:13 -0500 Subject: [PATCH 54/67] Change to `StringIO` instead of `IO[str]` --- mcstatus/forge_data.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 6ffa1250..6be41f52 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -14,9 +14,9 @@ from __future__ import annotations -import io from dataclasses import dataclass -from typing import Final, IO, TYPE_CHECKING +from io import StringIO +from typing import Final, TYPE_CHECKING from mcstatus.protocol.connection import BaseConnection, BaseReadSync, Connection @@ -148,7 +148,7 @@ class StringBuffer(BaseReadSync, BaseConnection): __slots__ = ("stringio", "received") - def __init__(self, stringio: IO[str]) -> None: + def __init__(self, stringio: StringIO) -> None: self.stringio = stringio self.received = bytearray() @@ -206,7 +206,7 @@ class ForgeData: @staticmethod def _decode_optimized(string: str) -> Connection: """Decode buffer from UTF-16 optimized binary data ``string``.""" - with io.StringIO(string) as text: + with StringIO(string) as text: str_buffer = StringBuffer(text) return str_buffer.read_optimized_buffer() From 4d10d66935c18fd9c5009702ce646f877b1989dd Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Mon, 11 Dec 2023 18:36:52 -0600 Subject: [PATCH 55/67] Fix fixtures not being imported directly anymore --- tests/status_response/test_java.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/status_response/test_java.py b/tests/status_response/test_java.py index 14abb701..f5e1d2d7 100644 --- a/tests/status_response/test_java.py +++ b/tests/status_response/test_java.py @@ -521,7 +521,7 @@ class TestForgeData(BaseStatusResponseTest): ("truncated", False), ] - @fixture(scope="class") + @pytest.fixture(scope="class") def build(self): return ForgeData.build( RawForgeData( From 962e3004043cf83233186db3c8530625cb5dc7de Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Tue, 12 Dec 2023 18:52:47 -0600 Subject: [PATCH 56/67] Rename mod `version` attribute to `marker` and fix type issues --- mcstatus/forge_data.py | 6 +- mcstatus/motd/__init__.py | 18 +- mcstatus/status_response.py | 6 +- tests/status_response/test_java.py | 304 +++++++++++++++-------------- 4 files changed, 173 insertions(+), 161 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 6be41f52..e94b1afb 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -98,7 +98,7 @@ def decode(cls, buffer: Connection, mod_id: str | None = None) -> Self: @dataclass class ForgeDataMod: name: str - version: str + marker: str @classmethod def build(cls, raw: RawForgeDataMod) -> Self: @@ -117,7 +117,7 @@ def build(cls, raw: RawForgeDataMod) -> Self: if mod_id is None: raise ValueError(f"Mod ID in Forge mod data must be provided. Mod version: {mod_version!r}.") - return cls(name=mod_id, version=mod_version) + return cls(name=mod_id, marker=mod_version) @classmethod def decode(cls, buffer: Connection) -> tuple[Self, list[ForgeDataChannel]]: @@ -140,7 +140,7 @@ def decode(cls, buffer: Connection) -> tuple[Self, list[ForgeDataChannel]]: for _ in range(channel_count): channels.append(ForgeDataChannel.decode(buffer, mod_id)) - return cls(name=mod_id, version=mod_version), channels + return cls(name=mod_id, marker=mod_version), channels class StringBuffer(BaseReadSync, BaseConnection): diff --git a/mcstatus/motd/__init__.py b/mcstatus/motd/__init__.py index 1d41775c..2681e1e0 100644 --- a/mcstatus/motd/__init__.py +++ b/mcstatus/motd/__init__.py @@ -4,9 +4,17 @@ import typing as t from dataclasses import dataclass -from mcstatus.motd.components import Formatting, MinecraftColor, ParsedMotdComponent, TranslationTag, WebColor -from mcstatus.motd.simplifies import get_unused_elements, squash_nearby_strings -from mcstatus.motd.transformers import AnsiTransformer, HtmlTransformer, MinecraftTransformer, PlainTransformer +from mcstatus.motd.components import Formatting as Formatting +from mcstatus.motd.components import MinecraftColor as MinecraftColor +from mcstatus.motd.components import ParsedMotdComponent as ParsedMotdComponent +from mcstatus.motd.components import TranslationTag as TranslationTag +from mcstatus.motd.components import WebColor as WebColor +from mcstatus.motd.simplifies import get_unused_elements as get_unused_elements +from mcstatus.motd.simplifies import squash_nearby_strings as squash_nearby_strings +from mcstatus.motd.transformers import AnsiTransformer as AnsiTransformer +from mcstatus.motd.transformers import HtmlTransformer as HtmlTransformer +from mcstatus.motd.transformers import MinecraftTransformer as MinecraftTransformer +from mcstatus.motd.transformers import PlainTransformer as PlainTransformer if t.TYPE_CHECKING: from typing_extensions import Self @@ -49,7 +57,7 @@ def parse( """ original_raw = raw.copy() if hasattr(raw, "copy") else raw # type: ignore # Cannot access "copy" for type "str" if isinstance(raw, list): - raw: RawJavaResponseMotdWhenDict = {"extra": raw} + raw: RawJavaResponseMotdWhenDict = {"extra": raw} # type: ignore[no-redef] if isinstance(raw, str): parsed = cls._parse_as_str(raw, bedrock=bedrock) @@ -183,7 +191,7 @@ def simplify(self) -> Self: parsed = [el for index, el in enumerate(parsed) if index not in unused_elements] parsed = squash_nearby_strings(parsed) - return __class__(parsed, self.raw, bedrock=self.bedrock) + return self.__class__(parsed, self.raw, bedrock=self.bedrock) def to_plain(self) -> str: """Get plain text from a MOTD, without any colors/formatting. diff --git a/mcstatus/status_response.py b/mcstatus/status_response.py index 8443c5ee..fb088568 100644 --- a/mcstatus/status_response.py +++ b/mcstatus/status_response.py @@ -4,7 +4,8 @@ from dataclasses import dataclass from typing import Any, TYPE_CHECKING -from mcstatus.forge_data import ForgeData, RawForgeData +from mcstatus.forge_data import ForgeData as ForgeData +from mcstatus.forge_data import RawForgeData from mcstatus.motd import Motd if TYPE_CHECKING: @@ -44,6 +45,7 @@ class RawJavaResponse(TypedDict): favicon: NotRequired[str] forgeData: NotRequired[RawForgeData] modinfo: NotRequired[RawForgeData] + enforcesSecureChat: NotRequired[bool] else: RawJavaResponsePlayer = dict @@ -91,7 +93,7 @@ def description(self) -> str: @classmethod @abstractmethod - def build(cls, *args, **kwargs) -> Self: + def build(cls, *args: object, **kwargs: object) -> Self: """Build BaseStatusResponse and check is it valid. :param args: Arguments in specific realisation. diff --git a/tests/status_response/test_java.py b/tests/status_response/test_java.py index f5e1d2d7..4cff00da 100644 --- a/tests/status_response/test_java.py +++ b/tests/status_response/test_java.py @@ -35,7 +35,7 @@ class TestJavaStatusResponse(BaseStatusResponseTest): } @pytest.fixture(scope="class") - def build(self): + def build(self) -> JavaStatusResponse: return JavaStatusResponse.build(self.RAW) # type: ignore # dict[str, Unknown] cannot be assigned to TypedDict @@ -64,7 +64,7 @@ class TestJavaStatusPlayers(BaseStatusResponseTest): } @pytest.fixture(scope="class") - def build(self): + def build(self) -> JavaStatusPlayers: return JavaStatusPlayers.build( { "max": 20, @@ -77,7 +77,7 @@ def build(self): } ) - def test_empty_sample_turns_into_empty_list(self): + def test_empty_sample_turns_into_empty_list(self) -> None: assert JavaStatusPlayers.build({"max": 20, "online": 0, "sample": []}).sample == [] @@ -86,10 +86,10 @@ class TestJavaStatusPlayer(BaseStatusResponseTest): EXPECTED_VALUES = [("name", "foo"), ("id", "0b3717c4-f45d-47c8-b8e2-3d9ff6f93a89")] @pytest.fixture(scope="class") - def build(self): + def build(self) -> JavaStatusPlayer: return JavaStatusPlayer.build({"name": "foo", "id": "0b3717c4-f45d-47c8-b8e2-3d9ff6f93a89"}) - def test_id_field_the_same_as_uuid(self): + def test_id_field_the_same_as_uuid(self) -> None: build = JavaStatusPlayer.build({"name": "foo", "id": "0b3717c4-f45d-47c8-b8e2-3d9ff6f93a89"}) assert build.id is build.uuid @@ -102,7 +102,7 @@ class TestJavaStatusVersion(BaseStatusResponseTest): EXPECTED_VALUES = [("name", "1.8-pre1"), ("protocol", 44)] @pytest.fixture(scope="class") - def build(self): + def build(self) -> JavaStatusVersion: return JavaStatusVersion.build({"name": "1.8-pre1", "protocol": 44}) @@ -359,171 +359,171 @@ class TestForgeData(BaseStatusResponseTest): ( "mods", [ - ForgeDataMod(name="rsrequestify", version="2.2.0"), - ForgeDataMod(name="cyclopscore", version="1.15.1"), - ForgeDataMod(name="auudio", version="1.0.3"), - ForgeDataMod(name="auxiliaryblocks", version="1.18.2-0.0.14"), - ForgeDataMod(name="supermartijn642configlib", version="1.1.6"), - ForgeDataMod(name="alexsmobs", version="1.18.6"), - ForgeDataMod(name="architects_palette", version="1.1.2"), - ForgeDataMod(name="cagerium", version="1.18.2-1.1.0"), - ForgeDataMod(name="mcwwindows", version="2.0.3"), + ForgeDataMod(name="rsrequestify", marker="2.2.0"), + ForgeDataMod(name="cyclopscore", marker="1.15.1"), + ForgeDataMod(name="auudio", marker="1.0.3"), + ForgeDataMod(name="auxiliaryblocks", marker="1.18.2-0.0.14"), + ForgeDataMod(name="supermartijn642configlib", marker="1.1.6"), + ForgeDataMod(name="alexsmobs", marker="1.18.6"), + ForgeDataMod(name="architects_palette", marker="1.1.2"), + ForgeDataMod(name="cagerium", marker="1.18.2-1.1.0"), + ForgeDataMod(name="mcwwindows", marker="2.0.3"), ForgeDataMod( name="sophisticatedcore", - version="1.18.2-0.5.32.179", - ), - ForgeDataMod(name="thermal", version="1.6.3.28"), - ForgeDataMod(name="rftoolsbase", version="1.18-3.0.9"), - ForgeDataMod(name="initialinventory", version="6.0.8"), - ForgeDataMod(name="irongenerators", version="2.0.1"), - ForgeDataMod(name="xaeroworldmap", version="1.25.1"), - ForgeDataMod(name="cookingforblockheads", version="12.0.2"), + marker="1.18.2-0.5.32.179", + ), + ForgeDataMod(name="thermal", marker="1.6.3.28"), + ForgeDataMod(name="rftoolsbase", marker="1.18-3.0.9"), + ForgeDataMod(name="initialinventory", marker="6.0.8"), + ForgeDataMod(name="irongenerators", marker="2.0.1"), + ForgeDataMod(name="xaeroworldmap", marker="1.25.1"), + ForgeDataMod(name="cookingforblockheads", marker="12.0.2"), ForgeDataMod( name="controlling", - version="", - ), - ForgeDataMod(name="xnet", version="1.18-4.0.5"), - ForgeDataMod(name="placebo", version="6.4.1"), - ForgeDataMod(name="citadel", version="1.11.3"), - ForgeDataMod(name="powah", version="3.0.1-beta"), - ForgeDataMod(name="bookshelf", version="13.2.50"), - ForgeDataMod(name="lootbeams", version="1.18.1"), + marker="", + ), + ForgeDataMod(name="xnet", marker="1.18-4.0.5"), + ForgeDataMod(name="placebo", marker="6.4.1"), + ForgeDataMod(name="citadel", marker="1.11.3"), + ForgeDataMod(name="powah", marker="3.0.1-beta"), + ForgeDataMod(name="bookshelf", marker="13.2.50"), + ForgeDataMod(name="lootbeams", marker="1.18.1"), ForgeDataMod( name="sophisticatedbackpacks", - version="1.18.2-3.18.35.752", + marker="1.18.2-3.18.35.752", ), - ForgeDataMod(name="twigs", version="1.1.4-patch1+1.18.2"), + ForgeDataMod(name="twigs", marker="1.1.4-patch1+1.18.2"), ForgeDataMod( name="buildinggadgets", - version="3.13.0-build.5+mc1.18.2}", - ), - ForgeDataMod(name="darkutils", version="10.0.5"), - ForgeDataMod(name="mcwdoors", version="1.0.6"), - ForgeDataMod(name="waddles", version="1.18.2-0.8.19"), - ForgeDataMod(name="mekanismgenerators", version="10.2.5"), - ForgeDataMod(name="balm", version="3.2.0+0"), - ForgeDataMod(name="waila", version=""), - ForgeDataMod(name="jeresources", version="0.14.1.171"), + marker="3.13.0-build.5+mc1.18.2}", + ), + ForgeDataMod(name="darkutils", marker="10.0.5"), + ForgeDataMod(name="mcwdoors", marker="1.0.6"), + ForgeDataMod(name="waddles", marker="1.18.2-0.8.19"), + ForgeDataMod(name="mekanismgenerators", marker="10.2.5"), + ForgeDataMod(name="balm", marker="3.2.0+0"), + ForgeDataMod(name="waila", marker=""), + ForgeDataMod(name="jeresources", marker="0.14.1.171"), ForgeDataMod( name="cloth_config", - version="", - ), - ForgeDataMod(name="shetiphiancore", version="3.10.10"), - ForgeDataMod(name="dummmmmmy", version="1.18-1.5.2"), - ForgeDataMod(name="supplementaries", version="1.18.2-1.5.13"), - ForgeDataMod(name="refinedstorage", version="1.10.2"), - ForgeDataMod(name="konkrete", version="1.3.3"), - ForgeDataMod(name="easy_piglins", version="1.18.2-1.0.0"), - ForgeDataMod(name="corpse", version="1.18.2-1.0.2"), - ForgeDataMod(name="packmenu", version=""), - ForgeDataMod(name="mcwbridges", version="2.0.3"), - ForgeDataMod(name="torchmaster", version="18.1.0"), - ForgeDataMod(name="compressium", version="1.4.2-build.9+mc1.18.2"), - ForgeDataMod(name="ping", version="1.18-1.8.0"), - ForgeDataMod(name="ironfurnaces", version="3.3.1"), - ForgeDataMod(name="mcwtrpdoors", version="1.0.6"), - ForgeDataMod(name="mcwfences", version="1.0.5"), - ForgeDataMod(name="supermartijn642corelib", version="1.0.19"), - ForgeDataMod(name="simplylight", version="1.18.2-1.4.2-build.31"), - ForgeDataMod(name="botania", version="1.18.2-434"), - ForgeDataMod(name="highlighter", version="ANY"), - ForgeDataMod(name="spark", version=""), - ForgeDataMod(name="curios", version="1.18.2-5.0.7.1"), - ForgeDataMod(name="patchouli", version="1.18.2-71.1"), - ForgeDataMod(name="camera", version="1.18.2-1.0.4"), - ForgeDataMod(name="blockcarpentry", version="1.18-0.3.0"), - ForgeDataMod(name="thermal_foundation", version="1.6.3.28"), - ForgeDataMod(name="thermal_expansion", version="1.6.3.13"), - ForgeDataMod(name="libnonymous", version="2.1.0"), - ForgeDataMod(name="elevatorid", version="1.18.2-1.8.4"), - ForgeDataMod(name="runelic", version="11.0.1"), + marker="", + ), + ForgeDataMod(name="shetiphiancore", marker="3.10.10"), + ForgeDataMod(name="dummmmmmy", marker="1.18-1.5.2"), + ForgeDataMod(name="supplementaries", marker="1.18.2-1.5.13"), + ForgeDataMod(name="refinedstorage", marker="1.10.2"), + ForgeDataMod(name="konkrete", marker="1.3.3"), + ForgeDataMod(name="easy_piglins", marker="1.18.2-1.0.0"), + ForgeDataMod(name="corpse", marker="1.18.2-1.0.2"), + ForgeDataMod(name="packmenu", marker=""), + ForgeDataMod(name="mcwbridges", marker="2.0.3"), + ForgeDataMod(name="torchmaster", marker="18.1.0"), + ForgeDataMod(name="compressium", marker="1.4.2-build.9+mc1.18.2"), + ForgeDataMod(name="ping", marker="1.18-1.8.0"), + ForgeDataMod(name="ironfurnaces", marker="3.3.1"), + ForgeDataMod(name="mcwtrpdoors", marker="1.0.6"), + ForgeDataMod(name="mcwfences", marker="1.0.5"), + ForgeDataMod(name="supermartijn642corelib", marker="1.0.19"), + ForgeDataMod(name="simplylight", marker="1.18.2-1.4.2-build.31"), + ForgeDataMod(name="botania", marker="1.18.2-434"), + ForgeDataMod(name="highlighter", marker="ANY"), + ForgeDataMod(name="spark", marker=""), + ForgeDataMod(name="curios", marker="1.18.2-5.0.7.1"), + ForgeDataMod(name="patchouli", marker="1.18.2-71.1"), + ForgeDataMod(name="camera", marker="1.18.2-1.0.4"), + ForgeDataMod(name="blockcarpentry", marker="1.18-0.3.0"), + ForgeDataMod(name="thermal_foundation", marker="1.6.3.28"), + ForgeDataMod(name="thermal_expansion", marker="1.6.3.13"), + ForgeDataMod(name="libnonymous", marker="2.1.0"), + ForgeDataMod(name="elevatorid", marker="1.18.2-1.8.4"), + ForgeDataMod(name="runelic", marker="11.0.1"), ForgeDataMod( name="worldedit", - version="", - ), - ForgeDataMod(name="cfm", version="7.0.0-pre29"), - ForgeDataMod(name="architectury", version="4.9.84"), - ForgeDataMod(name="weirdinggadget", version="2.2.11"), - ForgeDataMod(name="mcwfurnitures", version="3.0.0"), - ForgeDataMod(name="trashcans", version="1.0.15"), - ForgeDataMod(name="mcwlights", version="1.0.3"), - ForgeDataMod(name="cucumber", version="5.1.2"), - ForgeDataMod(name="snad", version="1.18.2-1.22.04.15a"), - ForgeDataMod(name="jei", version="9.7.0.209"), - ForgeDataMod(name="ae2", version="11.1.4"), - ForgeDataMod(name="mekanism", version="10.2.5"), - ForgeDataMod(name="bdlib", version="1.19.3.7"), - ForgeDataMod(name="create", version="0.5.0.d"), - ForgeDataMod(name="waystones", version="10.1.0"), - ForgeDataMod(name="clumps", version="8.0.0+10"), - ForgeDataMod(name="shutupexperimentalsettings", version="1.0.5"), - ForgeDataMod(name="comforts", version="1.18.2-5.0.0.4"), - ForgeDataMod(name="naturescompass", version="1.18.2-1.9.7-forge"), - ForgeDataMod(name="storagenetwork", version="1.18.2-1.6.1"), - ForgeDataMod(name="framedcompactdrawers", version="1.18-4.1.0"), - ForgeDataMod(name="decorative_blocks", version="2.1.0"), - ForgeDataMod(name="botanypots", version="8.0.12"), - ForgeDataMod(name="ftbbackups2", version="1.0.17"), - ForgeDataMod(name="cofh_core", version="1.6.4.21"), - ForgeDataMod(name="mcjtylib", version="1.18-6.0.15"), - ForgeDataMod(name="ispawner", version="1.0"), - ForgeDataMod(name="everycomp", version="1.18.2-1.5.7"), - ForgeDataMod(name="jeitweaker", version="3.0.0.8"), - ForgeDataMod(name="terralith", version="0.0NONE"), - ForgeDataMod(name="mininggadgets", version="1.11.0"), - ForgeDataMod(name="crafttweaker", version="9.1.197"), - ForgeDataMod(name="akashictome", version="1.5-20"), - ForgeDataMod(name="forge", version="ANY"), - ForgeDataMod(name="colossalchests", version="1.8.3"), - ForgeDataMod(name="selene", version="1.18.2-1.17.9"), - ForgeDataMod(name="drippyloadingscreen", version="1.6.4"), + marker="", + ), + ForgeDataMod(name="cfm", marker="7.0.0-pre29"), + ForgeDataMod(name="architectury", marker="4.9.84"), + ForgeDataMod(name="weirdinggadget", marker="2.2.11"), + ForgeDataMod(name="mcwfurnitures", marker="3.0.0"), + ForgeDataMod(name="trashcans", marker="1.0.15"), + ForgeDataMod(name="mcwlights", marker="1.0.3"), + ForgeDataMod(name="cucumber", marker="5.1.2"), + ForgeDataMod(name="snad", marker="1.18.2-1.22.04.15a"), + ForgeDataMod(name="jei", marker="9.7.0.209"), + ForgeDataMod(name="ae2", marker="11.1.4"), + ForgeDataMod(name="mekanism", marker="10.2.5"), + ForgeDataMod(name="bdlib", marker="1.19.3.7"), + ForgeDataMod(name="create", marker="0.5.0.d"), + ForgeDataMod(name="waystones", marker="10.1.0"), + ForgeDataMod(name="clumps", marker="8.0.0+10"), + ForgeDataMod(name="shutupexperimentalsettings", marker="1.0.5"), + ForgeDataMod(name="comforts", marker="1.18.2-5.0.0.4"), + ForgeDataMod(name="naturescompass", marker="1.18.2-1.9.7-forge"), + ForgeDataMod(name="storagenetwork", marker="1.18.2-1.6.1"), + ForgeDataMod(name="framedcompactdrawers", marker="1.18-4.1.0"), + ForgeDataMod(name="decorative_blocks", marker="2.1.0"), + ForgeDataMod(name="botanypots", marker="8.0.12"), + ForgeDataMod(name="ftbbackups2", marker="1.0.17"), + ForgeDataMod(name="cofh_core", marker="1.6.4.21"), + ForgeDataMod(name="mcjtylib", marker="1.18-6.0.15"), + ForgeDataMod(name="ispawner", marker="1.0"), + ForgeDataMod(name="everycomp", marker="1.18.2-1.5.7"), + ForgeDataMod(name="jeitweaker", marker="3.0.0.8"), + ForgeDataMod(name="terralith", marker="0.0NONE"), + ForgeDataMod(name="mininggadgets", marker="1.11.0"), + ForgeDataMod(name="crafttweaker", marker="9.1.197"), + ForgeDataMod(name="akashictome", marker="1.5-20"), + ForgeDataMod(name="forge", marker="ANY"), + ForgeDataMod(name="colossalchests", marker="1.8.3"), + ForgeDataMod(name="selene", marker="1.18.2-1.17.9"), + ForgeDataMod(name="drippyloadingscreen", marker="1.6.4"), ForgeDataMod( name="craftingtweaks", - version="", + marker="", ), - ForgeDataMod(name="minecraft", version="1.18.2"), - ForgeDataMod(name="terrablender", version="1.18.2-1.1.0.102"), + ForgeDataMod(name="minecraft", marker="1.18.2"), + ForgeDataMod(name="terrablender", marker="1.18.2-1.1.0.102"), ForgeDataMod( name="sophisticatedbackpacksvh", - version="1.18.2-1.0.4.12", - ), - ForgeDataMod(name="mousetweaks", version="ANY"), - ForgeDataMod(name="titanium", version="3.5.6"), - ForgeDataMod(name="jade", version=""), - ForgeDataMod(name="createtweaker", version="2.0.0.17"), - ForgeDataMod(name="easy_villagers", version="1.18.2-1.0.10"), - ForgeDataMod(name="pipez", version="1.18.2-1.1.5"), - ForgeDataMod(name="iceberg", version="ANY"), - ForgeDataMod(name="flywheel", version=""), - ForgeDataMod(name="mantle", version="1.9.27"), - ForgeDataMod(name="ecologics", version="1.7.3"), - ForgeDataMod(name="quark", version="3.2-358"), - ForgeDataMod(name="xaerominimap", version="22.11.1"), - ForgeDataMod(name="pigpen", version="8.0.1"), - ForgeDataMod(name="fastbench", version="6.0.2"), - ForgeDataMod(name="polymorph", version="1.18.2-0.44"), - ForgeDataMod(name="autoreglib", version="1.7-53"), - ForgeDataMod(name="storagedrawers", version="10.2.1"), - ForgeDataMod(name="fluxnetworks", version="7.0.7.8"), - ForgeDataMod(name="neoncraft2", version="2.2"), - ForgeDataMod(name="enercell", version="0.0NONE"), - ForgeDataMod(name="appleskin", version="2.4.0+mc1.18"), + marker="1.18.2-1.0.4.12", + ), + ForgeDataMod(name="mousetweaks", marker="ANY"), + ForgeDataMod(name="titanium", marker="3.5.6"), + ForgeDataMod(name="jade", marker=""), + ForgeDataMod(name="createtweaker", marker="2.0.0.17"), + ForgeDataMod(name="easy_villagers", marker="1.18.2-1.0.10"), + ForgeDataMod(name="pipez", marker="1.18.2-1.1.5"), + ForgeDataMod(name="iceberg", marker="ANY"), + ForgeDataMod(name="flywheel", marker=""), + ForgeDataMod(name="mantle", marker="1.9.27"), + ForgeDataMod(name="ecologics", marker="1.7.3"), + ForgeDataMod(name="quark", marker="3.2-358"), + ForgeDataMod(name="xaerominimap", marker="22.11.1"), + ForgeDataMod(name="pigpen", marker="8.0.1"), + ForgeDataMod(name="fastbench", marker="6.0.2"), + ForgeDataMod(name="polymorph", marker="1.18.2-0.44"), + ForgeDataMod(name="autoreglib", marker="1.7-53"), + ForgeDataMod(name="storagedrawers", marker="10.2.1"), + ForgeDataMod(name="fluxnetworks", marker="7.0.7.8"), + ForgeDataMod(name="neoncraft2", marker="2.2"), + ForgeDataMod(name="enercell", marker="0.0NONE"), + ForgeDataMod(name="appleskin", marker="2.4.0+mc1.18"), ForgeDataMod( name="ferritecore", - version="", + marker="", ), - ForgeDataMod(name="modularrouters", version="9.1.1-93"), - ForgeDataMod(name="refinedstorageaddons", version="0.8.2"), - ForgeDataMod(name="openloader", version="12.0.1"), - ForgeDataMod(name="the_vault", version="1.18.2-2.0.10.869"), + ForgeDataMod(name="modularrouters", marker="9.1.1-93"), + ForgeDataMod(name="refinedstorageaddons", marker="0.8.2"), + ForgeDataMod(name="openloader", marker="12.0.1"), + ForgeDataMod(name="the_vault", marker="1.18.2-2.0.10.869"), ], ), ("truncated", False), ] @pytest.fixture(scope="class") - def build(self): - return ForgeData.build( + def build(self) -> ForgeData: + value = ForgeData.build( RawForgeData( { "channels": [], @@ -656,6 +656,8 @@ def build(self): } ) ) + assert value is not None + return value @BaseStatusResponseTest.construct @@ -687,10 +689,10 @@ class TestForgeDataV1(TestJavaStatusResponse): fml_network_version=1, channels=[], mods=[ - ForgeDataMod(name="minecraft", version="1.12.2"), - ForgeDataMod(name="mcp", version="9.42"), - ForgeDataMod(name="FML", version="8.0.99.99"), - ForgeDataMod(name="forge", version="14.23.5.2859"), + ForgeDataMod(name="minecraft", marker="1.12.2"), + ForgeDataMod(name="mcp", marker="9.42"), + ForgeDataMod(name="FML", marker="8.0.99.99"), + ForgeDataMod(name="forge", marker="14.23.5.2859"), ], truncated=False, ), @@ -730,7 +732,7 @@ class TestForgeDataV2(TestJavaStatusResponse): fml_network_version=2, channels=[], mods=[ - ForgeDataMod(name="forge", version="ANY"), + ForgeDataMod(name="forge", marker="ANY"), ], truncated=False, ), @@ -781,8 +783,8 @@ class TestForgeDataV3(TestJavaStatusResponse): ForgeDataChannel(name="forge:split", version="1.1", required=True), ], mods=[ - ForgeDataMod(name="minecraft", version="1.20.1"), - ForgeDataMod(name="forge", version="ANY"), + ForgeDataMod(name="minecraft", marker="1.20.1"), + ForgeDataMod(name="forge", marker="ANY"), ], truncated=False, ), From d20faf1f6cf2e99008d00c907cfe67f3fc860846 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Wed, 13 Dec 2023 15:29:31 -0600 Subject: [PATCH 57/67] Update mcstatus/forge_data.py Co-authored-by: Perchun Pak --- mcstatus/forge_data.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index e94b1afb..45731cc3 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -35,20 +35,20 @@ class RawForgeDataChannel(TypedDict): required: bool """Is this channel required for client to join?""" - class RawForgeDataMod(TypedDict): - modid: NotRequired[str] - modId: NotRequired[str] - modmarker: NotRequired[str] + class RawForgeDataMod(TypedDict, total=False): + modid: str + modId: str + modmarker: str """Mod version.""" - version: NotRequired[str] - - class RawForgeData(TypedDict): - fmlNetworkVersion: NotRequired[int] - channels: NotRequired[list[RawForgeDataChannel]] - mods: NotRequired[list[RawForgeDataMod]] - modList: NotRequired[list[RawForgeDataMod]] - d: NotRequired[str] - truncated: NotRequired[bool] + version: str + + class RawForgeData(TypedDict, total=False): + fmlNetworkVersion: int + channels: list[RawForgeDataChannel] + mods: list[RawForgeDataMod] + modList: list[RawForgeDataMod] + d: str + truncated: bool else: RawForgeDataChannel = dict From 9297e149a2eed73aa5f3a648353283c7ef305188 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Wed, 13 Dec 2023 15:31:54 -0600 Subject: [PATCH 58/67] Update tests/status_response/test_java.py Co-authored-by: Perchun Pak --- tests/status_response/test_java.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/status_response/test_java.py b/tests/status_response/test_java.py index 4cff00da..9840e87b 100644 --- a/tests/status_response/test_java.py +++ b/tests/status_response/test_java.py @@ -680,7 +680,7 @@ class TestForgeDataV1(TestJavaStatusResponse): EXPECTED_VALUES = [ ("players", JavaStatusPlayers(0, 20, None)), ("version", JavaStatusVersion("1.12.2", 340)), - ("motd", Motd(parsed=["A Minecraft Server", Formatting.RESET], raw={"text": "A Minecraft Server"}, bedrock=False)), + ("motd", Motd.parse("A Minecraft Server", bedrock=False), ("latency", 0), ("raw", RAW), ( From fdf64b0ef7b80da323e68fb1a84d0a1dd22866af Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Wed, 13 Dec 2023 15:37:16 -0600 Subject: [PATCH 59/67] KeyError and remove explicit re-export --- mcstatus/forge_data.py | 3 ++- mcstatus/motd/__init__.py | 14 +++----------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 45731cc3..2055a0f6 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -222,7 +222,8 @@ def build(cls, raw: RawForgeData) -> Self | None: # see https://github.com/MinecraftForge/MinecraftForge/blob/7d0330eb08299935714e34ac651a293e2609aa86/src/main/java/net/minecraftforge/network/ServerStatusPing.java#L27-L73 # noqa: E501 # line too long if "d" not in raw: mod_list = raw.get("mods") or raw.get("modList") - assert mod_list is not None + if mod_list is None: + raise KeyError("Neither `mods` or `modList` keys exist.") return cls( fml_network_version=fml_network_version, channels=[ForgeDataChannel.build(channel) for channel in raw.get("channels", ())], diff --git a/mcstatus/motd/__init__.py b/mcstatus/motd/__init__.py index 2681e1e0..dc6b29e2 100644 --- a/mcstatus/motd/__init__.py +++ b/mcstatus/motd/__init__.py @@ -4,17 +4,9 @@ import typing as t from dataclasses import dataclass -from mcstatus.motd.components import Formatting as Formatting -from mcstatus.motd.components import MinecraftColor as MinecraftColor -from mcstatus.motd.components import ParsedMotdComponent as ParsedMotdComponent -from mcstatus.motd.components import TranslationTag as TranslationTag -from mcstatus.motd.components import WebColor as WebColor -from mcstatus.motd.simplifies import get_unused_elements as get_unused_elements -from mcstatus.motd.simplifies import squash_nearby_strings as squash_nearby_strings -from mcstatus.motd.transformers import AnsiTransformer as AnsiTransformer -from mcstatus.motd.transformers import HtmlTransformer as HtmlTransformer -from mcstatus.motd.transformers import MinecraftTransformer as MinecraftTransformer -from mcstatus.motd.transformers import PlainTransformer as PlainTransformer +from mcstatus.motd.components import Formatting, MinecraftColor, ParsedMotdComponent, TranslationTag, WebColor +from mcstatus.motd.simplifies import get_unused_elements, squash_nearby_strings +from mcstatus.motd.transformers import AnsiTransformer, HtmlTransformer, MinecraftTransformer, PlainTransformer if t.TYPE_CHECKING: from typing_extensions import Self From a9068934d9d9465a2329d2e86ed00217b9016c1e Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Wed, 13 Dec 2023 15:50:11 -0600 Subject: [PATCH 60/67] Rest of MOTD parse changes and autofixes --- mcstatus/forge_data.py | 2 +- mcstatus/querier.py | 2 +- tests/status_response/test_java.py | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 2055a0f6..8262095c 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -25,7 +25,7 @@ if TYPE_CHECKING: - from typing_extensions import NotRequired, Self, TypedDict + from typing_extensions import Self, TypedDict class RawForgeDataChannel(TypedDict): res: str diff --git a/mcstatus/querier.py b/mcstatus/querier.py index 6c31b405..f5da4a5c 100644 --- a/mcstatus/querier.py +++ b/mcstatus/querier.py @@ -92,7 +92,7 @@ async def read_query(self) -> QueryResponse: class QueryResponse: """Documentation for this class is written by hand, without docstrings. - This is because the class is not supposted to be auto-documented. + This is because the class is not supposed to be auto-documented. Please see https://mcstatus.readthedocs.io/en/latest/api/basic/#mcstatus.querier.QueryResponse for the actual documentation. diff --git a/tests/status_response/test_java.py b/tests/status_response/test_java.py index 9840e87b..fa7c00ef 100644 --- a/tests/status_response/test_java.py +++ b/tests/status_response/test_java.py @@ -1,7 +1,7 @@ import pytest from mcstatus.forge_data import ForgeDataChannel, ForgeDataMod, RawForgeData -from mcstatus.motd import Formatting, Motd +from mcstatus.motd import Motd from mcstatus.status_response import ForgeData, JavaStatusPlayer, JavaStatusPlayers, JavaStatusResponse, JavaStatusVersion from tests.status_response import BaseStatusResponseTest @@ -680,7 +680,7 @@ class TestForgeDataV1(TestJavaStatusResponse): EXPECTED_VALUES = [ ("players", JavaStatusPlayers(0, 20, None)), ("version", JavaStatusVersion("1.12.2", 340)), - ("motd", Motd.parse("A Minecraft Server", bedrock=False), + ("motd", Motd.parse("A Minecraft Server", bedrock=False)), ("latency", 0), ("raw", RAW), ( @@ -723,7 +723,7 @@ class TestForgeDataV2(TestJavaStatusResponse): EXPECTED_VALUES = [ ("players", JavaStatusPlayers(0, 20, None)), ("version", JavaStatusVersion("1.13.2", 404)), - ("motd", Motd(parsed=["A Minecraft Server", Formatting.RESET], raw={"text": "A Minecraft Server"}, bedrock=False)), + ("motd", Motd.parse("A Minecraft Server", bedrock=False)), ("latency", 0), ("raw", RAW), ( @@ -769,7 +769,7 @@ class TestForgeDataV3(TestJavaStatusResponse): EXPECTED_VALUES = [ ("players", JavaStatusPlayers(0, 20, None)), ("version", JavaStatusVersion("1.20.1", 763)), - ("motd", Motd(parsed=["A Minecraft Server", Formatting.RESET], raw={"text": "A Minecraft Server"}, bedrock=False)), + ("motd", Motd.parse("A Minecraft Server", bedrock=False)), ("latency", 0), ("raw", RAW), ( From e2358a78e8a0500440742058d472af72c1347152 Mon Sep 17 00:00:00 2001 From: CoolCat467 <52022020+CoolCat467@users.noreply.github.com> Date: Thu, 14 Dec 2023 17:15:06 -0600 Subject: [PATCH 61/67] Update tests/status_response/test_java.py Co-authored-by: Perchun Pak --- tests/status_response/test_java.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/status_response/test_java.py b/tests/status_response/test_java.py index fa7c00ef..4829ea51 100644 --- a/tests/status_response/test_java.py +++ b/tests/status_response/test_java.py @@ -680,7 +680,7 @@ class TestForgeDataV1(TestJavaStatusResponse): EXPECTED_VALUES = [ ("players", JavaStatusPlayers(0, 20, None)), ("version", JavaStatusVersion("1.12.2", 340)), - ("motd", Motd.parse("A Minecraft Server", bedrock=False)), + ("motd", Motd.parse({"text": "A Minecraft Server"}, bedrock=False)), ("latency", 0), ("raw", RAW), ( From 809ab4a50ad586137c39095f667ddb482d07d48b Mon Sep 17 00:00:00 2001 From: PerchunPak Date: Mon, 5 Feb 2024 20:21:27 +0100 Subject: [PATCH 62/67] Apply suggestions from code review --- mcstatus/forge_data.py | 5 +++-- mcstatus/motd/__init__.py | 4 ++-- mcstatus/status_response.py | 5 ++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mcstatus/forge_data.py b/mcstatus/forge_data.py index 8262095c..99412d78 100644 --- a/mcstatus/forge_data.py +++ b/mcstatus/forge_data.py @@ -110,12 +110,12 @@ def build(cls, raw: RawForgeDataMod) -> Self: # In FML v1, modmarker was version instead. mod_version = raw.get("modmarker") or raw.get("version") if mod_version is None: - raise ValueError("Mod version in Forge mod data must be provided.") + raise KeyError("Mod version in Forge mod data must be provided.") # In FML v2, modid was modId instead. At least one of the two should exist. mod_id = raw.get("modid") or raw.get("modId") if mod_id is None: - raise ValueError(f"Mod ID in Forge mod data must be provided. Mod version: {mod_version!r}.") + raise KeyError(f"Mod ID in Forge mod data must be provided. Mod version: {mod_version!r}.") return cls(name=mod_id, marker=mod_version) @@ -224,6 +224,7 @@ def build(cls, raw: RawForgeData) -> Self | None: mod_list = raw.get("mods") or raw.get("modList") if mod_list is None: raise KeyError("Neither `mods` or `modList` keys exist.") + return cls( fml_network_version=fml_network_version, channels=[ForgeDataChannel.build(channel) for channel in raw.get("channels", ())], diff --git a/mcstatus/motd/__init__.py b/mcstatus/motd/__init__.py index 1727fb27..6ea21cf6 100644 --- a/mcstatus/motd/__init__.py +++ b/mcstatus/motd/__init__.py @@ -49,7 +49,7 @@ def parse( """ original_raw = raw.copy() if hasattr(raw, "copy") else raw # type: ignore # Cannot access "copy" for type "str" if isinstance(raw, list): - raw: RawJavaResponseMotdWhenDict = {"extra": raw} # type: ignore[no-redef] + raw: RawJavaResponseMotdWhenDict = {"extra": raw} if isinstance(raw, str): parsed = cls._parse_as_str(raw, bedrock=bedrock) @@ -187,7 +187,7 @@ def simplify(self) -> Self: parsed = [el for index, el in enumerate(parsed) if index not in unused_elements] parsed = squash_nearby_strings(parsed) - return self.__class__(parsed, self.raw, bedrock=self.bedrock) + return __class__(parsed, self.raw, bedrock=self.bedrock) def to_plain(self) -> str: """Get plain text from a MOTD, without any colors/formatting. diff --git a/mcstatus/status_response.py b/mcstatus/status_response.py index 4b919cc8..0dc1d94a 100644 --- a/mcstatus/status_response.py +++ b/mcstatus/status_response.py @@ -4,8 +4,7 @@ from dataclasses import dataclass from typing import Any, TYPE_CHECKING -from mcstatus.forge_data import ForgeData as ForgeData -from mcstatus.forge_data import RawForgeData +from mcstatus.forge_data import ForgeData, RawForgeData from mcstatus.motd import Motd if TYPE_CHECKING: @@ -92,7 +91,7 @@ def description(self) -> str: @classmethod @abstractmethod - def build(cls, *args: object, **kwargs: object) -> Self: + def build(cls, *args, **kwargs) -> Self: """Build BaseStatusResponse and check is it valid. :param args: Arguments in specific realisation. From 94c00205e9228cae9efeb1efffda366478e99f4e Mon Sep 17 00:00:00 2001 From: PerchunPak Date: Mon, 5 Feb 2024 20:36:20 +0100 Subject: [PATCH 63/67] Subclass tests from base class, instead of Java one --- tests/status_response/test_java.py | 173 +++++++++++------------------ 1 file changed, 64 insertions(+), 109 deletions(-) diff --git a/tests/status_response/test_java.py b/tests/status_response/test_java.py index 4829ea51..5151b0cd 100644 --- a/tests/status_response/test_java.py +++ b/tests/status_response/test_java.py @@ -661,137 +661,92 @@ def build(self) -> ForgeData: @BaseStatusResponseTest.construct -class TestForgeDataV1(TestJavaStatusResponse): +class TestForgeDataV1(BaseStatusResponseTest): RAW = { - "description": {"text": "A Minecraft Server"}, - "players": {"max": 20, "online": 0}, - "version": {"name": "1.12.2", "protocol": 340}, - "modinfo": { - "type": "FML", - "modList": [ - {"modid": "minecraft", "version": "1.12.2"}, - {"modid": "mcp", "version": "9.42"}, - {"modid": "FML", "version": "8.0.99.99"}, - {"modid": "forge", "version": "14.23.5.2859"}, - ], - }, + "type": "FML", + "modList": [ + {"modid": "minecraft", "version": "1.12.2"}, + {"modid": "mcp", "version": "9.42"}, + {"modid": "FML", "version": "8.0.99.99"}, + {"modid": "forge", "version": "14.23.5.2859"}, + ], } EXPECTED_VALUES = [ - ("players", JavaStatusPlayers(0, 20, None)), - ("version", JavaStatusVersion("1.12.2", 340)), - ("motd", Motd.parse({"text": "A Minecraft Server"}, bedrock=False)), - ("latency", 0), - ("raw", RAW), + ("fml_network_version", 1), + ("channels", []), ( - "forge_data", - ForgeData( - fml_network_version=1, - channels=[], - mods=[ - ForgeDataMod(name="minecraft", marker="1.12.2"), - ForgeDataMod(name="mcp", marker="9.42"), - ForgeDataMod(name="FML", marker="8.0.99.99"), - ForgeDataMod(name="forge", marker="14.23.5.2859"), - ], - truncated=False, - ), + "mods", + [ + ForgeDataMod(name="minecraft", marker="1.12.2"), + ForgeDataMod(name="mcp", marker="9.42"), + ForgeDataMod(name="FML", marker="8.0.99.99"), + ForgeDataMod(name="forge", marker="14.23.5.2859"), + ], ), + ("truncated", False), ] - OPTIONAL_FIELDS = [], { - "players": {"max": 20, "online": 0}, - "version": {"name": "1.12.2", "protocol": 340}, - "description": "A Minecraft Server", - } + + def build(self) -> ForgeData: + return ForgeData.build(self.RAW) @BaseStatusResponseTest.construct -class TestForgeDataV2(TestJavaStatusResponse): +class TestForgeDataV2(BaseStatusResponseTest): RAW = { - "description": {"text": "A Minecraft Server"}, - "players": {"max": 20, "online": 0}, - "version": {"name": "1.13.2", "protocol": 404}, - "forgeData": { - "fmlNetworkVersion": 2, - "channels": [], - "mods": [ - {"modId": "forge", "modmarker": "ANY"}, - ], - }, + "fmlNetworkVersion": 2, + "channels": [], + "mods": [ + {"modId": "forge", "modmarker": "ANY"}, + ], } EXPECTED_VALUES = [ - ("players", JavaStatusPlayers(0, 20, None)), - ("version", JavaStatusVersion("1.13.2", 404)), - ("motd", Motd.parse("A Minecraft Server", bedrock=False)), - ("latency", 0), - ("raw", RAW), - ( - "forge_data", - ForgeData( - fml_network_version=2, - channels=[], - mods=[ - ForgeDataMod(name="forge", marker="ANY"), - ], - truncated=False, - ), - ), + ("fml_network_version", 2), + ("channels", []), + ("mods", [ForgeDataMod(name="forge", marker="ANY")]), + ("truncated", False), ] - OPTIONAL_FIELDS = [], { - "players": {"max": 20, "online": 0}, - "version": {"name": "1.13.2", "protocol": 404}, - "description": "A Minecraft Server", - } + + def build(self) -> ForgeData: + return ForgeData.build(self.RAW) @BaseStatusResponseTest.construct -class TestForgeDataV3(TestJavaStatusResponse): +class TestForgeDataV3(BaseStatusResponseTest): RAW = { - "enforcesSecureChat": True, - "forgeData": { - "channels": [], - "mods": [], - "truncated": False, - "fmlNetworkVersion": 3, - "d": bytes.fromhex( - "5e0000e0a084e390a4e78d8be39996e2b98ce1a698ccbae2b8b1e681a4e492b8e2a191e29ba7e6b2aee5a" - "999e3a8b9e789a5e0b088e384b5e0a69ae28280e6b2aee5a999e3a8b9e789a5e0b088e384b5e0a69ae581" - "80e6b380e5b29be38ab3e48483e38a9ce580b1e2ad8be79ca6e6b9abe1b29be392bae69daee68886e482b" - "8e2a081dcb0e2b68ee5b49ae1a281e384ae02" - ).decode("utf8"), - }, - "description": {"text": "A Minecraft Server"}, - "players": {"max": 20, "online": 0}, - "version": {"name": "1.20.1", "protocol": 763}, + "channels": [], + "mods": [], + "truncated": False, + "fmlNetworkVersion": 3, + "d": bytes.fromhex( + "5e0000e0a084e390a4e78d8be39996e2b98ce1a698ccbae2b8b1e681a4e492b8e2a191e29ba7e6b2aee5a" + "999e3a8b9e789a5e0b088e384b5e0a69ae28280e6b2aee5a999e3a8b9e789a5e0b088e384b5e0a69ae581" + "80e6b380e5b29be38ab3e48483e38a9ce580b1e2ad8be79ca6e6b9abe1b29be392bae69daee68886e482b" + "8e2a081dcb0e2b68ee5b49ae1a281e384ae02" + ).decode("utf8"), } EXPECTED_VALUES = [ - ("players", JavaStatusPlayers(0, 20, None)), - ("version", JavaStatusVersion("1.20.1", 763)), - ("motd", Motd.parse("A Minecraft Server", bedrock=False)), - ("latency", 0), - ("raw", RAW), + ("fml_network_version", 3), ( - "forge_data", - ForgeData( - fml_network_version=3, - channels=[ - ForgeDataChannel(name="minecraft:unregister", version="FML3", required=True), - ForgeDataChannel(name="minecraft:register", version="FML3", required=True), - ForgeDataChannel(name="forge:tier_sorting", version="1.0", required=False), - ForgeDataChannel(name="forge:split", version="1.1", required=True), - ], - mods=[ - ForgeDataMod(name="minecraft", marker="1.20.1"), - ForgeDataMod(name="forge", marker="ANY"), - ], - truncated=False, - ), + "channels", + [ + ForgeDataChannel(name="minecraft:unregister", version="FML3", required=True), + ForgeDataChannel(name="minecraft:register", version="FML3", required=True), + ForgeDataChannel(name="forge:tier_sorting", version="1.0", required=False), + ForgeDataChannel(name="forge:split", version="1.1", required=True), + ], + ), + ( + "mods", + [ + ForgeDataMod(name="minecraft", marker="1.20.1"), + ForgeDataMod(name="forge", marker="ANY"), + ], ), + ("truncated", False), ] - OPTIONAL_FIELDS = [], { - "players": {"max": 20, "online": 0}, - "version": {"name": "1.20.1", "protocol": 763}, - "description": "A Minecraft Server", - } + + def build(self) -> ForgeData: + return ForgeData.build(self.RAW) From 629064463b9ec0c272300813a523e51959027ff2 Mon Sep 17 00:00:00 2001 From: PerchunPak Date: Mon, 5 Feb 2024 20:37:20 +0100 Subject: [PATCH 64/67] Move tests to its own file --- tests/status_response/test_forge_data.py | 650 +++++++++++++++++++++++ tests/status_response/test_java.py | 649 +--------------------- 2 files changed, 651 insertions(+), 648 deletions(-) create mode 100644 tests/status_response/test_forge_data.py diff --git a/tests/status_response/test_forge_data.py b/tests/status_response/test_forge_data.py new file mode 100644 index 00000000..d29dc0f4 --- /dev/null +++ b/tests/status_response/test_forge_data.py @@ -0,0 +1,650 @@ +import pytest + +from mcstatus.forge_data import ForgeDataChannel, ForgeDataMod, RawForgeData, ForgeData +from tests.status_response import BaseStatusResponseTest + + +@BaseStatusResponseTest.construct +class TestForgeDataV1(BaseStatusResponseTest): + RAW = { + "type": "FML", + "modList": [ + {"modid": "minecraft", "version": "1.12.2"}, + {"modid": "mcp", "version": "9.42"}, + {"modid": "FML", "version": "8.0.99.99"}, + {"modid": "forge", "version": "14.23.5.2859"}, + ], + } + + EXPECTED_VALUES = [ + ("fml_network_version", 1), + ("channels", []), + ( + "mods", + [ + ForgeDataMod(name="minecraft", marker="1.12.2"), + ForgeDataMod(name="mcp", marker="9.42"), + ForgeDataMod(name="FML", marker="8.0.99.99"), + ForgeDataMod(name="forge", marker="14.23.5.2859"), + ], + ), + ("truncated", False), + ] + + def build(self) -> ForgeData: + return ForgeData.build(self.RAW) + + +@BaseStatusResponseTest.construct +class TestForgeDataV2(BaseStatusResponseTest): + RAW = { + "fmlNetworkVersion": 2, + "channels": [], + "mods": [ + {"modId": "forge", "modmarker": "ANY"}, + ], + } + + EXPECTED_VALUES = [ + ("fml_network_version", 2), + ("channels", []), + ("mods", [ForgeDataMod(name="forge", marker="ANY")]), + ("truncated", False), + ] + + def build(self) -> ForgeData: + return ForgeData.build(self.RAW) + + +@BaseStatusResponseTest.construct +class TestForgeDataV3(BaseStatusResponseTest): + RAW = { + "channels": [], + "mods": [], + "truncated": False, + "fmlNetworkVersion": 3, + "d": bytes.fromhex( + "5e0000e0a084e390a4e78d8be39996e2b98ce1a698ccbae2b8b1e681a4e492b8e2a191e29ba7e6b2aee5a" + "999e3a8b9e789a5e0b088e384b5e0a69ae28280e6b2aee5a999e3a8b9e789a5e0b088e384b5e0a69ae581" + "80e6b380e5b29be38ab3e48483e38a9ce580b1e2ad8be79ca6e6b9abe1b29be392bae69daee68886e482b" + "8e2a081dcb0e2b68ee5b49ae1a281e384ae02" + ).decode("utf8"), + } + + EXPECTED_VALUES = [ + ("fml_network_version", 3), + ( + "channels", + [ + ForgeDataChannel(name="minecraft:unregister", version="FML3", required=True), + ForgeDataChannel(name="minecraft:register", version="FML3", required=True), + ForgeDataChannel(name="forge:tier_sorting", version="1.0", required=False), + ForgeDataChannel(name="forge:split", version="1.1", required=True), + ], + ), + ( + "mods", + [ + ForgeDataMod(name="minecraft", marker="1.20.1"), + ForgeDataMod(name="forge", marker="ANY"), + ], + ), + ("truncated", False), + ] + + def build(self) -> ForgeData: + return ForgeData.build(self.RAW) + + +@BaseStatusResponseTest.construct +class TestForgeData(BaseStatusResponseTest): + EXPECTED_VALUES = [ + ("fml_network_version", 3), + ( + "channels", + [ + ForgeDataChannel( + name="cyclopscore:channel_main", + version="1.0.0", + required=True, + ), + ForgeDataChannel( + name="supermartijn642configlib:sync_configs", + version="1", + required=False, + ), + ForgeDataChannel( + name="alexsmobs:main_channel", + version="1", + required=False, + ), + ForgeDataChannel( + name="sophisticatedcore:channel", + version="1", + required=False, + ), + ForgeDataChannel( + name="rftoolsbase:rftoolsbase", + version="1.0", + required=True, + ), + ForgeDataChannel( + name="irongenerators:irongenerators", + version="1", + required=False, + ), + ForgeDataChannel( + name="xaeroworldmap:main", + version="1.0", + required=True, + ), + ForgeDataChannel( + name="cookingforblockheads:network", + version="1.0", + required=False, + ), + ForgeDataChannel(name="xnet:xnet", version="1.0", required=True), + ForgeDataChannel( + name="placebo:placebo", + version="1.0.0", + required=True, + ), + ForgeDataChannel( + name="citadel:main_channel", + version="1", + required=False, + ), + ForgeDataChannel( + name="sophisticatedbackpacks:channel", + version="1", + required=False, + ), + ForgeDataChannel( + name="buildinggadgets:main", + version="4", + required=False, + ), + ForgeDataChannel( + name="mekanismgenerators:mekanismgenerators", + version="10.2.5", + required=False, + ), + ForgeDataChannel( + name="waila:networking", + version="1.0.0", + required=True, + ), + ForgeDataChannel( + name="shetiphiancore:main_channel", + version="1.0.0", + required=False, + ), + ForgeDataChannel( + name="dummmmmmy:dummychannel", + version="1", + required=False, + ), + ForgeDataChannel( + name="supplementaries:network", + version="1", + required=False, + ), + ForgeDataChannel( + name="refinedstorage:main_channel", + version="1", + required=False, + ), + ForgeDataChannel(name="corpse:default", version="1.0.0", required=True), + ForgeDataChannel( + name="ping:ping_channel", + version="PING1", + required=True, + ), + ForgeDataChannel( + name="ironfurnaces:ironfurnaces_network", + version="1.0", + required=True, + ), + ForgeDataChannel(name="botania:main", version="0", required=False), + ForgeDataChannel(name="curios:main", version="1", required=False), + ForgeDataChannel(name="patchouli:main", version="1", required=False), + ForgeDataChannel(name="camera:default", version="1.0.0", required=True), + ForgeDataChannel( + name="libnonymous:channel", + version="1.0", + required=True, + ), + ForgeDataChannel( + name="elevatorid:main_channel", + version="1", + required=False, + ), + ForgeDataChannel(name="worldedit:cui", version="1", required=True), + ForgeDataChannel(name="worldedit:internal", version="1", required=True), + ForgeDataChannel(name="cfm:network", version="1", required=False), + ForgeDataChannel( + name="architectury:network", + version="1", + required=True, + ), + ForgeDataChannel(name="trashcans:main", version="1", required=False), + ForgeDataChannel(name="jei:channel", version="1.0.0", required=True), + ForgeDataChannel(name="ae2:main", version="1", required=True), + ForgeDataChannel( + name="mekanism:mekanism", + version="10.2.5", + required=False, + ), + ForgeDataChannel(name="bdlib:multiblock", version="2", required=False), + ForgeDataChannel(name="bdlib:misc", version="1", required=False), + ForgeDataChannel(name="create:main", version="1", required=False), + ForgeDataChannel( + name="waystones:network", + version="1.0", + required=False, + ), + ForgeDataChannel(name="comforts:main", version="1", required=False), + ForgeDataChannel( + name="naturescompass:naturescompass", + version="1.0", + required=True, + ), + ForgeDataChannel( + name="storagenetwork:main_channel", + version="1", + required=False, + ), + ForgeDataChannel(name="cofh_core:general", version="1", required=True), + ForgeDataChannel( + name="mcjtylib:mcjtylib", + version="1.0", + required=True, + ), + ForgeDataChannel( + name="mininggadgets:main_network_channel", + version="2", + required=False, + ), + ForgeDataChannel( + name="crafttweaker:main", + version="1.0.0", + required=False, + ), + ForgeDataChannel(name="akashictome:main", version="1", required=False), + ForgeDataChannel( + name="forge:tier_sorting", + version="1.0", + required=False, + ), + ForgeDataChannel(name="forge:split", version="1.1", required=True), + ForgeDataChannel( + name="colossalchests:channel_main", + version="1.0.0", + required=True, + ), + ForgeDataChannel(name="selene:network", version="1", required=False), + ForgeDataChannel( + name="craftingtweaks:network", + version="1.0", + required=False, + ), + ForgeDataChannel( + name="minecraft:unregister", + version="FML3", + required=True, + ), + ForgeDataChannel( + name="minecraft:register", + version="FML3", + required=True, + ), + ForgeDataChannel(name="titanium:network", version="1.0", required=True), + ForgeDataChannel( + name="easy_villagers:default", + version="1.0.0", + required=True, + ), + ForgeDataChannel(name="pipez:default", version="1.0.0", required=True), + ForgeDataChannel(name="mantle:network", version="1", required=False), + ForgeDataChannel(name="quark:main", version="1", required=False), + ForgeDataChannel( + name="xaerominimap:main", + version="1.0", + required=True, + ), + ForgeDataChannel( + name="fastbench:channel", + version="4.6.0", + required=True, + ), + ForgeDataChannel(name="polymorph:main", version="1", required=False), + ForgeDataChannel( + name="storagedrawers:main_channel", + version="1", + required=False, + ), + ForgeDataChannel( + name="enercell:network", + version="0.0.0", + required=False, + ), + ForgeDataChannel(name="appleskin:sync", version="1", required=True), + ForgeDataChannel( + name="modularrouters:main_channel", + version="2", + required=False, + ), + ForgeDataChannel( + name="the_vault:network", + version="0.26.0", + required=False, + ), + ForgeDataChannel( + name="modernui:fluxnetworks", + version="707", + required=False, + ), + ], + ), + ( + "mods", + [ + ForgeDataMod(name="rsrequestify", marker="2.2.0"), + ForgeDataMod(name="cyclopscore", marker="1.15.1"), + ForgeDataMod(name="auudio", marker="1.0.3"), + ForgeDataMod(name="auxiliaryblocks", marker="1.18.2-0.0.14"), + ForgeDataMod(name="supermartijn642configlib", marker="1.1.6"), + ForgeDataMod(name="alexsmobs", marker="1.18.6"), + ForgeDataMod(name="architects_palette", marker="1.1.2"), + ForgeDataMod(name="cagerium", marker="1.18.2-1.1.0"), + ForgeDataMod(name="mcwwindows", marker="2.0.3"), + ForgeDataMod( + name="sophisticatedcore", + marker="1.18.2-0.5.32.179", + ), + ForgeDataMod(name="thermal", marker="1.6.3.28"), + ForgeDataMod(name="rftoolsbase", marker="1.18-3.0.9"), + ForgeDataMod(name="initialinventory", marker="6.0.8"), + ForgeDataMod(name="irongenerators", marker="2.0.1"), + ForgeDataMod(name="xaeroworldmap", marker="1.25.1"), + ForgeDataMod(name="cookingforblockheads", marker="12.0.2"), + ForgeDataMod( + name="controlling", + marker="", + ), + ForgeDataMod(name="xnet", marker="1.18-4.0.5"), + ForgeDataMod(name="placebo", marker="6.4.1"), + ForgeDataMod(name="citadel", marker="1.11.3"), + ForgeDataMod(name="powah", marker="3.0.1-beta"), + ForgeDataMod(name="bookshelf", marker="13.2.50"), + ForgeDataMod(name="lootbeams", marker="1.18.1"), + ForgeDataMod( + name="sophisticatedbackpacks", + marker="1.18.2-3.18.35.752", + ), + ForgeDataMod(name="twigs", marker="1.1.4-patch1+1.18.2"), + ForgeDataMod( + name="buildinggadgets", + marker="3.13.0-build.5+mc1.18.2}", + ), + ForgeDataMod(name="darkutils", marker="10.0.5"), + ForgeDataMod(name="mcwdoors", marker="1.0.6"), + ForgeDataMod(name="waddles", marker="1.18.2-0.8.19"), + ForgeDataMod(name="mekanismgenerators", marker="10.2.5"), + ForgeDataMod(name="balm", marker="3.2.0+0"), + ForgeDataMod(name="waila", marker=""), + ForgeDataMod(name="jeresources", marker="0.14.1.171"), + ForgeDataMod( + name="cloth_config", + marker="", + ), + ForgeDataMod(name="shetiphiancore", marker="3.10.10"), + ForgeDataMod(name="dummmmmmy", marker="1.18-1.5.2"), + ForgeDataMod(name="supplementaries", marker="1.18.2-1.5.13"), + ForgeDataMod(name="refinedstorage", marker="1.10.2"), + ForgeDataMod(name="konkrete", marker="1.3.3"), + ForgeDataMod(name="easy_piglins", marker="1.18.2-1.0.0"), + ForgeDataMod(name="corpse", marker="1.18.2-1.0.2"), + ForgeDataMod(name="packmenu", marker=""), + ForgeDataMod(name="mcwbridges", marker="2.0.3"), + ForgeDataMod(name="torchmaster", marker="18.1.0"), + ForgeDataMod(name="compressium", marker="1.4.2-build.9+mc1.18.2"), + ForgeDataMod(name="ping", marker="1.18-1.8.0"), + ForgeDataMod(name="ironfurnaces", marker="3.3.1"), + ForgeDataMod(name="mcwtrpdoors", marker="1.0.6"), + ForgeDataMod(name="mcwfences", marker="1.0.5"), + ForgeDataMod(name="supermartijn642corelib", marker="1.0.19"), + ForgeDataMod(name="simplylight", marker="1.18.2-1.4.2-build.31"), + ForgeDataMod(name="botania", marker="1.18.2-434"), + ForgeDataMod(name="highlighter", marker="ANY"), + ForgeDataMod(name="spark", marker=""), + ForgeDataMod(name="curios", marker="1.18.2-5.0.7.1"), + ForgeDataMod(name="patchouli", marker="1.18.2-71.1"), + ForgeDataMod(name="camera", marker="1.18.2-1.0.4"), + ForgeDataMod(name="blockcarpentry", marker="1.18-0.3.0"), + ForgeDataMod(name="thermal_foundation", marker="1.6.3.28"), + ForgeDataMod(name="thermal_expansion", marker="1.6.3.13"), + ForgeDataMod(name="libnonymous", marker="2.1.0"), + ForgeDataMod(name="elevatorid", marker="1.18.2-1.8.4"), + ForgeDataMod(name="runelic", marker="11.0.1"), + ForgeDataMod( + name="worldedit", + marker="", + ), + ForgeDataMod(name="cfm", marker="7.0.0-pre29"), + ForgeDataMod(name="architectury", marker="4.9.84"), + ForgeDataMod(name="weirdinggadget", marker="2.2.11"), + ForgeDataMod(name="mcwfurnitures", marker="3.0.0"), + ForgeDataMod(name="trashcans", marker="1.0.15"), + ForgeDataMod(name="mcwlights", marker="1.0.3"), + ForgeDataMod(name="cucumber", marker="5.1.2"), + ForgeDataMod(name="snad", marker="1.18.2-1.22.04.15a"), + ForgeDataMod(name="jei", marker="9.7.0.209"), + ForgeDataMod(name="ae2", marker="11.1.4"), + ForgeDataMod(name="mekanism", marker="10.2.5"), + ForgeDataMod(name="bdlib", marker="1.19.3.7"), + ForgeDataMod(name="create", marker="0.5.0.d"), + ForgeDataMod(name="waystones", marker="10.1.0"), + ForgeDataMod(name="clumps", marker="8.0.0+10"), + ForgeDataMod(name="shutupexperimentalsettings", marker="1.0.5"), + ForgeDataMod(name="comforts", marker="1.18.2-5.0.0.4"), + ForgeDataMod(name="naturescompass", marker="1.18.2-1.9.7-forge"), + ForgeDataMod(name="storagenetwork", marker="1.18.2-1.6.1"), + ForgeDataMod(name="framedcompactdrawers", marker="1.18-4.1.0"), + ForgeDataMod(name="decorative_blocks", marker="2.1.0"), + ForgeDataMod(name="botanypots", marker="8.0.12"), + ForgeDataMod(name="ftbbackups2", marker="1.0.17"), + ForgeDataMod(name="cofh_core", marker="1.6.4.21"), + ForgeDataMod(name="mcjtylib", marker="1.18-6.0.15"), + ForgeDataMod(name="ispawner", marker="1.0"), + ForgeDataMod(name="everycomp", marker="1.18.2-1.5.7"), + ForgeDataMod(name="jeitweaker", marker="3.0.0.8"), + ForgeDataMod(name="terralith", marker="0.0NONE"), + ForgeDataMod(name="mininggadgets", marker="1.11.0"), + ForgeDataMod(name="crafttweaker", marker="9.1.197"), + ForgeDataMod(name="akashictome", marker="1.5-20"), + ForgeDataMod(name="forge", marker="ANY"), + ForgeDataMod(name="colossalchests", marker="1.8.3"), + ForgeDataMod(name="selene", marker="1.18.2-1.17.9"), + ForgeDataMod(name="drippyloadingscreen", marker="1.6.4"), + ForgeDataMod( + name="craftingtweaks", + marker="", + ), + ForgeDataMod(name="minecraft", marker="1.18.2"), + ForgeDataMod(name="terrablender", marker="1.18.2-1.1.0.102"), + ForgeDataMod( + name="sophisticatedbackpacksvh", + marker="1.18.2-1.0.4.12", + ), + ForgeDataMod(name="mousetweaks", marker="ANY"), + ForgeDataMod(name="titanium", marker="3.5.6"), + ForgeDataMod(name="jade", marker=""), + ForgeDataMod(name="createtweaker", marker="2.0.0.17"), + ForgeDataMod(name="easy_villagers", marker="1.18.2-1.0.10"), + ForgeDataMod(name="pipez", marker="1.18.2-1.1.5"), + ForgeDataMod(name="iceberg", marker="ANY"), + ForgeDataMod(name="flywheel", marker=""), + ForgeDataMod(name="mantle", marker="1.9.27"), + ForgeDataMod(name="ecologics", marker="1.7.3"), + ForgeDataMod(name="quark", marker="3.2-358"), + ForgeDataMod(name="xaerominimap", marker="22.11.1"), + ForgeDataMod(name="pigpen", marker="8.0.1"), + ForgeDataMod(name="fastbench", marker="6.0.2"), + ForgeDataMod(name="polymorph", marker="1.18.2-0.44"), + ForgeDataMod(name="autoreglib", marker="1.7-53"), + ForgeDataMod(name="storagedrawers", marker="10.2.1"), + ForgeDataMod(name="fluxnetworks", marker="7.0.7.8"), + ForgeDataMod(name="neoncraft2", marker="2.2"), + ForgeDataMod(name="enercell", marker="0.0NONE"), + ForgeDataMod(name="appleskin", marker="2.4.0+mc1.18"), + ForgeDataMod( + name="ferritecore", + marker="", + ), + ForgeDataMod(name="modularrouters", marker="9.1.1-93"), + ForgeDataMod(name="refinedstorageaddons", marker="0.8.2"), + ForgeDataMod(name="openloader", marker="12.0.1"), + ForgeDataMod(name="the_vault", marker="1.18.2-2.0.10.869"), + ], + ), + ("truncated", False), + ] + + @pytest.fixture(scope="class") + def build(self) -> ForgeData: + value = ForgeData.build( + RawForgeData( + { + "channels": [], + "d": ( + bytes.fromhex( + "e0ba8b0000c484e4a0b0e18e9be19997e2baaee1b399e392bae7a5a6e6908ae4a2b8c5b1e380a3e2b1a1e1a39ee39eb6e" + "78db0e5bb86e19789e0a0b3e18ba3e49aa6e0b18be38686e685a8e5b39ce38695e6abbbe19896e2b78de0b181e1a097e3" + "80ae02d098e2aeabe19987e2b7ade0b181e1a097e38caee1b880e59684e4af83e19b86e4b0ade1b99ce398b1e68dafe69" + "b96e490b5e0a5b1e68e83e29985e0b08be1a097e384aed1a8e4b1a0ceabe29997e2b6aee1b298e392bae6b9aae6a1ace0" + "b388e78dbbe199a6e0b3ade1a99bcab1e2b8b1e5b1a2e38398e4ae98e39ba7e6aface1af98e38cb7e69da9cba6c384e4a" + "090e49890e0b2ade5b39ee39eb6e78da2e6888ce492b8e78781e48da2e2b6a1e1a998e2beb7e6a1a3e5b382e196b9e0ad" + "a3cc90e48080e1a184e386b9e6a5a8e4aba8e5868de7ae9be19c85e2b68ce1b499e38abae38485e6899ce4a2b8e48081e" + "198b0e2b3ace5b299e3aab4e0b1ade5b1a2e68384e185b1e18b93e29786e0ae8c18e6b48ae6bb86e2979de28db3e79bb6" + "e2b9aee0b281e1a097e38caee28884e3b78ce48e83e39a96e2ba8ee5a39ae3a8b0e691a5e5bb86e19789e0a28be18ba3e" + "49c86e4b28be1a096e394aee6999ce3a388e3a689e78e93e0b1a0e1a19ae39cb7e6b1a5e6888200e280b8e59a87e2b98c" + "e1a19bd0b6e2b8b1e5b1ace3a38ce48691e380a3e4b981e5b499e39eb7e78dace48b84e1978de0a193e18ba3e29c86e0b" + "38be1a097e3a4aee69096e58699e7adbbe39b86e2b18ee5b398c6b2e2b8b1c9a0e48080e78d88e49a96e2b4aee5ac98e3" + "9cb4e695b6e6a39ce4a6bde2af8be68da0e49885e0b88bdc81e789a9e5b39ee1969de2adb3e19ca6e6ba8ce5b29bcab9e" + "2b8b2e5b1a0e3a384e18d88e69bb7e2b3ade5ae99e3a4b2e791a1e6939ed78dc688e580a0e2bc81e1a598e39eb9e6bdb7" + "e5a3a4e39691cc8be181a7e49786e0b58ce1a297e6b484e58b82e0b6b9e78688e18c8240e5a385e39eb7e6a5abe4bb9ce" + "3b699e18e93e79b86e6b1ade5a89ae382b2e78da4e6888ce3a388e78681e78ca2e2b780e5b499e39ebbe6adb2e68886e4" + "82b8e0a081e382b0e4b7ace1b49be39eb9e6b1ace5b392e0a69de480a0e59ba7e4ba8ce0b182e1a297e2b4b8e5b1a8e3a" + "380e286a9e69e80e0b2ade4839de19c98c4b0e0b884e38780e1ac8be29996e2b7ace0b681e1a897e384aee6808ed6b1e2" + "ac9be798a6e282ade0ae8ce19c98c4b0e0b884e2968ce0aea3e59986e4b68ce0b181e1a297e2b8b1e1a1a6d6b4e78d8be" + "397b6e2b48ce1ae98e38ab7c5ac62e19080e7ae80e19db6e4b48ce0b382e1a097e384aee4919ae58695cc8be28290e6b7" + "ace5ab9be390b9e6b1a5e0bb8ce4b384e185b1e58ba3d886c980e39eb6e791afe4ab84e39685e38e9be68c90d8a5e4ae8" + "ec498e78c96e6839ee296a1e28e9be39a97e0b0ace1a59de384b2e68da1e68396e0b685e1ad9be184a7e29786e0b88ce1" + "a497e38cade6899ce3a3a0e2a699e78ba3e49aa6e4878ce390b1e6b9a1e4ab9cd6b1c688e58080e6ba80e5a99de3a6b3e" + "38493e6899ce582b8c5a9e49897e0b1aee4b19ae1a295e384aee5b1b0e0a388e181b8e19d96e0b68de1a999e38eb7e685" + "a7e4bb88e58695e48e9be68cb1e698a5e0ae8ce19a98e795a2e5a392e3a691e5a6a9e39b92e498ace0b18be19c9ce7b4b" + "2e5a888e29685e0adb3cd80e28080e5a482e3a4b0e795abe58ba8e4b6b1e0a0b3e68c83e49885e0b58bd080e68dade4a3" + "aee3b6bde1ae93e18197d786e0ae8c1be79c87e4a382e38691e1acabe18397e29786e0b88ce1a497e380ade7819ce492b" + "8e18789e584a0e6b2ade1a19ae392b7e6b5b3e4ab8ee196b9e0ae93e79d86e6b98de4869ce1a098e388aee6a99ce39188" + "e5acabe69896e6b4ade5ad9ce38ab3e695aee48ba4e3b791e1ae93e181a7e49886e0b28be1aa9700e49088e38685e3ada" + "be68cb0e49985e4b08be1a095d483e48baee386a5e58c8be59ba0e6ba8ce1af9de396b9e6b9a9e0ab8ee3a384e78681e1" + "8c82e68080e5aa82e3a4b2e78da5e6ab9ee0b789e1acabc2a7e29786e0b48ce1a297e384aee689aee38084e68c98e49bb" + "6e6b48ee5a397e39cb7e6a5a6d38ee4b0b8e2ad83e19d86e0b88de5a99ae39cb0e6bda3e4aba4e4b09de0a5b1e68c83d8" + "a5e48c8ce382b6e6b9a9e49abed6a1e78db3e49996e282ade0ae8ce19c9830e18884e59690e6adabe59b96e2b6ade1b99" + "be1a285e384aee5a9b0e3a384e786a9e48ca2e2b281e5ad9de3b2b6e6a1a3e5b382e196b9e0ada3cc90e68180e5b383e3" + "a0bae6b1b0e5ab8ae3a695e0aea3e19ca6e6b2ade48d9ce19c98e3a0b1e6919ce492b4e2a5b1e18ba3e699a6e5ae81e3a" + "8b2e6bdb7e59ba4e49085e18081e283a0e4b2aee1a999e38ab7e78da4e5bba8d789e2acbbe181a6e29786e0b08ce1a497" + "e6b48ce58b82e7b6b9e48c9ae69896e2b78de5ac99e1a28000e59890e3a6bde18d9be49997e2b2aee0b181e1a697e38ca" + "ee1a080d694e4ae9bd7b7e6b4aee5ac99e39cb4e0b1b3e5b1a2e68384e185b1e18b93d786e0ae8cc498e68c86e6939ee4" + "b781e68cabe68c90d8a5e0ae8ee19a99e2b8b1e5b1a0e1b388e2aca0e199a6e0baace5b49be1a282e380aee6819cd0844" + "0e39897e2b5ace1a59be3aab7e0a880e49b9ae0a79de4ae93e79986e6b2acc59ce19c99e2b8b066e580ace18dbbd8b7e2" + "b6ade1b398e38abad9b2e781a2e492b8c5b1e38083e6b1a1e1ad9be3a4b8e78da5e58ba6e39795e0a2b3e48ba3e49786e" + "0ad8ce3aab1e6b1a9e5b388e2b3a4e1ada9e68c96d8a5e0ae8ec499e78084e5b392e2a69de78688cc92e296a7e0ae8ce1" + "9c9ce0b0b0e58ba0e1b6b9e1abbbe19a86e4b78ce1a59bcab6e4a590e0ba9cd385e68090e29a90e4b7aee5a69be3a4bae" + "685aee4ab86e1978de78698e68cb2d8a5e1a985e39eb9e699aee693aad6b9e2ac9be79cb6e2b78be5b499e39ebbe6adb2" + "e68886e482b809e582b0e6b1ade1b49de3a0b9e6bda4e6939ee1978de78688e68c82db85e48980e386b6e699b7e5b38ae" + "1968de2ae9be68c90e49885e0b58be0ac80e795b3e4aba0e39789e18c8be19d87e4b58de0b69be1a49ae6bda3e4aba4e2" + "96b1e38c93e68c90e49885e4b18b1ce78c8be5ab92e38781e68f8be79a96e0b48ce4959de19c98e3a0b1e6919ce492b4e" + "285b1e28ba3e496a6e5b598e398b4e2b9a4e689a6e1b088e7ac90e19d86e2b78ce1a19ae1a285e384aee5b1b0e39388e1" + "a6a1e48d83e2b6a0e1a998c2b730e19880e296a0e48cbbe19b86e0b3ade5b49ae3a4b2e48483e38a9ce19085ce98e2989" + "7e4b5aee48680e3aab1e6a5b2e69b9ee490b9e0a5b1e68e83e29985e0b58be1a097e39caee6899ce39090e4ac8be19ba6" + "d8a0e48280e3a084e791a1e58386e596bde4ada3e182b6e29786e0b88ce1a497e39cade5b1a2e18384e0ada8e69a96e28" + "0ad0ccc81e685a3e4ab9ad789e0a1a3e18ba3e49c86e4b28be1a296e380aee6a19ce1809ce38cabe59896e0b68ee4859d" + "e19c98e2b8b0c9a0e3a080e68c90e39bb6e6b5ace1a198e3a0b9e6b9a5e693a8e2a7a5e78688cc92d6a7e4ae8ce19c993" + "0e6a0a4e196a1e6ae93e49896e4afade5af99e39cbae685a4e58ba8e3a6bde0a183e68ba3e69786e0ae8ce1b099e18480" + "e583a8e4a695e0adabe79b86e0b2abe5b09ee39cb0e6a5b3e5b39ee490a1e385b1e38ba3e29786e0b38cd681e6a5ace5b" + "384e3a6bde6af8be59bb6e2b9aee0b281e1a297e380aee4988ed6a1e78db3e49996e281ade0ae8cc298e0a882e5a38ae5" + "a695e28c8be29bb7e0b4aee48c99e19c98e3a0b1e6919ce492b4e485b1e48ba3e28686e5a19be39cb4e68d9fe48b90e3a" + "6b9e68cabe1809606c780e3aab9e695aee58b98e1a68de0a688cba3e29786e4858ce3ae84e789afe4a398e18695e28d8b" + "e380b7e2baace4819ac298e6a488e6a39ce4a695e0adb3e19b86e298a0e48280e38681e6b5a6e6b896e482b8c5b1cb93e" + "2b98ee4b299ce9ce695aee6bba8e4a6bde0ad9bcc9040e1a183e386b9e6a5a8e4aba8e5868de18eabe69e97e49a80e0b9" + "8be1b097dcb4e4ab9ce5b791e18dbbe19ab7e298a000e3ae87e6a5a5e4a3a4e3a6a5e3acbbe49896e2b3ace1b499e1a48" + "3e388aee6899cc384e6a1a8e798b6e2b38ee1b29de392b7e795b4e4aba4e1978de78698e68c82e49885c980e3a4bae78d" + "a1e49b90e3a685e38e9be68c90e49885e4b18bc89ae685ade5b392e4908501e58290e6b1ade5ac9de38eb4e791a8e0aba" + "6e3a384e78681ccb2e68480e5b598e3aab1e689ade6938ae59095e0a5b1e28ba306e1b381e382b7e189a4e5b1a2e68384" + "e185b1e18b93e49786e0b28ce1a097e2b8b4e6a9a2e0a684e58098e19996e284ade4ae8ee19c9be2b8b0e681a4e1b3a4e" + "48c98e69896e2b78de5ac99e1a282e380aee6819ce0a084e0a098e29996e28386e0b18ce1a297e390aee5a888e29685e0" + "adb3e18c9040e5ad82e396b2e6b9a1e69b92e1a6b5c688e28ba3e29786e4888de38ab6e685abe58b9ce3978de0a0b3e68" + "c83e49985e0b58bc880e68885e5a388e0a6a5e0a183e18ba3e49ca6e0b38be1ae97e6b48ae5a3aae29791e68c93e39bb6" + "e2b5ace0b280c880e6a5ade49ba6e49085e18081e381a0e2b98ce1a199e38abae38087e6a99ce482b8e285b1e58186e2b" + "0ade5ae9ae1a280c880e6b892e69685e28e9be69bb7e6b2ade4869ce1a098e384aee6819ce3a09ce28cabe79db7e6b98d" + "e4839ae19c9830e0b080e3868ce6aeabe39c86c48ee0ae8ee19c98e2acb0e681a2e6a080e48e98e49d96e0baaee1a59ce" + "3a0bce789a5e5ab92e3a695e0aea3e39b86e0b2aee5b49de39cb4e78da7e6888ae482b8e2a5b123e6b1a1e1ad9be39eb3" + "e791b2e1b3a6e3a384e48689e28ba3e296a6e0ae8de19c98e2b8b0e0a1a8d6b4e78d8be18096e48086ce80e382b7e795b" + "4e4aba4e0b78de6adbbe19c86e6b9ace4929ce19c98e3a0b1e6919ce492b4e4a5b1e78ba3e496a6e1af99e38eb9e0b9a5" + "e48b9ce59791e2ae93e39cb6e2b7ace5b09be3a6b0cdb3e5b1a2d380e78090e49cb0e4b7aee5a19ce38ab3e695aee6bba" + "8e4a6bde68d9be68c90d8a5e0ae8ee19a99e2b8b1e5b1ace38384e0ada8e69a96e6afade5a898e39cb0e695aecb98c384" + "e28080e299a1e2b0aee1a59be386b2e6b5afe48ba0e5868de18ca3e79897e4b2aee1b39ce1a285e384aee5a9b0e3a390e" + "78689cc82c8a0e5a599e39eb1e685b2e58ba8e19799e18bbbe79b86e6b1ade5b39ae1a482e384aee6819ce2a080e7ac90" + "e19d86e2b78ce5b09ee3a8b7d9b3e5b1b0e3a380e18689e38083e0b381e1a29de382b1e6ada3e683aae4a78de0a0b1cba" + "3e29786e0b78cd281e6bda3e5838ce0b5bde18dbbd997e498a1e0b68be1a897e388aee0b9a2e1969ce2adb3e19ca6e2b6" + "8ce4b180c480e6b488e59386e69791e4ada3e398a6e498a1e0b18be19a9ce2b8b6e5b1a0e59384e6a181e298b6e2ba8de" + "5ac9ee384b4e38483e6819c04e4a180dcb6e6b0aee5ae9de3a4b2e38483e6819ce29080e38ca8e29997e6bcaee5af98e3" + "a0b6e3848ce6899ce3a3a0e6a691e68c92e49aa5e0b78bd480e695aae6a392e1979de5ac8be29996e683aee0ae8ce19c9" + "8e2b8b070e580a4e18cabe19ca7e2b68ce1b49aceb4e2b8b0e1b1a0e3a4bde188aae58390e4b4ade1a99be38eb7e685a7" + "e4bb88e58695e38e9be68c90e298a5e0ae8ce0a898e685ade5b392e3a5bde28cabe79db7e6b98de59f9ae390b1e6b9a1e" + "4ab9cd6b1c690e480a0e4b1a1e1a19ce3a8b3e79db4e48b8ae196ade3ae93e68e90e498a5e4b18be1ae9ce6b484e58b82" + "e196b9e78688e68c82d885e48280e38285e685abe583a6e0b6a5e7aea3e59b96e2838ce4ae8ce19a9ae380b2e5a888e29" + "685e0adb3cc90e28280e5a681e3a4b7e695a7c886e694b9e281a2e59a97e6b98ce5b397e3a4b7e6a5b4e4bb9ce4908dc5" + "b1e58083e0b9a0e5ac9ce3a8b4e38483e6899ce0a084e1a1b0e49bb6e6b7ade5b39ce398b0e6a1a3e69b8ae4b791e0a0a" + "bcba3e69787e48c8ce390b1e6b9a1e4ab9ce7b6b1e0adaae69a96e282ade0ae8ce19c98c4b0e0b084e1978ce2ada3e59b" + "a6e286ace4ae8ce1b098e388aee6899ae492b8e786b9e78e92e2b780e5b499e39ebbe6adb2e6888200e28298e19ca6e0b" + "88de1b99ce39eb6e691a1e5b392e4b69de18c9be59997e2b78ce0b181e1ac97e390aee1b086e4a68ce38c8be19d86e6b7" + "8de5b499e38abbe6ada1e0bba6e196b8e3aea3e29bb7e6b5aee0b180e1a097d080e5a892e3a6a5e1acabe19ca6e0b38ce" + "4869de19c98e3a0b1e6919ce590a8e18db3e79997e6b4ace5b49ce3a4b2e49884e1a29ad38de18180e79997e6b4ace5b4" + "9ce3a4b2e49884e1a29ad38de68080e59d80e4b98ce1a19ce398b1e6b9a5e4ab88e48789e78688cc92e49787e4ad8ce19" + "c98e2b8b1e5b1a0e48384c691e38680e0b7aee5a89ce3a6b4e6a5b4e48b86e19791e18ca3e39896e0b5ace5a19ce396b1" + "e799b3e1bb90e3a384e48689e28ba3e296a6e0ae8ce19c98e2b8b4e691a2e2b080e7ada8e39d96e0b2aee5b79de382b2e" + "78dabc886e694b9e48092e19d80e2ba8de5ae98e3aab4d5ade5b1a6e3a394e3a6b1e59ba0e6ba8ce1af9de396b9e38483" + "e6819cd084e580a0e49896e0b2ace48d80e3a4b1e685a5e4aba8e5b791e0acabe59ab6e0b98ce0b282e1a097e380aee68" + "99ce0a39ce2a1b0e39896e6bcaee5b697e398b4e685ace4ab8ee4b789e0a1abe18ba3e49c86e4b28be1a296e380aee689" + "9ce1b380e2aca0e199a6e0baace5b49be1a282e380aee6819ce0a08428da97e4b2aee48c9ee19c98e3a0b1e6919ce492b" + "4e0a5b1e58ba3c3a6e1a599e382b3e6b1b5e0aba8e3a384e78681e18c82e68080e5a981e38ab1e695a2e4bba4d08de4a9" + "b215e0b381e5b99be390bbe695a5d398e39098e78c8be49d86e4b2ade0b181e1b297e388aee0b9aee196b8e3aea3e29bb" + "7e2b5aee0b18000e69489e5bb86e3b6b1e4acbbe398b6e282aee4ae8ce19c9bc8b3e6888ad795e5ae93e381b6e49786e4" + "ad8ce1aa99d0b8e48b9ae3a6a5e0a08be28083c680e5a19ee3a4b2e6b5afe5b392e396a5cc8be281b7e49986e4b18be19" + "c98d0b1e48b9ae3a6a5e0a09bcba326c680e392b8e781a7e5b38ae68095c5b1e18ba3e28186e5a682e3a6b0e689b4e5b3" + "8ae2868de380abcba3e49786e4878ce390b1e6b9a1e4ab9ce196b1e786a0e68da2e29885e48280e3a084e6b1afe5abb2e" + "4a6bde48e83e182b6e29786e0b88ce1a497e380ade6a19ce18390e0ada8e69a96e280ad0cd480e795a1e5bba8e19789e6" + "8cbbe29a96e2838ce4ae8ce19a9be38cb5e1b084e5878ce18dbbe79897e0b2ace5b299e3aeb0e789a5e0b3a6e48384e18" + "5b1e18ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606cc80e398b3e7a1b5e4ab9ce5b791e18dbbe39a" + "b7e683aee0ae8de19c98e2b8b770e3a0a8e7acabe39ba6e2b98ce1a698e1a4bae38883e6919ce28088e78ca8e29996e2b" + "1aee1ac99ceb6e2b8b0e1b1a0e3a4bde3a8aae59ba0e6ba8ce1af9de396b9e38085e6819ce482b8e18081e18290e0b88c" + "e5ac9ce3a6b2e6a5abe1a39ce3a388e786a1e38c82e6b6a5e0b198e1a297d0b8e78ba6e0b6b9e0a08be18093e485a0e1a" + "599e3a4b9e791a9e49b8ae4a6bde18cabe583a0e0b7ade1b599e382b6e789b2e6ab9ee19791e1ae93e18287e29787e4ae" + "8ce19a98e38cb9e5a898e29685e7adb3d8b5e4b0ade5ae9be398b2e3888100e4a190e38cabe69a96e0b2ade1b399e39eb" + "ae685b2e4ab8ee18685e7aca3e39ba6c2aee0ae8ce19c9c32e5b894e19781e68db3e19bb6e2b28ce1b299e1a283e2b8b2" + "e5b1a0e0a384e28188e59a87e4aface5a19de398bae185b4e5b1a2e68384e185b1e28b93d786e4ae8ce1a098e3a0aee78" + "9ace3a09ce28cabe79db7e6b98dc69ae19c98e398b2e6819cd080e6a2a8e49bb6e4b2ace5ae9ce392bae698bae6ab98e3" + "a7a1e28cabe79db7e6b98de5b39ae1ae81e39cb000" + ) + ).decode("utf-8"), + "fmlNetworkVersion": 3, + "mods": [], + "truncated": True, + } + ) + ) + assert value is not None + return value diff --git a/tests/status_response/test_java.py b/tests/status_response/test_java.py index 5151b0cd..6e688b9d 100644 --- a/tests/status_response/test_java.py +++ b/tests/status_response/test_java.py @@ -1,8 +1,7 @@ import pytest -from mcstatus.forge_data import ForgeDataChannel, ForgeDataMod, RawForgeData from mcstatus.motd import Motd -from mcstatus.status_response import ForgeData, JavaStatusPlayer, JavaStatusPlayers, JavaStatusResponse, JavaStatusVersion +from mcstatus.status_response import JavaStatusPlayer, JavaStatusPlayers, JavaStatusResponse, JavaStatusVersion from tests.status_response import BaseStatusResponseTest @@ -104,649 +103,3 @@ class TestJavaStatusVersion(BaseStatusResponseTest): @pytest.fixture(scope="class") def build(self) -> JavaStatusVersion: return JavaStatusVersion.build({"name": "1.8-pre1", "protocol": 44}) - - -@BaseStatusResponseTest.construct -class TestForgeData(BaseStatusResponseTest): - EXPECTED_VALUES = [ - ("fml_network_version", 3), - ( - "channels", - [ - ForgeDataChannel( - name="cyclopscore:channel_main", - version="1.0.0", - required=True, - ), - ForgeDataChannel( - name="supermartijn642configlib:sync_configs", - version="1", - required=False, - ), - ForgeDataChannel( - name="alexsmobs:main_channel", - version="1", - required=False, - ), - ForgeDataChannel( - name="sophisticatedcore:channel", - version="1", - required=False, - ), - ForgeDataChannel( - name="rftoolsbase:rftoolsbase", - version="1.0", - required=True, - ), - ForgeDataChannel( - name="irongenerators:irongenerators", - version="1", - required=False, - ), - ForgeDataChannel( - name="xaeroworldmap:main", - version="1.0", - required=True, - ), - ForgeDataChannel( - name="cookingforblockheads:network", - version="1.0", - required=False, - ), - ForgeDataChannel(name="xnet:xnet", version="1.0", required=True), - ForgeDataChannel( - name="placebo:placebo", - version="1.0.0", - required=True, - ), - ForgeDataChannel( - name="citadel:main_channel", - version="1", - required=False, - ), - ForgeDataChannel( - name="sophisticatedbackpacks:channel", - version="1", - required=False, - ), - ForgeDataChannel( - name="buildinggadgets:main", - version="4", - required=False, - ), - ForgeDataChannel( - name="mekanismgenerators:mekanismgenerators", - version="10.2.5", - required=False, - ), - ForgeDataChannel( - name="waila:networking", - version="1.0.0", - required=True, - ), - ForgeDataChannel( - name="shetiphiancore:main_channel", - version="1.0.0", - required=False, - ), - ForgeDataChannel( - name="dummmmmmy:dummychannel", - version="1", - required=False, - ), - ForgeDataChannel( - name="supplementaries:network", - version="1", - required=False, - ), - ForgeDataChannel( - name="refinedstorage:main_channel", - version="1", - required=False, - ), - ForgeDataChannel(name="corpse:default", version="1.0.0", required=True), - ForgeDataChannel( - name="ping:ping_channel", - version="PING1", - required=True, - ), - ForgeDataChannel( - name="ironfurnaces:ironfurnaces_network", - version="1.0", - required=True, - ), - ForgeDataChannel(name="botania:main", version="0", required=False), - ForgeDataChannel(name="curios:main", version="1", required=False), - ForgeDataChannel(name="patchouli:main", version="1", required=False), - ForgeDataChannel(name="camera:default", version="1.0.0", required=True), - ForgeDataChannel( - name="libnonymous:channel", - version="1.0", - required=True, - ), - ForgeDataChannel( - name="elevatorid:main_channel", - version="1", - required=False, - ), - ForgeDataChannel(name="worldedit:cui", version="1", required=True), - ForgeDataChannel(name="worldedit:internal", version="1", required=True), - ForgeDataChannel(name="cfm:network", version="1", required=False), - ForgeDataChannel( - name="architectury:network", - version="1", - required=True, - ), - ForgeDataChannel(name="trashcans:main", version="1", required=False), - ForgeDataChannel(name="jei:channel", version="1.0.0", required=True), - ForgeDataChannel(name="ae2:main", version="1", required=True), - ForgeDataChannel( - name="mekanism:mekanism", - version="10.2.5", - required=False, - ), - ForgeDataChannel(name="bdlib:multiblock", version="2", required=False), - ForgeDataChannel(name="bdlib:misc", version="1", required=False), - ForgeDataChannel(name="create:main", version="1", required=False), - ForgeDataChannel( - name="waystones:network", - version="1.0", - required=False, - ), - ForgeDataChannel(name="comforts:main", version="1", required=False), - ForgeDataChannel( - name="naturescompass:naturescompass", - version="1.0", - required=True, - ), - ForgeDataChannel( - name="storagenetwork:main_channel", - version="1", - required=False, - ), - ForgeDataChannel(name="cofh_core:general", version="1", required=True), - ForgeDataChannel( - name="mcjtylib:mcjtylib", - version="1.0", - required=True, - ), - ForgeDataChannel( - name="mininggadgets:main_network_channel", - version="2", - required=False, - ), - ForgeDataChannel( - name="crafttweaker:main", - version="1.0.0", - required=False, - ), - ForgeDataChannel(name="akashictome:main", version="1", required=False), - ForgeDataChannel( - name="forge:tier_sorting", - version="1.0", - required=False, - ), - ForgeDataChannel(name="forge:split", version="1.1", required=True), - ForgeDataChannel( - name="colossalchests:channel_main", - version="1.0.0", - required=True, - ), - ForgeDataChannel(name="selene:network", version="1", required=False), - ForgeDataChannel( - name="craftingtweaks:network", - version="1.0", - required=False, - ), - ForgeDataChannel( - name="minecraft:unregister", - version="FML3", - required=True, - ), - ForgeDataChannel( - name="minecraft:register", - version="FML3", - required=True, - ), - ForgeDataChannel(name="titanium:network", version="1.0", required=True), - ForgeDataChannel( - name="easy_villagers:default", - version="1.0.0", - required=True, - ), - ForgeDataChannel(name="pipez:default", version="1.0.0", required=True), - ForgeDataChannel(name="mantle:network", version="1", required=False), - ForgeDataChannel(name="quark:main", version="1", required=False), - ForgeDataChannel( - name="xaerominimap:main", - version="1.0", - required=True, - ), - ForgeDataChannel( - name="fastbench:channel", - version="4.6.0", - required=True, - ), - ForgeDataChannel(name="polymorph:main", version="1", required=False), - ForgeDataChannel( - name="storagedrawers:main_channel", - version="1", - required=False, - ), - ForgeDataChannel( - name="enercell:network", - version="0.0.0", - required=False, - ), - ForgeDataChannel(name="appleskin:sync", version="1", required=True), - ForgeDataChannel( - name="modularrouters:main_channel", - version="2", - required=False, - ), - ForgeDataChannel( - name="the_vault:network", - version="0.26.0", - required=False, - ), - ForgeDataChannel( - name="modernui:fluxnetworks", - version="707", - required=False, - ), - ], - ), - ( - "mods", - [ - ForgeDataMod(name="rsrequestify", marker="2.2.0"), - ForgeDataMod(name="cyclopscore", marker="1.15.1"), - ForgeDataMod(name="auudio", marker="1.0.3"), - ForgeDataMod(name="auxiliaryblocks", marker="1.18.2-0.0.14"), - ForgeDataMod(name="supermartijn642configlib", marker="1.1.6"), - ForgeDataMod(name="alexsmobs", marker="1.18.6"), - ForgeDataMod(name="architects_palette", marker="1.1.2"), - ForgeDataMod(name="cagerium", marker="1.18.2-1.1.0"), - ForgeDataMod(name="mcwwindows", marker="2.0.3"), - ForgeDataMod( - name="sophisticatedcore", - marker="1.18.2-0.5.32.179", - ), - ForgeDataMod(name="thermal", marker="1.6.3.28"), - ForgeDataMod(name="rftoolsbase", marker="1.18-3.0.9"), - ForgeDataMod(name="initialinventory", marker="6.0.8"), - ForgeDataMod(name="irongenerators", marker="2.0.1"), - ForgeDataMod(name="xaeroworldmap", marker="1.25.1"), - ForgeDataMod(name="cookingforblockheads", marker="12.0.2"), - ForgeDataMod( - name="controlling", - marker="", - ), - ForgeDataMod(name="xnet", marker="1.18-4.0.5"), - ForgeDataMod(name="placebo", marker="6.4.1"), - ForgeDataMod(name="citadel", marker="1.11.3"), - ForgeDataMod(name="powah", marker="3.0.1-beta"), - ForgeDataMod(name="bookshelf", marker="13.2.50"), - ForgeDataMod(name="lootbeams", marker="1.18.1"), - ForgeDataMod( - name="sophisticatedbackpacks", - marker="1.18.2-3.18.35.752", - ), - ForgeDataMod(name="twigs", marker="1.1.4-patch1+1.18.2"), - ForgeDataMod( - name="buildinggadgets", - marker="3.13.0-build.5+mc1.18.2}", - ), - ForgeDataMod(name="darkutils", marker="10.0.5"), - ForgeDataMod(name="mcwdoors", marker="1.0.6"), - ForgeDataMod(name="waddles", marker="1.18.2-0.8.19"), - ForgeDataMod(name="mekanismgenerators", marker="10.2.5"), - ForgeDataMod(name="balm", marker="3.2.0+0"), - ForgeDataMod(name="waila", marker=""), - ForgeDataMod(name="jeresources", marker="0.14.1.171"), - ForgeDataMod( - name="cloth_config", - marker="", - ), - ForgeDataMod(name="shetiphiancore", marker="3.10.10"), - ForgeDataMod(name="dummmmmmy", marker="1.18-1.5.2"), - ForgeDataMod(name="supplementaries", marker="1.18.2-1.5.13"), - ForgeDataMod(name="refinedstorage", marker="1.10.2"), - ForgeDataMod(name="konkrete", marker="1.3.3"), - ForgeDataMod(name="easy_piglins", marker="1.18.2-1.0.0"), - ForgeDataMod(name="corpse", marker="1.18.2-1.0.2"), - ForgeDataMod(name="packmenu", marker=""), - ForgeDataMod(name="mcwbridges", marker="2.0.3"), - ForgeDataMod(name="torchmaster", marker="18.1.0"), - ForgeDataMod(name="compressium", marker="1.4.2-build.9+mc1.18.2"), - ForgeDataMod(name="ping", marker="1.18-1.8.0"), - ForgeDataMod(name="ironfurnaces", marker="3.3.1"), - ForgeDataMod(name="mcwtrpdoors", marker="1.0.6"), - ForgeDataMod(name="mcwfences", marker="1.0.5"), - ForgeDataMod(name="supermartijn642corelib", marker="1.0.19"), - ForgeDataMod(name="simplylight", marker="1.18.2-1.4.2-build.31"), - ForgeDataMod(name="botania", marker="1.18.2-434"), - ForgeDataMod(name="highlighter", marker="ANY"), - ForgeDataMod(name="spark", marker=""), - ForgeDataMod(name="curios", marker="1.18.2-5.0.7.1"), - ForgeDataMod(name="patchouli", marker="1.18.2-71.1"), - ForgeDataMod(name="camera", marker="1.18.2-1.0.4"), - ForgeDataMod(name="blockcarpentry", marker="1.18-0.3.0"), - ForgeDataMod(name="thermal_foundation", marker="1.6.3.28"), - ForgeDataMod(name="thermal_expansion", marker="1.6.3.13"), - ForgeDataMod(name="libnonymous", marker="2.1.0"), - ForgeDataMod(name="elevatorid", marker="1.18.2-1.8.4"), - ForgeDataMod(name="runelic", marker="11.0.1"), - ForgeDataMod( - name="worldedit", - marker="", - ), - ForgeDataMod(name="cfm", marker="7.0.0-pre29"), - ForgeDataMod(name="architectury", marker="4.9.84"), - ForgeDataMod(name="weirdinggadget", marker="2.2.11"), - ForgeDataMod(name="mcwfurnitures", marker="3.0.0"), - ForgeDataMod(name="trashcans", marker="1.0.15"), - ForgeDataMod(name="mcwlights", marker="1.0.3"), - ForgeDataMod(name="cucumber", marker="5.1.2"), - ForgeDataMod(name="snad", marker="1.18.2-1.22.04.15a"), - ForgeDataMod(name="jei", marker="9.7.0.209"), - ForgeDataMod(name="ae2", marker="11.1.4"), - ForgeDataMod(name="mekanism", marker="10.2.5"), - ForgeDataMod(name="bdlib", marker="1.19.3.7"), - ForgeDataMod(name="create", marker="0.5.0.d"), - ForgeDataMod(name="waystones", marker="10.1.0"), - ForgeDataMod(name="clumps", marker="8.0.0+10"), - ForgeDataMod(name="shutupexperimentalsettings", marker="1.0.5"), - ForgeDataMod(name="comforts", marker="1.18.2-5.0.0.4"), - ForgeDataMod(name="naturescompass", marker="1.18.2-1.9.7-forge"), - ForgeDataMod(name="storagenetwork", marker="1.18.2-1.6.1"), - ForgeDataMod(name="framedcompactdrawers", marker="1.18-4.1.0"), - ForgeDataMod(name="decorative_blocks", marker="2.1.0"), - ForgeDataMod(name="botanypots", marker="8.0.12"), - ForgeDataMod(name="ftbbackups2", marker="1.0.17"), - ForgeDataMod(name="cofh_core", marker="1.6.4.21"), - ForgeDataMod(name="mcjtylib", marker="1.18-6.0.15"), - ForgeDataMod(name="ispawner", marker="1.0"), - ForgeDataMod(name="everycomp", marker="1.18.2-1.5.7"), - ForgeDataMod(name="jeitweaker", marker="3.0.0.8"), - ForgeDataMod(name="terralith", marker="0.0NONE"), - ForgeDataMod(name="mininggadgets", marker="1.11.0"), - ForgeDataMod(name="crafttweaker", marker="9.1.197"), - ForgeDataMod(name="akashictome", marker="1.5-20"), - ForgeDataMod(name="forge", marker="ANY"), - ForgeDataMod(name="colossalchests", marker="1.8.3"), - ForgeDataMod(name="selene", marker="1.18.2-1.17.9"), - ForgeDataMod(name="drippyloadingscreen", marker="1.6.4"), - ForgeDataMod( - name="craftingtweaks", - marker="", - ), - ForgeDataMod(name="minecraft", marker="1.18.2"), - ForgeDataMod(name="terrablender", marker="1.18.2-1.1.0.102"), - ForgeDataMod( - name="sophisticatedbackpacksvh", - marker="1.18.2-1.0.4.12", - ), - ForgeDataMod(name="mousetweaks", marker="ANY"), - ForgeDataMod(name="titanium", marker="3.5.6"), - ForgeDataMod(name="jade", marker=""), - ForgeDataMod(name="createtweaker", marker="2.0.0.17"), - ForgeDataMod(name="easy_villagers", marker="1.18.2-1.0.10"), - ForgeDataMod(name="pipez", marker="1.18.2-1.1.5"), - ForgeDataMod(name="iceberg", marker="ANY"), - ForgeDataMod(name="flywheel", marker=""), - ForgeDataMod(name="mantle", marker="1.9.27"), - ForgeDataMod(name="ecologics", marker="1.7.3"), - ForgeDataMod(name="quark", marker="3.2-358"), - ForgeDataMod(name="xaerominimap", marker="22.11.1"), - ForgeDataMod(name="pigpen", marker="8.0.1"), - ForgeDataMod(name="fastbench", marker="6.0.2"), - ForgeDataMod(name="polymorph", marker="1.18.2-0.44"), - ForgeDataMod(name="autoreglib", marker="1.7-53"), - ForgeDataMod(name="storagedrawers", marker="10.2.1"), - ForgeDataMod(name="fluxnetworks", marker="7.0.7.8"), - ForgeDataMod(name="neoncraft2", marker="2.2"), - ForgeDataMod(name="enercell", marker="0.0NONE"), - ForgeDataMod(name="appleskin", marker="2.4.0+mc1.18"), - ForgeDataMod( - name="ferritecore", - marker="", - ), - ForgeDataMod(name="modularrouters", marker="9.1.1-93"), - ForgeDataMod(name="refinedstorageaddons", marker="0.8.2"), - ForgeDataMod(name="openloader", marker="12.0.1"), - ForgeDataMod(name="the_vault", marker="1.18.2-2.0.10.869"), - ], - ), - ("truncated", False), - ] - - @pytest.fixture(scope="class") - def build(self) -> ForgeData: - value = ForgeData.build( - RawForgeData( - { - "channels": [], - "d": ( - bytes.fromhex( - "e0ba8b0000c484e4a0b0e18e9be19997e2baaee1b399e392bae7a5a6e6908ae4a2b8c5b1e380a3e2b1a1e1a39ee39eb6e" - "78db0e5bb86e19789e0a0b3e18ba3e49aa6e0b18be38686e685a8e5b39ce38695e6abbbe19896e2b78de0b181e1a097e3" - "80ae02d098e2aeabe19987e2b7ade0b181e1a097e38caee1b880e59684e4af83e19b86e4b0ade1b99ce398b1e68dafe69" - "b96e490b5e0a5b1e68e83e29985e0b08be1a097e384aed1a8e4b1a0ceabe29997e2b6aee1b298e392bae6b9aae6a1ace0" - "b388e78dbbe199a6e0b3ade1a99bcab1e2b8b1e5b1a2e38398e4ae98e39ba7e6aface1af98e38cb7e69da9cba6c384e4a" - "090e49890e0b2ade5b39ee39eb6e78da2e6888ce492b8e78781e48da2e2b6a1e1a998e2beb7e6a1a3e5b382e196b9e0ad" - "a3cc90e48080e1a184e386b9e6a5a8e4aba8e5868de7ae9be19c85e2b68ce1b499e38abae38485e6899ce4a2b8e48081e" - "198b0e2b3ace5b299e3aab4e0b1ade5b1a2e68384e185b1e18b93e29786e0ae8c18e6b48ae6bb86e2979de28db3e79bb6" - "e2b9aee0b281e1a097e38caee28884e3b78ce48e83e39a96e2ba8ee5a39ae3a8b0e691a5e5bb86e19789e0a28be18ba3e" - "49c86e4b28be1a096e394aee6999ce3a388e3a689e78e93e0b1a0e1a19ae39cb7e6b1a5e6888200e280b8e59a87e2b98c" - "e1a19bd0b6e2b8b1e5b1ace3a38ce48691e380a3e4b981e5b499e39eb7e78dace48b84e1978de0a193e18ba3e29c86e0b" - "38be1a097e3a4aee69096e58699e7adbbe39b86e2b18ee5b398c6b2e2b8b1c9a0e48080e78d88e49a96e2b4aee5ac98e3" - "9cb4e695b6e6a39ce4a6bde2af8be68da0e49885e0b88bdc81e789a9e5b39ee1969de2adb3e19ca6e6ba8ce5b29bcab9e" - "2b8b2e5b1a0e3a384e18d88e69bb7e2b3ade5ae99e3a4b2e791a1e6939ed78dc688e580a0e2bc81e1a598e39eb9e6bdb7" - "e5a3a4e39691cc8be181a7e49786e0b58ce1a297e6b484e58b82e0b6b9e78688e18c8240e5a385e39eb7e6a5abe4bb9ce" - "3b699e18e93e79b86e6b1ade5a89ae382b2e78da4e6888ce3a388e78681e78ca2e2b780e5b499e39ebbe6adb2e68886e4" - "82b8e0a081e382b0e4b7ace1b49be39eb9e6b1ace5b392e0a69de480a0e59ba7e4ba8ce0b182e1a297e2b4b8e5b1a8e3a" - "380e286a9e69e80e0b2ade4839de19c98c4b0e0b884e38780e1ac8be29996e2b7ace0b681e1a897e384aee6808ed6b1e2" - "ac9be798a6e282ade0ae8ce19c98c4b0e0b884e2968ce0aea3e59986e4b68ce0b181e1a297e2b8b1e1a1a6d6b4e78d8be" - "397b6e2b48ce1ae98e38ab7c5ac62e19080e7ae80e19db6e4b48ce0b382e1a097e384aee4919ae58695cc8be28290e6b7" - "ace5ab9be390b9e6b1a5e0bb8ce4b384e185b1e58ba3d886c980e39eb6e791afe4ab84e39685e38e9be68c90d8a5e4ae8" - "ec498e78c96e6839ee296a1e28e9be39a97e0b0ace1a59de384b2e68da1e68396e0b685e1ad9be184a7e29786e0b88ce1" - "a497e38cade6899ce3a3a0e2a699e78ba3e49aa6e4878ce390b1e6b9a1e4ab9cd6b1c688e58080e6ba80e5a99de3a6b3e" - "38493e6899ce582b8c5a9e49897e0b1aee4b19ae1a295e384aee5b1b0e0a388e181b8e19d96e0b68de1a999e38eb7e685" - "a7e4bb88e58695e48e9be68cb1e698a5e0ae8ce19a98e795a2e5a392e3a691e5a6a9e39b92e498ace0b18be19c9ce7b4b" - "2e5a888e29685e0adb3cd80e28080e5a482e3a4b0e795abe58ba8e4b6b1e0a0b3e68c83e49885e0b58bd080e68dade4a3" - "aee3b6bde1ae93e18197d786e0ae8c1be79c87e4a382e38691e1acabe18397e29786e0b88ce1a497e380ade7819ce492b" - "8e18789e584a0e6b2ade1a19ae392b7e6b5b3e4ab8ee196b9e0ae93e79d86e6b98de4869ce1a098e388aee6a99ce39188" - "e5acabe69896e6b4ade5ad9ce38ab3e695aee48ba4e3b791e1ae93e181a7e49886e0b28be1aa9700e49088e38685e3ada" - "be68cb0e49985e4b08be1a095d483e48baee386a5e58c8be59ba0e6ba8ce1af9de396b9e6b9a9e0ab8ee3a384e78681e1" - "8c82e68080e5aa82e3a4b2e78da5e6ab9ee0b789e1acabc2a7e29786e0b48ce1a297e384aee689aee38084e68c98e49bb" - "6e6b48ee5a397e39cb7e6a5a6d38ee4b0b8e2ad83e19d86e0b88de5a99ae39cb0e6bda3e4aba4e4b09de0a5b1e68c83d8" - "a5e48c8ce382b6e6b9a9e49abed6a1e78db3e49996e282ade0ae8ce19c9830e18884e59690e6adabe59b96e2b6ade1b99" - "be1a285e384aee5a9b0e3a384e786a9e48ca2e2b281e5ad9de3b2b6e6a1a3e5b382e196b9e0ada3cc90e68180e5b383e3" - "a0bae6b1b0e5ab8ae3a695e0aea3e19ca6e6b2ade48d9ce19c98e3a0b1e6919ce492b4e2a5b1e18ba3e699a6e5ae81e3a" - "8b2e6bdb7e59ba4e49085e18081e283a0e4b2aee1a999e38ab7e78da4e5bba8d789e2acbbe181a6e29786e0b08ce1a497" - "e6b48ce58b82e7b6b9e48c9ae69896e2b78de5ac99e1a28000e59890e3a6bde18d9be49997e2b2aee0b181e1a697e38ca" - "ee1a080d694e4ae9bd7b7e6b4aee5ac99e39cb4e0b1b3e5b1a2e68384e185b1e18b93d786e0ae8cc498e68c86e6939ee4" - "b781e68cabe68c90d8a5e0ae8ee19a99e2b8b1e5b1a0e1b388e2aca0e199a6e0baace5b49be1a282e380aee6819cd0844" - "0e39897e2b5ace1a59be3aab7e0a880e49b9ae0a79de4ae93e79986e6b2acc59ce19c99e2b8b066e580ace18dbbd8b7e2" - "b6ade1b398e38abad9b2e781a2e492b8c5b1e38083e6b1a1e1ad9be3a4b8e78da5e58ba6e39795e0a2b3e48ba3e49786e" - "0ad8ce3aab1e6b1a9e5b388e2b3a4e1ada9e68c96d8a5e0ae8ec499e78084e5b392e2a69de78688cc92e296a7e0ae8ce1" - "9c9ce0b0b0e58ba0e1b6b9e1abbbe19a86e4b78ce1a59bcab6e4a590e0ba9cd385e68090e29a90e4b7aee5a69be3a4bae" - "685aee4ab86e1978de78698e68cb2d8a5e1a985e39eb9e699aee693aad6b9e2ac9be79cb6e2b78be5b499e39ebbe6adb2" - "e68886e482b809e582b0e6b1ade1b49de3a0b9e6bda4e6939ee1978de78688e68c82db85e48980e386b6e699b7e5b38ae" - "1968de2ae9be68c90e49885e0b58be0ac80e795b3e4aba0e39789e18c8be19d87e4b58de0b69be1a49ae6bda3e4aba4e2" - "96b1e38c93e68c90e49885e4b18b1ce78c8be5ab92e38781e68f8be79a96e0b48ce4959de19c98e3a0b1e6919ce492b4e" - "285b1e28ba3e496a6e5b598e398b4e2b9a4e689a6e1b088e7ac90e19d86e2b78ce1a19ae1a285e384aee5b1b0e39388e1" - "a6a1e48d83e2b6a0e1a998c2b730e19880e296a0e48cbbe19b86e0b3ade5b49ae3a4b2e48483e38a9ce19085ce98e2989" - "7e4b5aee48680e3aab1e6a5b2e69b9ee490b9e0a5b1e68e83e29985e0b58be1a097e39caee6899ce39090e4ac8be19ba6" - "d8a0e48280e3a084e791a1e58386e596bde4ada3e182b6e29786e0b88ce1a497e39cade5b1a2e18384e0ada8e69a96e28" - "0ad0ccc81e685a3e4ab9ad789e0a1a3e18ba3e49c86e4b28be1a296e380aee6a19ce1809ce38cabe59896e0b68ee4859d" - "e19c98e2b8b0c9a0e3a080e68c90e39bb6e6b5ace1a198e3a0b9e6b9a5e693a8e2a7a5e78688cc92d6a7e4ae8ce19c993" - "0e6a0a4e196a1e6ae93e49896e4afade5af99e39cbae685a4e58ba8e3a6bde0a183e68ba3e69786e0ae8ce1b099e18480" - "e583a8e4a695e0adabe79b86e0b2abe5b09ee39cb0e6a5b3e5b39ee490a1e385b1e38ba3e29786e0b38cd681e6a5ace5b" - "384e3a6bde6af8be59bb6e2b9aee0b281e1a297e380aee4988ed6a1e78db3e49996e281ade0ae8cc298e0a882e5a38ae5" - "a695e28c8be29bb7e0b4aee48c99e19c98e3a0b1e6919ce492b4e485b1e48ba3e28686e5a19be39cb4e68d9fe48b90e3a" - "6b9e68cabe1809606c780e3aab9e695aee58b98e1a68de0a688cba3e29786e4858ce3ae84e789afe4a398e18695e28d8b" - "e380b7e2baace4819ac298e6a488e6a39ce4a695e0adb3e19b86e298a0e48280e38681e6b5a6e6b896e482b8c5b1cb93e" - "2b98ee4b299ce9ce695aee6bba8e4a6bde0ad9bcc9040e1a183e386b9e6a5a8e4aba8e5868de18eabe69e97e49a80e0b9" - "8be1b097dcb4e4ab9ce5b791e18dbbe19ab7e298a000e3ae87e6a5a5e4a3a4e3a6a5e3acbbe49896e2b3ace1b499e1a48" - "3e388aee6899cc384e6a1a8e798b6e2b38ee1b29de392b7e795b4e4aba4e1978de78698e68c82e49885c980e3a4bae78d" - "a1e49b90e3a685e38e9be68c90e49885e4b18bc89ae685ade5b392e4908501e58290e6b1ade5ac9de38eb4e791a8e0aba" - "6e3a384e78681ccb2e68480e5b598e3aab1e689ade6938ae59095e0a5b1e28ba306e1b381e382b7e189a4e5b1a2e68384" - "e185b1e18b93e49786e0b28ce1a097e2b8b4e6a9a2e0a684e58098e19996e284ade4ae8ee19c9be2b8b0e681a4e1b3a4e" - "48c98e69896e2b78de5ac99e1a282e380aee6819ce0a084e0a098e29996e28386e0b18ce1a297e390aee5a888e29685e0" - "adb3e18c9040e5ad82e396b2e6b9a1e69b92e1a6b5c688e28ba3e29786e4888de38ab6e685abe58b9ce3978de0a0b3e68" - "c83e49985e0b58bc880e68885e5a388e0a6a5e0a183e18ba3e49ca6e0b38be1ae97e6b48ae5a3aae29791e68c93e39bb6" - "e2b5ace0b280c880e6a5ade49ba6e49085e18081e381a0e2b98ce1a199e38abae38087e6a99ce482b8e285b1e58186e2b" - "0ade5ae9ae1a280c880e6b892e69685e28e9be69bb7e6b2ade4869ce1a098e384aee6819ce3a09ce28cabe79db7e6b98d" - "e4839ae19c9830e0b080e3868ce6aeabe39c86c48ee0ae8ee19c98e2acb0e681a2e6a080e48e98e49d96e0baaee1a59ce" - "3a0bce789a5e5ab92e3a695e0aea3e39b86e0b2aee5b49de39cb4e78da7e6888ae482b8e2a5b123e6b1a1e1ad9be39eb3" - "e791b2e1b3a6e3a384e48689e28ba3e296a6e0ae8de19c98e2b8b0e0a1a8d6b4e78d8be18096e48086ce80e382b7e795b" - "4e4aba4e0b78de6adbbe19c86e6b9ace4929ce19c98e3a0b1e6919ce492b4e4a5b1e78ba3e496a6e1af99e38eb9e0b9a5" - "e48b9ce59791e2ae93e39cb6e2b7ace5b09be3a6b0cdb3e5b1a2d380e78090e49cb0e4b7aee5a19ce38ab3e695aee6bba" - "8e4a6bde68d9be68c90d8a5e0ae8ee19a99e2b8b1e5b1ace38384e0ada8e69a96e6afade5a898e39cb0e695aecb98c384" - "e28080e299a1e2b0aee1a59be386b2e6b5afe48ba0e5868de18ca3e79897e4b2aee1b39ce1a285e384aee5a9b0e3a390e" - "78689cc82c8a0e5a599e39eb1e685b2e58ba8e19799e18bbbe79b86e6b1ade5b39ae1a482e384aee6819ce2a080e7ac90" - "e19d86e2b78ce5b09ee3a8b7d9b3e5b1b0e3a380e18689e38083e0b381e1a29de382b1e6ada3e683aae4a78de0a0b1cba" - "3e29786e0b78cd281e6bda3e5838ce0b5bde18dbbd997e498a1e0b68be1a897e388aee0b9a2e1969ce2adb3e19ca6e2b6" - "8ce4b180c480e6b488e59386e69791e4ada3e398a6e498a1e0b18be19a9ce2b8b6e5b1a0e59384e6a181e298b6e2ba8de" - "5ac9ee384b4e38483e6819c04e4a180dcb6e6b0aee5ae9de3a4b2e38483e6819ce29080e38ca8e29997e6bcaee5af98e3" - "a0b6e3848ce6899ce3a3a0e6a691e68c92e49aa5e0b78bd480e695aae6a392e1979de5ac8be29996e683aee0ae8ce19c9" - "8e2b8b070e580a4e18cabe19ca7e2b68ce1b49aceb4e2b8b0e1b1a0e3a4bde188aae58390e4b4ade1a99be38eb7e685a7" - "e4bb88e58695e38e9be68c90e298a5e0ae8ce0a898e685ade5b392e3a5bde28cabe79db7e6b98de59f9ae390b1e6b9a1e" - "4ab9cd6b1c690e480a0e4b1a1e1a19ce3a8b3e79db4e48b8ae196ade3ae93e68e90e498a5e4b18be1ae9ce6b484e58b82" - "e196b9e78688e68c82d885e48280e38285e685abe583a6e0b6a5e7aea3e59b96e2838ce4ae8ce19a9ae380b2e5a888e29" - "685e0adb3cc90e28280e5a681e3a4b7e695a7c886e694b9e281a2e59a97e6b98ce5b397e3a4b7e6a5b4e4bb9ce4908dc5" - "b1e58083e0b9a0e5ac9ce3a8b4e38483e6899ce0a084e1a1b0e49bb6e6b7ade5b39ce398b0e6a1a3e69b8ae4b791e0a0a" - "bcba3e69787e48c8ce390b1e6b9a1e4ab9ce7b6b1e0adaae69a96e282ade0ae8ce19c98c4b0e0b084e1978ce2ada3e59b" - "a6e286ace4ae8ce1b098e388aee6899ae492b8e786b9e78e92e2b780e5b499e39ebbe6adb2e6888200e28298e19ca6e0b" - "88de1b99ce39eb6e691a1e5b392e4b69de18c9be59997e2b78ce0b181e1ac97e390aee1b086e4a68ce38c8be19d86e6b7" - "8de5b499e38abbe6ada1e0bba6e196b8e3aea3e29bb7e6b5aee0b180e1a097d080e5a892e3a6a5e1acabe19ca6e0b38ce" - "4869de19c98e3a0b1e6919ce590a8e18db3e79997e6b4ace5b49ce3a4b2e49884e1a29ad38de18180e79997e6b4ace5b4" - "9ce3a4b2e49884e1a29ad38de68080e59d80e4b98ce1a19ce398b1e6b9a5e4ab88e48789e78688cc92e49787e4ad8ce19" - "c98e2b8b1e5b1a0e48384c691e38680e0b7aee5a89ce3a6b4e6a5b4e48b86e19791e18ca3e39896e0b5ace5a19ce396b1" - "e799b3e1bb90e3a384e48689e28ba3e296a6e0ae8ce19c98e2b8b4e691a2e2b080e7ada8e39d96e0b2aee5b79de382b2e" - "78dabc886e694b9e48092e19d80e2ba8de5ae98e3aab4d5ade5b1a6e3a394e3a6b1e59ba0e6ba8ce1af9de396b9e38483" - "e6819cd084e580a0e49896e0b2ace48d80e3a4b1e685a5e4aba8e5b791e0acabe59ab6e0b98ce0b282e1a097e380aee68" - "99ce0a39ce2a1b0e39896e6bcaee5b697e398b4e685ace4ab8ee4b789e0a1abe18ba3e49c86e4b28be1a296e380aee689" - "9ce1b380e2aca0e199a6e0baace5b49be1a282e380aee6819ce0a08428da97e4b2aee48c9ee19c98e3a0b1e6919ce492b" - "4e0a5b1e58ba3c3a6e1a599e382b3e6b1b5e0aba8e3a384e78681e18c82e68080e5a981e38ab1e695a2e4bba4d08de4a9" - "b215e0b381e5b99be390bbe695a5d398e39098e78c8be49d86e4b2ade0b181e1b297e388aee0b9aee196b8e3aea3e29bb" - "7e2b5aee0b18000e69489e5bb86e3b6b1e4acbbe398b6e282aee4ae8ce19c9bc8b3e6888ad795e5ae93e381b6e49786e4" - "ad8ce1aa99d0b8e48b9ae3a6a5e0a08be28083c680e5a19ee3a4b2e6b5afe5b392e396a5cc8be281b7e49986e4b18be19" - "c98d0b1e48b9ae3a6a5e0a09bcba326c680e392b8e781a7e5b38ae68095c5b1e18ba3e28186e5a682e3a6b0e689b4e5b3" - "8ae2868de380abcba3e49786e4878ce390b1e6b9a1e4ab9ce196b1e786a0e68da2e29885e48280e3a084e6b1afe5abb2e" - "4a6bde48e83e182b6e29786e0b88ce1a497e380ade6a19ce18390e0ada8e69a96e280ad0cd480e795a1e5bba8e19789e6" - "8cbbe29a96e2838ce4ae8ce19a9be38cb5e1b084e5878ce18dbbe79897e0b2ace5b299e3aeb0e789a5e0b3a6e48384e18" - "5b1e18ba3e28686e5a19be39cb4e68d9fe48b90e3a6b9e68cabe1809606cc80e398b3e7a1b5e4ab9ce5b791e18dbbe39a" - "b7e683aee0ae8de19c98e2b8b770e3a0a8e7acabe39ba6e2b98ce1a698e1a4bae38883e6919ce28088e78ca8e29996e2b" - "1aee1ac99ceb6e2b8b0e1b1a0e3a4bde3a8aae59ba0e6ba8ce1af9de396b9e38085e6819ce482b8e18081e18290e0b88c" - "e5ac9ce3a6b2e6a5abe1a39ce3a388e786a1e38c82e6b6a5e0b198e1a297d0b8e78ba6e0b6b9e0a08be18093e485a0e1a" - "599e3a4b9e791a9e49b8ae4a6bde18cabe583a0e0b7ade1b599e382b6e789b2e6ab9ee19791e1ae93e18287e29787e4ae" - "8ce19a98e38cb9e5a898e29685e7adb3d8b5e4b0ade5ae9be398b2e3888100e4a190e38cabe69a96e0b2ade1b399e39eb" - "ae685b2e4ab8ee18685e7aca3e39ba6c2aee0ae8ce19c9c32e5b894e19781e68db3e19bb6e2b28ce1b299e1a283e2b8b2" - "e5b1a0e0a384e28188e59a87e4aface5a19de398bae185b4e5b1a2e68384e185b1e28b93d786e4ae8ce1a098e3a0aee78" - "9ace3a09ce28cabe79db7e6b98dc69ae19c98e398b2e6819cd080e6a2a8e49bb6e4b2ace5ae9ce392bae698bae6ab98e3" - "a7a1e28cabe79db7e6b98de5b39ae1ae81e39cb000" - ) - ).decode("utf-8"), - "fmlNetworkVersion": 3, - "mods": [], - "truncated": True, - } - ) - ) - assert value is not None - return value - - -@BaseStatusResponseTest.construct -class TestForgeDataV1(BaseStatusResponseTest): - RAW = { - "type": "FML", - "modList": [ - {"modid": "minecraft", "version": "1.12.2"}, - {"modid": "mcp", "version": "9.42"}, - {"modid": "FML", "version": "8.0.99.99"}, - {"modid": "forge", "version": "14.23.5.2859"}, - ], - } - - EXPECTED_VALUES = [ - ("fml_network_version", 1), - ("channels", []), - ( - "mods", - [ - ForgeDataMod(name="minecraft", marker="1.12.2"), - ForgeDataMod(name="mcp", marker="9.42"), - ForgeDataMod(name="FML", marker="8.0.99.99"), - ForgeDataMod(name="forge", marker="14.23.5.2859"), - ], - ), - ("truncated", False), - ] - - def build(self) -> ForgeData: - return ForgeData.build(self.RAW) - - -@BaseStatusResponseTest.construct -class TestForgeDataV2(BaseStatusResponseTest): - RAW = { - "fmlNetworkVersion": 2, - "channels": [], - "mods": [ - {"modId": "forge", "modmarker": "ANY"}, - ], - } - - EXPECTED_VALUES = [ - ("fml_network_version", 2), - ("channels", []), - ("mods", [ForgeDataMod(name="forge", marker="ANY")]), - ("truncated", False), - ] - - def build(self) -> ForgeData: - return ForgeData.build(self.RAW) - - -@BaseStatusResponseTest.construct -class TestForgeDataV3(BaseStatusResponseTest): - RAW = { - "channels": [], - "mods": [], - "truncated": False, - "fmlNetworkVersion": 3, - "d": bytes.fromhex( - "5e0000e0a084e390a4e78d8be39996e2b98ce1a698ccbae2b8b1e681a4e492b8e2a191e29ba7e6b2aee5a" - "999e3a8b9e789a5e0b088e384b5e0a69ae28280e6b2aee5a999e3a8b9e789a5e0b088e384b5e0a69ae581" - "80e6b380e5b29be38ab3e48483e38a9ce580b1e2ad8be79ca6e6b9abe1b29be392bae69daee68886e482b" - "8e2a081dcb0e2b68ee5b49ae1a281e384ae02" - ).decode("utf8"), - } - - EXPECTED_VALUES = [ - ("fml_network_version", 3), - ( - "channels", - [ - ForgeDataChannel(name="minecraft:unregister", version="FML3", required=True), - ForgeDataChannel(name="minecraft:register", version="FML3", required=True), - ForgeDataChannel(name="forge:tier_sorting", version="1.0", required=False), - ForgeDataChannel(name="forge:split", version="1.1", required=True), - ], - ), - ( - "mods", - [ - ForgeDataMod(name="minecraft", marker="1.20.1"), - ForgeDataMod(name="forge", marker="ANY"), - ], - ), - ("truncated", False), - ] - - def build(self) -> ForgeData: - return ForgeData.build(self.RAW) From 1620f7d23e0a1a468103e47279c723241a3eacf4 Mon Sep 17 00:00:00 2001 From: PerchunPak Date: Mon, 5 Feb 2024 20:41:21 +0100 Subject: [PATCH 65/67] Add type ignores to satisfy pyright --- tests/status_response/test_forge_data.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/status_response/test_forge_data.py b/tests/status_response/test_forge_data.py index d29dc0f4..680217f2 100644 --- a/tests/status_response/test_forge_data.py +++ b/tests/status_response/test_forge_data.py @@ -1,6 +1,6 @@ import pytest -from mcstatus.forge_data import ForgeDataChannel, ForgeDataMod, RawForgeData, ForgeData +from mcstatus.forge_data import ForgeData, ForgeDataChannel, ForgeDataMod, RawForgeData from tests.status_response import BaseStatusResponseTest @@ -32,7 +32,7 @@ class TestForgeDataV1(BaseStatusResponseTest): ] def build(self) -> ForgeData: - return ForgeData.build(self.RAW) + return ForgeData.build(self.RAW) # type: ignore # dict[str, Unknown] cannot be assigned to TypedDict @BaseStatusResponseTest.construct @@ -53,7 +53,7 @@ class TestForgeDataV2(BaseStatusResponseTest): ] def build(self) -> ForgeData: - return ForgeData.build(self.RAW) + return ForgeData.build(self.RAW) # type: ignore # dict[str, Unknown] cannot be assigned to TypedDict @BaseStatusResponseTest.construct @@ -93,7 +93,7 @@ class TestForgeDataV3(BaseStatusResponseTest): ] def build(self) -> ForgeData: - return ForgeData.build(self.RAW) + return ForgeData.build(self.RAW) # type: ignore # dict[str, Unknown] cannot be assigned to TypedDict @BaseStatusResponseTest.construct From 6f8cbd9a32ee9fa645ae44b830e2a6801d286e69 Mon Sep 17 00:00:00 2001 From: PerchunPak Date: Mon, 5 Feb 2024 20:47:39 +0100 Subject: [PATCH 66/67] Add channels to tests --- tests/status_response/test_forge_data.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tests/status_response/test_forge_data.py b/tests/status_response/test_forge_data.py index 680217f2..4141e4a3 100644 --- a/tests/status_response/test_forge_data.py +++ b/tests/status_response/test_forge_data.py @@ -14,11 +14,14 @@ class TestForgeDataV1(BaseStatusResponseTest): {"modid": "FML", "version": "8.0.99.99"}, {"modid": "forge", "version": "14.23.5.2859"}, ], + "channels": [ + {"res": "fml:handshake", "version": "1.2.3.4", "required": True}, + ], } EXPECTED_VALUES = [ ("fml_network_version", 1), - ("channels", []), + ("channels", [ForgeDataChannel(name="fml:handshake", version="1.2.3.4", required=True)]), ( "mods", [ @@ -39,7 +42,9 @@ def build(self) -> ForgeData: class TestForgeDataV2(BaseStatusResponseTest): RAW = { "fmlNetworkVersion": 2, - "channels": [], + "channels": [ + {"res": "fml:handshake", "version": "1.2.3.4", "required": True}, + ], "mods": [ {"modId": "forge", "modmarker": "ANY"}, ], @@ -47,7 +52,7 @@ class TestForgeDataV2(BaseStatusResponseTest): EXPECTED_VALUES = [ ("fml_network_version", 2), - ("channels", []), + ("channels", [ForgeDataChannel(name="fml:handshake", version="1.2.3.4", required=True)]), ("mods", [ForgeDataMod(name="forge", marker="ANY")]), ("truncated", False), ] From 505ccabae17d299e891c688fa6ad5580777eae8d Mon Sep 17 00:00:00 2001 From: PerchunPak Date: Mon, 5 Feb 2024 20:48:40 +0100 Subject: [PATCH 67/67] Add `@pytest.fixture` to build methods in tests --- tests/status_response/test_forge_data.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/status_response/test_forge_data.py b/tests/status_response/test_forge_data.py index 4141e4a3..11b8857b 100644 --- a/tests/status_response/test_forge_data.py +++ b/tests/status_response/test_forge_data.py @@ -34,6 +34,7 @@ class TestForgeDataV1(BaseStatusResponseTest): ("truncated", False), ] + @pytest.fixture(scope="class") def build(self) -> ForgeData: return ForgeData.build(self.RAW) # type: ignore # dict[str, Unknown] cannot be assigned to TypedDict @@ -57,6 +58,7 @@ class TestForgeDataV2(BaseStatusResponseTest): ("truncated", False), ] + @pytest.fixture(scope="class") def build(self) -> ForgeData: return ForgeData.build(self.RAW) # type: ignore # dict[str, Unknown] cannot be assigned to TypedDict @@ -97,6 +99,7 @@ class TestForgeDataV3(BaseStatusResponseTest): ("truncated", False), ] + @pytest.fixture(scope="class") def build(self) -> ForgeData: return ForgeData.build(self.RAW) # type: ignore # dict[str, Unknown] cannot be assigned to TypedDict