Skip to content

Commit 836b2de

Browse files
authored
Add dataclass for Minecraft Server data (home-assistant#98297)
* Add dataclass for Minecraft server data * Sort dataclass variables
1 parent 4780ea6 commit 836b2de

File tree

3 files changed

+42
-34
lines changed

3 files changed

+42
-34
lines changed

homeassistant/components/minecraft_server/__init__.py

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from __future__ import annotations
33

44
from collections.abc import Mapping
5+
from dataclasses import dataclass
56
from datetime import datetime, timedelta
67
import logging
78
from typing import Any
@@ -62,6 +63,19 @@ async def async_unload_entry(hass: HomeAssistant, config_entry: ConfigEntry) ->
6263
return unload_ok
6364

6465

66+
@dataclass
67+
class MinecraftServerData:
68+
"""Representation of Minecraft server data."""
69+
70+
latency: float | None = None
71+
motd: str | None = None
72+
players_max: int | None = None
73+
players_online: int | None = None
74+
players_list: list[str] | None = None
75+
protocol_version: int | None = None
76+
version: str | None = None
77+
78+
6579
class MinecraftServer:
6680
"""Representation of a Minecraft server."""
6781

@@ -84,13 +98,7 @@ def __init__(
8498
self._server = JavaServer(self.host, self.port)
8599

86100
# Data provided by 3rd party library
87-
self.version: str | None = None
88-
self.protocol_version: int | None = None
89-
self.latency: float | None = None
90-
self.players_online: int | None = None
91-
self.players_max: int | None = None
92-
self.players_list: list[str] | None = None
93-
self.motd: str | None = None
101+
self.data: MinecraftServerData = MinecraftServerData()
94102

95103
# Dispatcher signal name
96104
self.signal_name = f"{SIGNAL_NAME_PREFIX}_{self.unique_id}"
@@ -170,18 +178,18 @@ async def _async_status_request(self) -> None:
170178
status_response = await self._server.async_status()
171179

172180
# Got answer to request, update properties.
173-
self.version = status_response.version.name
174-
self.protocol_version = status_response.version.protocol
175-
self.players_online = status_response.players.online
176-
self.players_max = status_response.players.max
177-
self.latency = status_response.latency
178-
self.motd = status_response.motd.to_plain()
179-
180-
self.players_list = []
181+
self.data.version = status_response.version.name
182+
self.data.protocol_version = status_response.version.protocol
183+
self.data.players_online = status_response.players.online
184+
self.data.players_max = status_response.players.max
185+
self.data.latency = status_response.latency
186+
self.data.motd = status_response.motd.to_plain()
187+
188+
self.data.players_list = []
181189
if status_response.players.sample is not None:
182190
for player in status_response.players.sample:
183-
self.players_list.append(player.name)
184-
self.players_list.sort()
191+
self.data.players_list.append(player.name)
192+
self.data.players_list.sort()
185193

186194
# Inform user once about successful update if necessary.
187195
if self._last_status_request_failed:
@@ -193,13 +201,13 @@ async def _async_status_request(self) -> None:
193201
self._last_status_request_failed = False
194202
except OSError as error:
195203
# No answer to request, set all properties to unknown.
196-
self.version = None
197-
self.protocol_version = None
198-
self.players_online = None
199-
self.players_max = None
200-
self.latency = None
201-
self.players_list = None
202-
self.motd = None
204+
self.data.version = None
205+
self.data.protocol_version = None
206+
self.data.players_online = None
207+
self.data.players_max = None
208+
self.data.latency = None
209+
self.data.players_list = None
210+
self.data.motd = None
203211

204212
# Inform user once about failed update if necessary.
205213
if not self._last_status_request_failed:

homeassistant/components/minecraft_server/entity.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ def __init__(
2929
self._attr_device_info = DeviceInfo(
3030
identifiers={(DOMAIN, self._server.unique_id)},
3131
manufacturer=MANUFACTURER,
32-
model=f"Minecraft Server ({self._server.version})",
32+
model=f"Minecraft Server ({self._server.data.version})",
3333
name=self._server.name,
34-
sw_version=str(self._server.protocol_version),
34+
sw_version=f"{self._server.data.protocol_version}",
3535
)
3636
self._attr_device_class = device_class
3737
self._extra_state_attributes = None

homeassistant/components/minecraft_server/sensor.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def __init__(self, server: MinecraftServer) -> None:
8989

9090
async def async_update(self) -> None:
9191
"""Update version."""
92-
self._attr_native_value = self._server.version
92+
self._attr_native_value = self._server.data.version
9393

9494

9595
class MinecraftServerProtocolVersionSensor(MinecraftServerSensorEntity):
@@ -107,7 +107,7 @@ def __init__(self, server: MinecraftServer) -> None:
107107

108108
async def async_update(self) -> None:
109109
"""Update protocol version."""
110-
self._attr_native_value = self._server.protocol_version
110+
self._attr_native_value = self._server.data.protocol_version
111111

112112

113113
class MinecraftServerLatencySensor(MinecraftServerSensorEntity):
@@ -126,7 +126,7 @@ def __init__(self, server: MinecraftServer) -> None:
126126

127127
async def async_update(self) -> None:
128128
"""Update latency."""
129-
self._attr_native_value = self._server.latency
129+
self._attr_native_value = self._server.data.latency
130130

131131

132132
class MinecraftServerPlayersOnlineSensor(MinecraftServerSensorEntity):
@@ -145,13 +145,13 @@ def __init__(self, server: MinecraftServer) -> None:
145145

146146
async def async_update(self) -> None:
147147
"""Update online players state and device state attributes."""
148-
self._attr_native_value = self._server.players_online
148+
self._attr_native_value = self._server.data.players_online
149149

150150
extra_state_attributes = {}
151-
players_list = self._server.players_list
151+
players_list = self._server.data.players_list
152152

153153
if players_list is not None and len(players_list) != 0:
154-
extra_state_attributes[ATTR_PLAYERS_LIST] = self._server.players_list
154+
extra_state_attributes[ATTR_PLAYERS_LIST] = players_list
155155

156156
self._attr_extra_state_attributes = extra_state_attributes
157157

@@ -172,7 +172,7 @@ def __init__(self, server: MinecraftServer) -> None:
172172

173173
async def async_update(self) -> None:
174174
"""Update maximum number of players."""
175-
self._attr_native_value = self._server.players_max
175+
self._attr_native_value = self._server.data.players_max
176176

177177

178178
class MinecraftServerMOTDSensor(MinecraftServerSensorEntity):
@@ -190,4 +190,4 @@ def __init__(self, server: MinecraftServer) -> None:
190190

191191
async def async_update(self) -> None:
192192
"""Update MOTD."""
193-
self._attr_native_value = self._server.motd
193+
self._attr_native_value = self._server.data.motd

0 commit comments

Comments
 (0)