From 836b2de86f8e358dcfadc1c688631df36dbbc885 Mon Sep 17 00:00:00 2001 From: elmurato <1382097+elmurato@users.noreply.github.com> Date: Sat, 12 Aug 2023 18:36:03 +0200 Subject: [PATCH] Add dataclass for Minecraft Server data (#98297) * Add dataclass for Minecraft server data * Sort dataclass variables --- .../components/minecraft_server/__init__.py | 54 +++++++++++-------- .../components/minecraft_server/entity.py | 4 +- .../components/minecraft_server/sensor.py | 16 +++--- 3 files changed, 41 insertions(+), 33 deletions(-) diff --git a/homeassistant/components/minecraft_server/__init__.py b/homeassistant/components/minecraft_server/__init__.py index 6457f19a335..cf0d96af8d2 100644 --- a/homeassistant/components/minecraft_server/__init__.py +++ b/homeassistant/components/minecraft_server/__init__.py @@ -2,6 +2,7 @@ from __future__ import annotations from collections.abc import Mapping +from dataclasses import dataclass from datetime import datetime, timedelta import logging from typing import Any @@ -62,6 +63,19 @@ async def async_unload_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> return unload_ok +@dataclass +class MinecraftServerData: + """Representation of Minecraft server data.""" + + latency: float | None = None + motd: str | None = None + players_max: int | None = None + players_online: int | None = None + players_list: list[str] | None = None + protocol_version: int | None = None + version: str | None = None + + class MinecraftServer: """Representation of a Minecraft server.""" @@ -84,13 +98,7 @@ class MinecraftServer: self._server = JavaServer(self.host, self.port) # Data provided by 3rd party library - self.version: str | None = None - self.protocol_version: int | None = None - self.latency: float | None = None - self.players_online: int | None = None - self.players_max: int | None = None - self.players_list: list[str] | None = None - self.motd: str | None = None + self.data: MinecraftServerData = MinecraftServerData() # Dispatcher signal name self.signal_name = f"{SIGNAL_NAME_PREFIX}_{self.unique_id}" @@ -170,18 +178,18 @@ class MinecraftServer: status_response = await self._server.async_status() # Got answer to request, update properties. - self.version = status_response.version.name - self.protocol_version = status_response.version.protocol - self.players_online = status_response.players.online - self.players_max = status_response.players.max - self.latency = status_response.latency - self.motd = status_response.motd.to_plain() + self.data.version = status_response.version.name + self.data.protocol_version = status_response.version.protocol + self.data.players_online = status_response.players.online + self.data.players_max = status_response.players.max + self.data.latency = status_response.latency + self.data.motd = status_response.motd.to_plain() - self.players_list = [] + self.data.players_list = [] if status_response.players.sample is not None: for player in status_response.players.sample: - self.players_list.append(player.name) - self.players_list.sort() + self.data.players_list.append(player.name) + self.data.players_list.sort() # Inform user once about successful update if necessary. if self._last_status_request_failed: @@ -193,13 +201,13 @@ class MinecraftServer: self._last_status_request_failed = False except OSError as error: # No answer to request, set all properties to unknown. - self.version = None - self.protocol_version = None - self.players_online = None - self.players_max = None - self.latency = None - self.players_list = None - self.motd = None + self.data.version = None + self.data.protocol_version = None + self.data.players_online = None + self.data.players_max = None + self.data.latency = None + self.data.players_list = None + self.data.motd = None # Inform user once about failed update if necessary. if not self._last_status_request_failed: diff --git a/homeassistant/components/minecraft_server/entity.py b/homeassistant/components/minecraft_server/entity.py index 9458a3ef397..63d68d0aa77 100644 --- a/homeassistant/components/minecraft_server/entity.py +++ b/homeassistant/components/minecraft_server/entity.py @@ -29,9 +29,9 @@ class MinecraftServerEntity(Entity): self._attr_device_info = DeviceInfo( identifiers={(DOMAIN, self._server.unique_id)}, manufacturer=MANUFACTURER, - model=f"Minecraft Server ({self._server.version})", + model=f"Minecraft Server ({self._server.data.version})", name=self._server.name, - sw_version=str(self._server.protocol_version), + sw_version=f"{self._server.data.protocol_version}", ) self._attr_device_class = device_class self._extra_state_attributes = None diff --git a/homeassistant/components/minecraft_server/sensor.py b/homeassistant/components/minecraft_server/sensor.py index 045aa3cec4e..74422675718 100644 --- a/homeassistant/components/minecraft_server/sensor.py +++ b/homeassistant/components/minecraft_server/sensor.py @@ -89,7 +89,7 @@ class MinecraftServerVersionSensor(MinecraftServerSensorEntity): async def async_update(self) -> None: """Update version.""" - self._attr_native_value = self._server.version + self._attr_native_value = self._server.data.version class MinecraftServerProtocolVersionSensor(MinecraftServerSensorEntity): @@ -107,7 +107,7 @@ class MinecraftServerProtocolVersionSensor(MinecraftServerSensorEntity): async def async_update(self) -> None: """Update protocol version.""" - self._attr_native_value = self._server.protocol_version + self._attr_native_value = self._server.data.protocol_version class MinecraftServerLatencySensor(MinecraftServerSensorEntity): @@ -126,7 +126,7 @@ class MinecraftServerLatencySensor(MinecraftServerSensorEntity): async def async_update(self) -> None: """Update latency.""" - self._attr_native_value = self._server.latency + self._attr_native_value = self._server.data.latency class MinecraftServerPlayersOnlineSensor(MinecraftServerSensorEntity): @@ -145,13 +145,13 @@ class MinecraftServerPlayersOnlineSensor(MinecraftServerSensorEntity): async def async_update(self) -> None: """Update online players state and device state attributes.""" - self._attr_native_value = self._server.players_online + self._attr_native_value = self._server.data.players_online extra_state_attributes = {} - players_list = self._server.players_list + players_list = self._server.data.players_list if players_list is not None and len(players_list) != 0: - extra_state_attributes[ATTR_PLAYERS_LIST] = self._server.players_list + extra_state_attributes[ATTR_PLAYERS_LIST] = players_list self._attr_extra_state_attributes = extra_state_attributes @@ -172,7 +172,7 @@ class MinecraftServerPlayersMaxSensor(MinecraftServerSensorEntity): async def async_update(self) -> None: """Update maximum number of players.""" - self._attr_native_value = self._server.players_max + self._attr_native_value = self._server.data.players_max class MinecraftServerMOTDSensor(MinecraftServerSensorEntity): @@ -190,4 +190,4 @@ class MinecraftServerMOTDSensor(MinecraftServerSensorEntity): async def async_update(self) -> None: """Update MOTD.""" - self._attr_native_value = self._server.motd + self._attr_native_value = self._server.data.motd