mirror of
https://github.com/home-assistant/core.git
synced 2025-07-15 09:17:10 +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 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:
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user