Fixed Node Reconnection Functionality
This commit is contained in:
@@ -210,29 +210,44 @@ class Node:
|
|||||||
await player.on_voice_state_update(data["d"])
|
await player.on_voice_state_update(data["d"])
|
||||||
except KeyError:
|
except KeyError:
|
||||||
return
|
return
|
||||||
|
|
||||||
async def _listen(self) -> None:
|
async def _listen(self) -> None:
|
||||||
backoff = ExponentialBackoff(base=7)
|
backoff = ExponentialBackoff(base=7)
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
msg = await self._websocket.receive()
|
msg = await self._websocket.receive()
|
||||||
except:
|
|
||||||
break
|
|
||||||
if msg.type == aiohttp.WSMsgType.CLOSED:
|
|
||||||
self._available = False
|
|
||||||
|
|
||||||
retry = backoff.delay()
|
if msg.type == aiohttp.WSMsgType.CLOSED:
|
||||||
self._logger.info(f"Trying to reconnect node [{self._identifier}] with {round(retry)}s")
|
self._available = False
|
||||||
await asyncio.sleep(retry)
|
self._logger.warning(f"WebSocket closed for node [{self._identifier}]")
|
||||||
if not self.is_connected:
|
break
|
||||||
try:
|
|
||||||
await self.connect()
|
elif msg.type == aiohttp.WSMsgType.ERROR:
|
||||||
except:
|
self._logger.error(f"WebSocket error for node [{self._identifier}]")
|
||||||
pass
|
break
|
||||||
else:
|
|
||||||
self._bot.loop.create_task(self._handle_payload(msg.json()))
|
self._bot.loop.create_task(self._handle_payload(msg.json()))
|
||||||
|
|
||||||
|
except aiohttp.ClientConnectionError as e:
|
||||||
|
self._logger.error(f"Connection error: {e}")
|
||||||
|
self._available = False
|
||||||
|
break
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
self._logger.exception(f"Unexpected error: {e}")
|
||||||
|
self._available = False
|
||||||
|
break
|
||||||
|
|
||||||
|
while not self._available:
|
||||||
|
retry = backoff.delay()
|
||||||
|
self._logger.info(f"Trying to reconnect node [{self._identifier}] in {round(retry)}s")
|
||||||
|
await asyncio.sleep(retry)
|
||||||
|
try:
|
||||||
|
await self.connect()
|
||||||
|
except Exception as e:
|
||||||
|
self._logger.error(f"Reconnection failed: {e}")
|
||||||
|
|
||||||
async def _handle_payload(self, data: dict) -> None:
|
async def _handle_payload(self, data: dict) -> None:
|
||||||
op = data.get("op", None)
|
op = data.get("op", None)
|
||||||
if not op:
|
if not op:
|
||||||
@@ -323,6 +338,7 @@ class Node:
|
|||||||
async def reconnect(self) -> None:
|
async def reconnect(self) -> None:
|
||||||
await asyncio.sleep(10)
|
await asyncio.sleep(10)
|
||||||
for player in self.players.copy().values():
|
for player in self.players.copy().values():
|
||||||
|
await asyncio.sleep(3)
|
||||||
try:
|
try:
|
||||||
if player._voice_state:
|
if player._voice_state:
|
||||||
await player._dispatch_voice_update(player._voice_state)
|
await player._dispatch_voice_update(player._voice_state)
|
||||||
|
|||||||
Reference in New Issue
Block a user