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 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:

View File

@ -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

View File

@ -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