2
2
from __future__ import annotations
3
3
4
4
from collections .abc import Mapping
5
+ from dataclasses import dataclass
5
6
from datetime import datetime , timedelta
6
7
import logging
7
8
from typing import Any
@@ -62,6 +63,19 @@ async def async_unload_entry(hass: HomeAssistant, config_entry: ConfigEntry) ->
62
63
return unload_ok
63
64
64
65
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
+
65
79
class MinecraftServer :
66
80
"""Representation of a Minecraft server."""
67
81
@@ -84,13 +98,7 @@ def __init__(
84
98
self ._server = JavaServer (self .host , self .port )
85
99
86
100
# 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 ()
94
102
95
103
# Dispatcher signal name
96
104
self .signal_name = f"{ SIGNAL_NAME_PREFIX } _{ self .unique_id } "
@@ -170,18 +178,18 @@ async def _async_status_request(self) -> None:
170
178
status_response = await self ._server .async_status ()
171
179
172
180
# 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 = []
181
189
if status_response .players .sample is not None :
182
190
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 ()
185
193
186
194
# Inform user once about successful update if necessary.
187
195
if self ._last_status_request_failed :
@@ -193,13 +201,13 @@ async def _async_status_request(self) -> None:
193
201
self ._last_status_request_failed = False
194
202
except OSError as error :
195
203
# 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
203
211
204
212
# Inform user once about failed update if necessary.
205
213
if not self ._last_status_request_failed :
0 commit comments