Skip to content

Commit f0c60d7

Browse files
committed
Improve timestamp parsing
1 parent 684835e commit f0c60d7

File tree

7 files changed

+29
-14
lines changed

7 files changed

+29
-14
lines changed

src/spectrum/client.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,8 @@ async def subscribe_to_all(self, max_threads=50):
241241
await self.subscribe_to_topic(*thread_keys, scope='content')
242242

243243
async def subscribe_to_default(self):
244-
"""Subscribe to the default set of topics, including the public SC community and all direct messages and group messages."""
244+
"""Subscribe to the default set of topics, including the public SC community and all direct messages and
245+
group messages."""
245246
keys = []
246247
for lobby in self.group_messages or []:
247248
keys.append(lobby.subscription_key)
@@ -260,3 +261,7 @@ def _replace_lobby(self, payload: dict):
260261
lobby = super()._replace_lobby(payload)
261262
asyncio.ensure_future(lobby.fetch_presence())
262263
return lobby
264+
265+
def close(self):
266+
"""End the run task"""
267+
self._gateway.close()

src/spectrum/gateway.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,3 +125,6 @@ async def received_message(self, data):
125125
if isinstance(payload, dict):
126126
log.debug('Received %s', payload)
127127
await self._client._dispatch_event(payload['type'], payload)
128+
129+
def close(self):
130+
self._running = False

src/spectrum/models/activity.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import dataclasses
22
from datetime import datetime
33

4+
from spectrum.util.datetime import parse_timestamp
5+
46

57
@dataclasses.dataclass
68
class Activity:
@@ -12,4 +14,4 @@ class Activity:
1214
def __post_init__(self):
1315
self.member_id = self.member_id or int(self.member['id'])
1416
self.highlight_role_id = int(self.highlight_role_id) if self.highlight_role_id else None
15-
self.time_created = datetime.utcfromtimestamp(self.time_created)
17+
self.time_created = parse_timestamp(self.time_created)

src/spectrum/models/lobby.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
from datetime import datetime
2-
31
from . import message, abc
42
from .. import httpclient
3+
from ..util.datetime import parse_timestamp
54
from ..util.entity_ranges import get_entity_ranges
65

76

@@ -55,7 +54,7 @@ def __init__(self, client: 'httpclient.HTTPClient', payload: dict):
5554
self.description = payload['description']
5655
self.color = payload['color']
5756
self.icon = payload['icon']
58-
self.time_created = datetime.utcfromtimestamp(payload['time_created'])
57+
self.time_created = parse_timestamp(payload['time_created'])
5958
self.subscription_key = payload['subscription_key']
6059
self.leader_id = int(payload['leader_id']) if payload['leader_id'] else None
6160
self.online_members_count = payload.get('online_members_count')
@@ -88,7 +87,6 @@ async def send(self, content: str, add_links=True):
8887
if add_links:
8988
entity_ranges = get_entity_ranges(content)
9089

91-
9290
payload = await self._client._http.send_message({
9391
"lobby_id": self.id,
9492
"content_state": {"blocks": [

src/spectrum/models/reply.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
from datetime import datetime
2-
31
from . import abc
4-
from .. import httpclient
52
from .content import ContentBlock
3+
from .. import httpclient
4+
from ..util.datetime import parse_timestamp
65

76

87
class Reply(abc.Identifier):
@@ -95,8 +94,8 @@ def __init__(self, client: 'httpclient.HTTPClient', payload: dict):
9594
self._client = client
9695
self.id = int(payload["id"])
9796
self.thread_id = int(payload["thread_id"])
98-
self.time_created = datetime.utcfromtimestamp(payload["time_created"])
99-
self.time_modified = datetime.utcfromtimestamp(payload["time_modified"]) if payload["time_modified"] else None
97+
self.time_created = parse_timestamp(payload["time_created"])
98+
self.time_modified = parse_timestamp(payload["time_modified"])
10099
self.content_blocks = [ContentBlock(**block) for block in payload["content_blocks"]]
101100
self.is_erased = payload["is_erased"]
102101
self.erased_by = payload["erased_by"]

src/spectrum/models/thread.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import dataclasses
2-
from datetime import datetime
32
from typing import Optional
43

54
from . import abc
65
from .activity import Activity
76
from .content import ContentBlock
87
from .. import httpclient
8+
from ..util.datetime import parse_timestamp
99

1010

1111
@dataclasses.dataclass
@@ -339,8 +339,8 @@ class Thread(abc.Identifier, abc.Subscription):
339339
def __init__(self, client: 'httpclient.HTTPClient', payload: dict):
340340
self._client = client
341341
self.id = int(payload["id"])
342-
self.time_created = datetime.utcfromtimestamp(payload["time_created"])
343-
self.time_modified = datetime.utcfromtimestamp(payload["time_modified"]) if payload["time_modified"] else None
342+
self.time_created = parse_timestamp(payload["time_created"])
343+
self.time_modified = parse_timestamp(payload["time_modified"])
344344

345345
self.channel_id = int(payload["channel_id"])
346346
self.community_id = int(payload["community_id"])

src/spectrum/util/datetime.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from datetime import datetime, UTC
2+
3+
4+
def parse_timestamp(s):
5+
try:
6+
return datetime.fromtimestamp(s, UTC) if s else None
7+
except OSError:
8+
return None

0 commit comments

Comments
 (0)