@@ -449,15 +449,24 @@ def _handle_ready(self) -> None:
449449 self ._ready .set ()
450450
451451 def _handle_connect (self ) -> None :
452- state = self ._connection
452+ if self .ws ._has_sent_presence :
453+ _log .debug ('Skipping initial presence as one has already been sent.' )
454+ return
455+
453456 activities = self .initial_activities
454457 status = self .initial_status
455- if status or activities :
458+ afk = self .initial_afk
459+ since = self .initial_idle_since
460+ if status or activities or afk or since :
456461 if status is None :
457- status = getattr (state .settings , 'status' , None ) or Status .unknown
458- _log .debug ('Setting initial presence to %s %s' , status , activities )
462+ status = getattr (self ._connection .settings , 'status' , None ) or Status .unknown
463+ _log .debug (
464+ 'Setting initial presence to (status=%s, activities=%s, afk=%s, since=%s)' , status , activities , afk , since
465+ )
459466 self .loop .create_task (
460- self .change_presence (activities = activities , status = status , edit_settings = self ._sync_presences )
467+ self .change_presence (
468+ activities = activities , status = status , afk = afk , idle_since = since , edit_settings = self ._sync_presences
469+ )
461470 )
462471
463472 @property
@@ -1024,7 +1033,7 @@ async def connect(self, *, reconnect: bool = True) -> None:
10241033 except ReconnectWebSocket as e :
10251034 _log .debug ('Got a request to %s the websocket.' , e .op )
10261035 self .dispatch ('disconnect' )
1027- ws_params .update (sequence = self .ws .sequence , resume = e .resume , session = self .ws .session_id )
1036+ ws_params .update (sequence = self .ws .sequence , resume = e .resume , session = self .ws .session_id , old_ws = self . ws )
10281037 if e .resume :
10291038 ws_params ['gateway' ] = self .ws .gateway
10301039 continue
@@ -1056,6 +1065,7 @@ async def connect(self, *, reconnect: bool = True) -> None:
10561065 initial = False ,
10571066 resume = True ,
10581067 session = self .ws .session_id ,
1068+ old_ws = self .ws ,
10591069 )
10601070 continue
10611071
@@ -1079,6 +1089,7 @@ async def connect(self, *, reconnect: bool = True) -> None:
10791089 gateway = self .ws .gateway ,
10801090 resume = True ,
10811091 session = self .ws .session_id ,
1092+ old_ws = self .ws ,
10821093 )
10831094
10841095 async def close (self ) -> None :
@@ -1305,6 +1316,34 @@ def initial_status(self, value: Status):
13051316 else :
13061317 raise TypeError ('status must derive from Status' )
13071318
1319+ @property
1320+ def initial_afk (self ) -> bool :
1321+ """:class:`bool`: Whether the client is set to AFK upon logging in.
1322+
1323+ .. versionadded:: 2.2
1324+ """
1325+ return self ._connection ._afk
1326+
1327+ @initial_afk .setter
1328+ def initial_afk (self , value : bool ):
1329+ self ._connection ._afk = bool (value )
1330+
1331+ @property
1332+ def initial_idle_since (self ) -> Optional [datetime ]:
1333+ """Optional[:class:`datetime.datetime`]: When the client is set to go idle upon logging in.
1334+
1335+ .. versionadded:: 2.2
1336+ """
1337+ idle_since = self ._connection ._idle_since
1338+ if idle_since is not None :
1339+ return utils .parse_timestamp (idle_since )
1340+
1341+ @initial_idle_since .setter
1342+ def initial_idle_since (self , value : Optional [datetime ]):
1343+ if value is not None and not isinstance (value , datetime ):
1344+ raise TypeError ('idle_since must be a datetime.datetime or None' )
1345+ self ._connection ._idle_since = int (value .timestamp () * 1000 ) if value else 0
1346+
13081347 @property
13091348 def status (self ) -> Status :
13101349 """:class:`.Status`: The user's overall status.
@@ -1835,7 +1874,7 @@ async def change_presence(
18351874
18361875 .. code-block:: python3
18371876
1838- game = discord.Game( "with the API")
1877+ game = discord.Activity(name= "with the API")
18391878 await client.change_presence(status=discord.Status.idle, activity=game)
18401879
18411880 Parameters
0 commit comments