mirror of
https://github.com/home-assistant/core.git
synced 2025-07-18 02:37:08 +00:00
Add dataclass for Minecraft Server data (#98297)
* Add dataclass for Minecraft server data * Sort dataclass variables
This commit is contained in:
parent
4780ea6a5b
commit
836b2de86f
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user