Add dataclass for Minecraft Server data (#98297)

* Add dataclass for Minecraft server data

* Sort dataclass variables
This commit is contained in:
elmurato 2023-08-12 18:36:03 +02:00 committed by GitHub
parent 4780ea6a5b
commit 836b2de86f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 41 additions and 33 deletions

View File

@ -2,6 +2,7 @@
from __future__ import annotations from __future__ import annotations
from collections.abc import Mapping from collections.abc import Mapping
from dataclasses import dataclass
from datetime import datetime, timedelta from datetime import datetime, timedelta
import logging import logging
from typing import Any from typing import Any
@ -62,6 +63,19 @@ async def async_unload_entry(hass: HomeAssistant, config_entry: ConfigEntry) ->
return unload_ok 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: class MinecraftServer:
"""Representation of a Minecraft server.""" """Representation of a Minecraft server."""
@ -84,13 +98,7 @@ class MinecraftServer:
self._server = JavaServer(self.host, self.port) self._server = JavaServer(self.host, self.port)
# Data provided by 3rd party library # Data provided by 3rd party library
self.version: str | None = None self.data: MinecraftServerData = MinecraftServerData()
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
# Dispatcher signal name # Dispatcher signal name
self.signal_name = f"{SIGNAL_NAME_PREFIX}_{self.unique_id}" self.signal_name = f"{SIGNAL_NAME_PREFIX}_{self.unique_id}"
@ -170,18 +178,18 @@ class MinecraftServer:
status_response = await self._server.async_status() status_response = await self._server.async_status()
# Got answer to request, update properties. # Got answer to request, update properties.
self.version = status_response.version.name self.data.version = status_response.version.name
self.protocol_version = status_response.version.protocol self.data.protocol_version = status_response.version.protocol
self.players_online = status_response.players.online self.data.players_online = status_response.players.online
self.players_max = status_response.players.max self.data.players_max = status_response.players.max
self.latency = status_response.latency self.data.latency = status_response.latency
self.motd = status_response.motd.to_plain() self.data.motd = status_response.motd.to_plain()
self.players_list = [] self.data.players_list = []
if status_response.players.sample is not None: if status_response.players.sample is not None:
for player in status_response.players.sample: for player in status_response.players.sample:
self.players_list.append(player.name) self.data.players_list.append(player.name)
self.players_list.sort() self.data.players_list.sort()
# Inform user once about successful update if necessary. # Inform user once about successful update if necessary.
if self._last_status_request_failed: if self._last_status_request_failed:
@ -193,13 +201,13 @@ class MinecraftServer:
self._last_status_request_failed = False self._last_status_request_failed = False
except OSError as error: except OSError as error:
# No answer to request, set all properties to unknown. # No answer to request, set all properties to unknown.
self.version = None self.data.version = None
self.protocol_version = None self.data.protocol_version = None
self.players_online = None self.data.players_online = None
self.players_max = None self.data.players_max = None
self.latency = None self.data.latency = None
self.players_list = None self.data.players_list = None
self.motd = None self.data.motd = None
# Inform user once about failed update if necessary. # Inform user once about failed update if necessary.
if not self._last_status_request_failed: if not self._last_status_request_failed:

View File

@ -29,9 +29,9 @@ class MinecraftServerEntity(Entity):
self._attr_device_info = DeviceInfo( self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, self._server.unique_id)}, identifiers={(DOMAIN, self._server.unique_id)},
manufacturer=MANUFACTURER, manufacturer=MANUFACTURER,
model=f"Minecraft Server ({self._server.version})", model=f"Minecraft Server ({self._server.data.version})",
name=self._server.name, 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._attr_device_class = device_class
self._extra_state_attributes = None self._extra_state_attributes = None

View File

@ -89,7 +89,7 @@ class MinecraftServerVersionSensor(MinecraftServerSensorEntity):
async def async_update(self) -> None: async def async_update(self) -> None:
"""Update version.""" """Update version."""
self._attr_native_value = self._server.version self._attr_native_value = self._server.data.version
class MinecraftServerProtocolVersionSensor(MinecraftServerSensorEntity): class MinecraftServerProtocolVersionSensor(MinecraftServerSensorEntity):
@ -107,7 +107,7 @@ class MinecraftServerProtocolVersionSensor(MinecraftServerSensorEntity):
async def async_update(self) -> None: async def async_update(self) -> None:
"""Update protocol version.""" """Update protocol version."""
self._attr_native_value = self._server.protocol_version self._attr_native_value = self._server.data.protocol_version
class MinecraftServerLatencySensor(MinecraftServerSensorEntity): class MinecraftServerLatencySensor(MinecraftServerSensorEntity):
@ -126,7 +126,7 @@ class MinecraftServerLatencySensor(MinecraftServerSensorEntity):
async def async_update(self) -> None: async def async_update(self) -> None:
"""Update latency.""" """Update latency."""
self._attr_native_value = self._server.latency self._attr_native_value = self._server.data.latency
class MinecraftServerPlayersOnlineSensor(MinecraftServerSensorEntity): class MinecraftServerPlayersOnlineSensor(MinecraftServerSensorEntity):
@ -145,13 +145,13 @@ class MinecraftServerPlayersOnlineSensor(MinecraftServerSensorEntity):
async def async_update(self) -> None: async def async_update(self) -> None:
"""Update online players state and device state attributes.""" """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 = {} 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: 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 self._attr_extra_state_attributes = extra_state_attributes
@ -172,7 +172,7 @@ class MinecraftServerPlayersMaxSensor(MinecraftServerSensorEntity):
async def async_update(self) -> None: async def async_update(self) -> None:
"""Update maximum number of players.""" """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): class MinecraftServerMOTDSensor(MinecraftServerSensorEntity):
@ -190,4 +190,4 @@ class MinecraftServerMOTDSensor(MinecraftServerSensorEntity):
async def async_update(self) -> None: async def async_update(self) -> None:
"""Update MOTD.""" """Update MOTD."""
self._attr_native_value = self._server.motd self._attr_native_value = self._server.data.motd