Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 23 additions & 8 deletions interactions/api/gateway/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,8 @@ async def run(self) -> None:
_receive.cancel()
return

await self._handle_stream(msg)
if msg is not None: # this can happen
await self._handle_stream(msg)

async def _handle_stream(self, stream: Dict[str, Any]):
"""
Expand Down Expand Up @@ -710,6 +711,13 @@ async def _reconnect(self, to_resume: bool, code: Optional[int] = 1012) -> None:

self._client = None

# We need to check about existing heartbeater tasks for edge cases.

if self._task:
self._task.cancel()
if self.__heartbeat_event.is_set():
self.__heartbeat_event.clear() # Because we're hardresetting the process

if not to_resume:
url = self.ws_url if self.ws_url else await self._http.get_gateway()
else:
Expand All @@ -721,12 +729,7 @@ async def _reconnect(self, to_resume: bool, code: Optional[int] = 1012) -> None:

self.__heartbeater.delay = data["d"]["heartbeat_interval"]

if self._task:
self._task.cancel()
if self.__heartbeat_event.is_set():
self.__heartbeat_event.clear() # Because we're hardresetting the process

self._task = create_task(self.run_heartbeat())
self._task = create_task(self.run_heartbeat())

if not to_resume:
await self.__identify(self.__shard, self.__presence)
Expand Down Expand Up @@ -800,7 +803,19 @@ async def __receive_packet(self, ignore_lock: bool = False) -> Optional[Dict[str
if packet.data is None:
continue # We just loop it over because it could just be processing something.

return loads(packet.data) if isinstance(packet.data, str) else None
try:
msg = loads(packet.data)
except Exception as e:
import traceback

log.debug(
f'Error serialising message: {"".join(traceback.format_exception(type(e), e, e.__traceback__))}.'
)
# There's an edge case when the packet's None... or some other deserialisation error.
# Instead of raising an exception, we just log it to debug, so it doesn't annoy end user's console logs.
msg = None

return msg

async def _send_packet(self, data: Dict[str, Any]) -> None:
"""
Expand Down