
    iB}                       U d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	m
Z
mZmZmZmZmZmZ ddlmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZ e	rVddlmZ ddlmZ ddl m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z(m)Z*m+Z+ e
eeee,ef         geeeef         f                  Z-ee.gef         Z/de0d<   	 ddl1Z1dZ2n# e3$ r dZ2Y nw xY wdZ4 ej5        e6          Z7 G d dej8                  Z9 G d de          Z: G d d          Z;dS )aL  
The MIT License (MIT)

Copyright (c) 2015-present Rapptz

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.


Some documentation to refer to:

- Our main web socket (mWS) sends opcode 4 with a guild ID and channel ID.
- The mWS receives VOICE_STATE_UPDATE and VOICE_SERVER_UPDATE.
- We pull the session_id from VOICE_STATE_UPDATE.
- We pull the token, endpoint and server_id from VOICE_SERVER_UPDATE.
- Then we initiate the voice web socket (vWS) pointing to the endpoint.
- We send opcode 0 with the user_id, server_id, session_id and token using the vWS.
- The vWS sends back opcode 2 with an ssrc, port, modes(array) and heartbeat_interval.
- We send a UDP discovery packet to endpoint:port and receive our IP and our port in LE.
- Then we send our IP and port via vWS with opcode 1.
- When that's all done, we receive opcode 4 from the vWS.
- Finally we can transmit data to endpoint:port.
    )annotationsN)TYPE_CHECKINGOptionalDictListCallable	CoroutineAnyTuple   )Enum)MISSINGsane_wait_for)ConnectionClosed)ExponentialBackoff)DiscordVoiceWebSocket)abc)Guild)
ClientUser)
VoiceState)VoiceClient)GuildVoiceStateVoiceServerUpdateSupportedModesboolhas_daveTF)VoiceConnectionStatec                  d     e Zd Zddd fd	ZddZddZddZddddZddZddZ	ddZ
 xZS )SocketReaderT)start_pausedstater   r    r   returnNonec                  t                                          ddt          |           d           || _        || _        g | _        t          j                    | _        t          j                    | _	        d| _
        d S )NTzvoice-socket-reader:z#x)daemonname)super__init__idr!   r    
_callbacks	threadingEvent_running_end_idle_paused)selfr!   r    	__class__s      T/usr/local/lib/hermes-agent/venv/lib/python3.11/site-packages/discord/voice_state.pyr(   zSocketReader.__init__W   st    +O"T((+O+O+OPPP+0
(68!))O%%	"&    callbackSocketReaderCallbackc                    | j                             |           | j        r"d| _        | j                                         d S d S NF)r*   appendr/   r-   setr0   r4   s     r2   registerzSocketReader.registera   sO    x((( 	  %DM	  	 r3   c                    	 | j                             |           | j         s;| j                                        r$d| _        | j                                         d S d S d S # t          $ r Y d S w xY w)NT)r*   remover-   is_setr/   clear
ValueErrorr:   s     r2   
unregisterzSocketReader.unregisterg   s    		&O""8,,, ? &t}';';'='= & %)!##%%%%%	& & & &  	 	 	DD	s   A" "
A0/A0c                F    d| _         | j                                         d S r7   )r/   r-   r?   r0   s    r2   pausezSocketReader.pauses   s$    !r3   F)forcerE   c                   | j                                         rd S |s| j        s	d| _        d S d| _        | j                                          d S )NTF)r-   r>   r*   r/   r9   )r0   rE   s     r2   resumezSocketReader.resumew   s]    =!! 	F 	T_ 	 $DF!r3   c                j    | j                                          | j                                         d S N)r.   r9   r-   rC   s    r2   stopzSocketReader.stop   s+    	r3   c                D   | j                                          | j                                         | j        r|                                  	 |                                  n+# t          $ r t          	                    d|            Y nw xY w| 
                                 | j                                         | j                                         d S # | 
                                 | j                                         | j                                         w xY w)NzError in %s)r.   r?   r-   r9   r    rD   _do_run	Exception_log	exceptionrJ   r*   rC   s    r2   runzSocketReader.run   s   	 	JJLLL	$LLNNNN 	0 	0 	0NN=$/////	0 IIKKKM!!!O!!##### IIKKKM!!!O!!####s+   A$ #C $%B	C BC ADc                   | j                                         sT| j                                        s| j                                         M	 t	          j        | j        j        gg g d          \  }}}nJ# t          t          t          f$ r0}t                              d|j        j        |           Y d }~d }~ww xY w|s	 | j        j                            d          }| j        D ]:}	  ||           # t           $ r t                              d||            Y 7w xY wn-# t          $ r  t                              d| d           Y nw xY w| j                                         Rd S d S )N   zMSelect error handling socket in reader, this should be safe to ignore: %s: %si   zError calling %s in %sz>Error reading from socket in %s, this should be safe to ignoreTexc_info)r.   r>   r-   waitselectr!   socketr@   	TypeErrorOSErrorrN   debugr1   __name__recvr*   rM   rO   )r0   readable_edatacbs         r2   rL   zSocketReader._do_run   s   )""$$ 	K='')) ""$$$!'
0A/BBB!O!O!QQ	73   

cefepey{|     	Kz(--d33 / K KBK4$ K K K'?TJJJJJKK  r r r

[]alp
qqqqqr) )""$$ 	K 	K 	K 	K 	Ks<   &A6 6B=&B88B=D& -C99&D"!D"&'EE)r!   r   r    r   r"   r#   r4   r5   r"   r#   r"   r#   )rE   r   r"   r#   )r[   
__module____qualname__r(   r;   rA   rD   rG   rJ   rP   rL   __classcell__)r1   s   @r2   r   r   V   s        LP ' ' ' ' ' ' ' '       
& 
& 
& 
&    ', 	 	 	 	 	 	   $ $ $ $K K K K K K K Kr3   r   c                  6    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdS )ConnectionFlowStatez.Enum representing voice connection flow state.r   r                        N)r[   rd   re   __doc__disconnectedset_guild_voice_stategot_voice_state_updategot_voice_server_updategot_both_voice_updateswebsocket_connectedgot_websocket_readygot_ip_discovery	connected r3   r2   rh   rh      sJ        88  LIIIr3   rh   c                     e Zd ZdZddd[d
Zed\d            Zej        d]d            Zed^d            Zed_d            Z	ed`d            Z
edad            Zedbd            Zedcd            ZdddZdedZdedZdfd!Zdgd#Zd$d%dhd-Zdid0Zdjd1Zdkd2Zd$d$d3d4dld7Zej        d8dmd:Zdnd>Zdodpd?Zdodqd@ZdcdAZdrdDZdsdGZ dsdHZ!dcdIZ"ddJdtdLZ#d3d3dMdudNZ$dddOZ%dvdQZ&dddRZ'dddSZ(dwdTZ)dcdUZ*dxdWZ+dydZZ,dS )zr   z4Represents the internal state of a voice connection.N)hookvoice_clientr   r|   Optional[WebsocketHook]r"   r#   c                  || _         || _        d| _        d| _        d| _        d| _        d | _        d | _        d | _        d | _	        d | _
        d | _        d | _        d | _        t          | _        t          | _        t          | _        t          | _        t          | _        d | _        d| _        i | _        d| _        t0          j        | _        d| _        t9          j                    | _        t?          j                    | _         t?          j                    | _!        d | _"        d | _#        tI          |           | _%        | j%        &                                 d S )Ng      >@TFr   )'r}   r|   timeout	reconnect	self_deaf	self_mutetoken
session_idendpointendpoint_ip	server_idipport
voice_portr   
secret_keyssrcmoderW   wsdave_sessiondave_protocol_versiondave_pending_transitionsdave_downgradedrh   rq   _state_expecting_disconnectr+   r,   
_connectedasyncio_state_event_disconnected_runner
_connectorr   _socket_readerstart)r0   r}   r|   s      r2   r(   zVoiceConnectionState.__init__   s   (	"#$$$(
)-'+*.(,!%#'	)-%, 	$+	%,)09=*+"8:%%*+>+K+0"#/++#MOO$]__/326*400!!#####r3   rh   c                    | j         S rI   )r   rC   s    r2   r!   zVoiceConnectionState.state   s
    {r3   r!   c                N   || j         ur t                              d|j                   || _         | j                                         | j                                         |t          j        u r| j	                                         d S | j	                                         d S )NzConnection state changed to %s)
r   rN   rZ   r&   r   r9   r?   rh   ry   r   )r0   r!   s     r2   r!   zVoiceConnectionState.state   s    ##JJ7DDD!!!'111O!!!!!O!!#####r3   r   c                    | j         j        S rI   )r}   guildrC   s    r2   r   zVoiceConnectionState.guild   s     &&r3   r   c                    | j         j        S rI   )r}   userrC   s    r2   r   zVoiceConnectionState.user   s     %%r3   Tuple[SupportedModes, ...]c                    | j         j        S rI   )r}   supported_modesrC   s    r2   r   z$VoiceConnectionState.supported_modes  s     00r3   Optional[VoiceState]c                $    | j         j        j        S rI   )r   mevoicerC   s    r2   self_voice_statez%VoiceConnectionState.self_voice_state  s    z}""r3   intc                ,    t           rt          j        ndS Nr   )r   daveyDAVE_PROTOCOL_VERSIONrC   s    r2   max_dave_protocol_versionz.VoiceConnectionState.max_dave_protocol_version  s    .6=u**A=r3   r   c                F    | j         dk    o| j        d k    o| j        j        S r   )r   r   readyrC   s    r2   can_encryptz VoiceConnectionState.can_encrypt  s)    )Q.h43D3LhQUQbQhhr3   c                V  K   | j         dk    rt          st          d          | j        ;| j                            | j         | j        j        | j        j        j                   n9t          j
        | j         | j        j        | j        j        j                  | _        | j        G| j        j                            t          j        | j                                                   d {V  n;| j        r4| j                                         | j                            dd           d S )Nr   z/davey library needed in order to use E2EE voiceT
   )r   r   RuntimeErrorr   reinitr   r)   r}   channelr   DaveSessionr   send_binaryr   MLS_KEY_PACKAGEget_serialized_key_packageresetset_passthrough_moderC   s    r2   reinit_dave_sessionz(VoiceConnectionState.reinit_dave_session  s,     %)) V"#TUUU ,!(()CTY\SWSdSlSopppp$)$5d6PRVR[R^`d`q`y`|$}$}! ,'*66)94;L;g;g;i;i          	=##%%%224<<<r3   transition_idc                   K   t           j        d|id}| j        j                            |           d {V  |                                  d {V  d S )Nr   )opd)r   MLS_INVALID_COMMIT_WELCOMEr}   r   send_as_jsonr   )r0   r   payloads      r2   _recover_from_invalid_commitz1VoiceConnectionState._recover_from_invalid_commit%  sz      'B
 
 "//888888888&&(((((((((((r3   c                  K   t                               d|           || j        vrt                               d|           d S | j        }| j                            |          | _        || j        k    r-| j        dk    r"d| _        t                               d           nP|dk    rJ| j        rCd| _        | j        r| j                            dd           t                               d           t                               d	|           d S )
NzExecuting transition id %dzMReceived execute transition, but we don't have a pending transition for id %dr   TzDAVE Session downgradedFr   zDAVE Session upgradedzTransition id %d executed)	rN   rZ   r   warningr   popr   r   r   )r0   r   old_versions      r2   _execute_transitionz(VoiceConnectionState._execute_transition0  s     

/??? ===LLhjwxxxF0%)%B%F%F}%U%U"$4449SWX9X9X#'D JJ01111Q4#7#(D   A!66tR@@@JJ./// 	

.>>>>>r3   r`   GuildVoiceStatePayloadc                $  K   |d         }|^| j                                          | j        rd| _        n4t                              d           |                                  d {V  d S t          |          }|d         | _        | j        t          j
        t          j        fv rb| j        t          j
        u r<t          j        | _        || j        j        j        k    r|                     |           nt          j        | _        d S | j        t          j        u r|                     |           d S | j        t          j        ur|| j        j        j        k    rt                              d           |                     |           |                     t          j                   d {V  |                     | j        | j        | j        p| j        | j        p| j        dd           d {V  d S t                              d           d S d S )	N
channel_idFz+We were externally disconnected from voice.r   z)Handling channel move while connecting...
with_stater   r   r   r   rG   rU   z,Ignoring unexpected voice_state_update event)r   r9   r   rN   rZ   
disconnectr   r   r!   rh   rr   rt   rs   r}   r   r)   _update_voice_channelru   ry   rq   infosoft_disconnectconnectr   r   r   r   r   )r0   r`   r   s      r2   voice_state_updatez'VoiceConnectionState.voice_state_updateE  s>     ,'
""$$$ ) (-2**

HIIIoo'''''''''F__
|, :-CEXEpqqqz0FFF0G
 !2!:!===..z::: 1G
F:,666&&z22222Z2???T.6999		EFFF**:666**6I6`*aaaaaaaaall"n L#4<G#4<G  #            

IJJJJJ! @?r3   VoiceServerUpdatePayloadc                  K   | j         }| j        }| j        }|d         | _         t          |d                   | _        |                    d          }| j         |t
                              d           d S || _        | j                            d          r| j        dd          | _        | j        t          j
        t          j        fv rYt          | _        |                                  | j        t          j
        u rt          j        | _        d S t          j        | _        d S | j        t          j        u rMt
                              d           | j                            d           d {V  t          j        | _        d S | j        t          j        ur|| j         k    r|| j        k    r|| j        k    rd S t
                              d	           |                     t          j        
           d {V  |                     | j        | j        | j        p| j        | j        p| j        dd           d {V  |                                  d S d S )Nr   guild_idr   zqAwaiting endpoint... This requires waiting. If timeout occurred considering raising the timeout and reconnecting.zwss://rm   z0Voice server update, closing old voice websocket  z4Unexpected server update event, attempting to handler   Fr   )r   r   r   r   getrN   r   
startswithr!   rh   rr   rs   r   r   _create_socketrt   ru   ry   rZ   r   closerq   r   r   r   r   r   r   r   )r0   r`   previous_tokenprevious_server_idprevious_endpointr   s         r2   voice_server_updatez(VoiceConnectionState.voice_server_updatez  sp     !^ M']
T*-..88J'':!1LLX   F =##H-- 	. M!""-DM :-CEXEoppp&D!!!z0FFF0H


0G


Z.888JJIJJJ'--%%%%%%%%%,DDJJJZ2???++0Bdn0T0TYjnrn{Y{Y{JJMNNN&&2E2]&^^^^^^^^^,,.08DC08DC           !!!!!! @?r3   TrU   r   r   floatr   r   rG   rU   c          	     ^  K   | j         r | j                                          d | _         | j        r | j                                         d | _        || _        || _        | j        j                            |                     |||||          d          | _         |r| j          d {V  d S d S )NzVoice connectorr&   )	r   cancelr   r   r   r}   loopcreate_task_wrap_connect)r0   r   r   r   r   rG   rU   s          r2   r   zVoiceConnectionState.connect  s       ? 	#O""$$$"DO< 	 L!!!DL"+0<<y'9iPPWh = 
 
  	"/!!!!!!!!!	" 	"r3   argsr
   c                  K   	  | j         |  d {V  d S # t          j        $ r6 t                              d           |                                  d {V   t          j        $ r6 t                              d           |                                  d {V   t          $ r6 t          
                    d           |                                  d {V   w xY w)NzCancelling voice connectionzTimed out connecting to voicez*Error connecting to voice... disconnecting)_connectr   CancelledErrorrN   rZ   r   TimeoutErrorr   r   rM   rO   )r0   r   s     r2   r   z"VoiceConnectionState._wrap_connect  s!     	$-&&&&&&&&&&% 	 	 	JJ4555&&(((((((((# 	 	 	II5666//######### 	 	 	NNGHHH//#########	s
    CCc                   K   t          d          D ]j}t                              d|dz              |                     ||           d {V  | j        t
          j        u rt
          j        | _        |                     t
          j	                   d {V  t                              d| j
                   	 |                     |           d {V | _        |                                  d {V   d S # t          $ rz |r\d|dz  z   }t                              d|           |                     d	           d {V  t#          j        |           d {V  Y M|                                  d {V   w xY wd S )
Nrl   z3Starting voice handshake... (connection attempt %d)r   r   r   z,Voice handshake complete. Endpoint found: %sg       @z0Failed to connect to voice... Retrying in %ss...Fcleanup)rangerN   r   _voice_connectr!   rh   rq   rr   _wait_for_stateru   r   _connect_websocketr   _handshake_websocketr   rO   r   r   sleep)r0   r   r   r   rG   irU   s          r2   _inner_connectz#VoiceConnectionState._inner_connect  s     q 	 	AIIKQQRUSSS%%	Y%OOOOOOOOOz0===0F
&&':'QRRRRRRRRRIIDdmTTT $ 7 7 ? ???????//111111111# 	 	 	 q3w;DNN#UW[\\\//%/888888888!----------H//+++++++++	!	 	s   ::C77A%E;E;c                \  K   t                               d           t          j        |                     ||||          |           d {V  t                               d           | j        s;| j        j                            | 	                    |          d          | _        d S d S )NzConnecting to voice...)r   r   r   rG   r   zVoice connection complete.zVoice websocket pollerr   )
rN   r   r   wait_forr   r   r}   r   r   _poll_voice_ws)r0   r   r   r   r   rG   s         r2   r   zVoiceConnectionState._connect  s      		*+++)yT]flmm
 
 
 	
 	
 	
 	
 	
 	
 	
 			.///| 	},1==d>Q>QR[>\>\c{=||DLLL	} 	}r3   F)rE   r   rU   rE   r   c                 K   |s|                                  sd S 	 |                                  d {V  | j        r| j                                         d {V  n,# t          $ r t
                              dd           Y nw xY wt          j        | _	        | j
                                         |r2| j
                                         | j                                         | j                                         | j                                         | j        r| j                                         t$          | _        t$          | _        |r|                                 st	 t-          j        | j                                        | j                   d {V  n:# t6          $ r t
                              d           Y nt,          j        $ r Y nw xY w|r| j                                         d S d S # t          j        | _	        | j
                                         |r2| j
                                         | j                                         | j                                         | j                                         | j        r| j                                         t$          | _        t$          | _        |r|                                 st	 t-          j        | j                                        | j                   d {V  n:# t6          $ r t
                              d           Y nt,          j        $ r Y nw xY w|r| j                                         w w xY w)Nz+Ignoring exception disconnecting from voiceTrS   r   z6Timed out waiting for voice disconnection confirmation)is_connected_voice_disconnectr   r   rM   rN   rZ   rh   rq   r!   r   rD   rJ   r}   r   r9   r?   rW   r   r   r   _inside_runnerr   r  r   rU   r   r   r   r   )r0   rE   r   rU   s       r2   r   zVoiceConnectionState.disconnect  s      	T..00 	F'	,((*********w &gmmoo%%%%%%% 	U 	U 	UJJDtJTTTTT	U -9DJ%%'''  )#((***!&&((( O!!!O!!###{ $!!###DGDI  
D//11 

!*4+=+B+B+D+Ddl[[[[[[[[[[[# Y Y YJJWXXXXX-   D  ,!))+++++, ,? -9DJ%%'''  )#((***!&&((( O!!!O!!###{ $!!###DGDI  
D//11 

!*4+=+B+B+D+Ddl[[[[[[[[[[[# Y Y YJJWXXXXX-   D  ,!))++++,ss   A A G: &BG: BG: (8F! !$GGG:CM*8LM*$M
7M*9M
M*	M

 M*r   r   c                 K   t                               d           | j        r | j                                         d | _        	 | j        r| j                                         d {V  n,# t          $ r t                               dd           Y nw xY w|| _        | j        	                                 | j
        r| j
                                         t          | _        t          | _        d S # || _        | j        	                                 | j
        r| j
                                         t          | _        t          | _        w xY w)NzSoft disconnecting from voicez0Ignoring exception soft disconnecting from voiceTrS   )rN   rZ   r   r   r   r   rM   r!   r   rD   rW   r   r   r   )r0   r   s     r2   r   z$VoiceConnectionState.soft_disconnect)  sR     

2333< 	 L!!!DL	 w &gmmoo%%%%%%% 	Z 	Z 	ZJJITXJYYYYY	Z $DJ%%'''{ $!!###DGDIII $DJ%%'''{ $!!###DGDIs+   &A, +C2 ,&BC2 BC2 2AEr   Optional[abc.Snowflake]Optional[float]c                  K   ||                      d           d {V  d S | j        j        r|j        | j        j        j        k    rd S | j        }|                     |           d {V  | j        }	 |                     |           d {V  d S # t          j        $ rb t          
                    d|j        | j        j                   | j        |u r*t                              d|j                   || _        Y d S Y d S w xY w)NTr   z2Timed out trying to move to channel %s in guild %szReverting to previous state %s)r   r}   r   r)   r!   _move_to
wait_asyncr   r   rN   r   r   rZ   r&   )r0   r   r   previous_state
last_states        r2   move_tozVoiceConnectionState.move_to?  s<     ?//t/,,,,,,,,,F$ 	t7H7P7S)S)SF mmG$$$$$$$$$Z
	,//'***********# 	, 	, 	,LLMwz[_[e[hiiizZ''

;^=PQQQ+



 (''	,s   5B A*DDc                6    | j                             |          S rI   )r   rU   r0   r   s     r2   rU   zVoiceConnectionState.waitW  s    ##G,,,r3   c                X   K   |                      t          j        |           d {V  d S )Nr   )r   rh   ry   r  s     r2   r  zVoiceConnectionState.wait_asyncZ  s;      ""#6#@'"RRRRRRRRRRRr3   c                (    | j         t          j        u S rI   )r!   rh   ry   rC   s    r2   r  z!VoiceConnectionState.is_connected]  s    z0:::r3   packetbytesc                :    | j                             |           d S rI   )rW   sendall)r0   r  s     r2   send_packetz VoiceConnectionState.send_packet`  s    F#####r3   r4   r5   c                p    t                               d|           | j                            |           d S )Nz'Registering socket listener callback %s)rN   rZ   r   r;   r:   s     r2   add_socket_listenerz(VoiceConnectionState.add_socket_listenerc  s4    

<hGGG$$X.....r3   c                p    t                               d|           | j                            |           d S )Nz)Unregistering socket listener callback %s)rN   rZ   r   rA   r:   s     r2   remove_socket_listenerz+VoiceConnectionState.remove_socket_listenerg  s4    

>III&&x00000r3   c                L    | j         d uot          j                    | j         k    S rI   )r   r   current_taskrC   s    r2   r  z#VoiceConnectionState._inside_runnerk  s$    |4'RG,@,B,Bdl,RRr3   r   other_statesc                  K   |g|R }	 | j         |v rd S t          | j                                        g|           d {V  ;)NTr   )r!   r   r   rU   )r0   r!   r   r  statess        r2   r   z$VoiceConnectionState._wait_for_staten  sm       ',''	MzV##!2!7!7!9!9 :GLLLLLLLLLL	Mr3   r   c               h   K   | j         j        }|j                            |||           d {V  d S )N)r   r   r   )r}   r   r   change_voice_state)r0   r   r   r   s       r2   r   z#VoiceConnectionState._voice_connectw  sG      #+m..w)_h.iiiiiiiiiiir3   c                6  K   t                               d| j        j        j        | j        j        j                   t          j        | _        | j        j        j        	                    d            d {V  d| _
        | j                                         d S )NzGThe voice handshake is being terminated for Channel ID %s (Guild ID %s)r   T)rN   r   r}   r   r)   r   rh   rq   r!   r#  r   r   r?   rC   s    r2   r  z&VoiceConnectionState._voice_disconnect{  s      		U%(#&	
 	
 	

 )5
'-@@@NNNNNNNNN%)"  """""r3   r   c                   K   d}| j         t          ur| j         j        }t          j        | || j        |           d {V }t          j        | _        |S )N)rG   r|   seq_ack)	r   r   r(  r   from_connection_stater|   rh   rv   r!   )r0   rG   r(  r   s       r2   r   z'VoiceConnectionState._connect_websocket  s`      7'!!goG(>tFY]Yblsttttttttt(<
	r3   c                  K   | j         s&| j                                         d {V  | j         &t          j        | _        | j        j        +| j                                         d {V  | j        j        +t          j        | _        d S rI   )r   r   
poll_eventrh   rx   r!   r   ry   rC   s    r2   r   z)VoiceConnectionState._handshake_websocket  s      ' 	''$$&&&&&&&&& ' 	'(9
g ('$$&&&&&&&&& g ((2


r3   c                    t          j         t           j        t           j                  | _         | j                             d           | j                                         d S r7   )rW   AF_INET
SOCK_DGRAMsetblockingr   rG   rC   s    r2   r   z#VoiceConnectionState._create_socket  sK    mFNF4EFF&&&""$$$$$r3   c                .  K   t                      }	 	 | j                                         d {V  n# t          j        $ r Y d S t
          t          j        f$ r}t          |t
                    r|j        dk    rG| j	        s:t                              d|j                   |                                  d {V  Y d }~d S |j        dv r| j                                        r@t                              d|j                   |                                  d {V  Y d }~d S t                              d           |                                  d {V }|sMt                              d           | j        t"          j        ur|                                  d {V  Y d }~d S Y d }~|j        dk    rMt                              d	           | j        t"          j        ur|                                  d {V  Y d }~d S |j        d
k    rt                              d           	 |                     || j        | j        p| j        | j        p| j        d           d {V  t                              d           Y d }~y# t          j        $ rO t                              d           | j        t"          j        ur|                                  d {V  Y Y d }~d S w xY wt                              d|j        |j        pd           |s|                                  d {V   |                                }t                              d|           t          j        |           d {V  |                     d           d {V  	 |                     || j        | j        p| j        | j        p| j        d           d {V  n4# t          j        $ r" t                              d           Y Y d }~w xY wY d }~nd }~ww xY w)NTi  z1Disconnecting from voice normally, close code %d.)r   i  z2Disconnected from voice by discord, close code %d.z=Disconnected from voice by force... potentially reconnecting.z@Reconnect was unsuccessful, disconnecting from voice normally...i  zKWe are being ratelimited while trying to connect to voice. Disconnecting...i  z/Disconnected from voice, attempting a resume...)r   r   r   r   rG   z%Successfully resumed voice connectionz9Could not resume the voice connection... Disconnecting...zNot handling close code %s (%s)z	no reasonz1Disconnected from voice... Reconnecting in %.2fs.Fr   z)Could not connect to voice... Retrying...)r   r   r+  r   r   r   r   
isinstancecoder   rN   r   r   r   r>   _potential_reconnectr!   rh   rq   r   r   r   r   r   r   rZ   reasondelayrO   r   )r0   r   backoffexc
successfulretrys         r2   r  z#VoiceConnectionState._poll_voice_ws  s     $&&W	Vg((**********)   $g&:; R R Rc#344 ;g x4''#9 4 II&Y[^[cddd"&//"3"33333333x<//  -4466 " II&Z\_\deee"&//"3"33333333!EEEEE 		"abbb+/+D+D+F+F%F%F%F%F%F%F
) % II&hiii#z1D1QQQ&*oo&7&7 7 7 7 7 7 7 7!EEEEE$HHHHx4''%rsss:-@-MMM"&//"3"33333333x4''		"STTT%"&--*3(,+/+@+HD*S+/+@+HD*S'+ #0 # #        !II&MNNN$HHHH  '3 " " " II&abbb#z1D1QQQ&*oo&7&7 7 7 7 7 7 7 7!EEEEEE	" JJ@#(CJLeZefff  //+++++++++RTYZZZmE*********ooeo444444444--"+ $#'#8#@D"K#'#8#@D"K$ (           +   LL!LMMMHHHHH    QRW	s   4 PPA"PAP&A=P/AP%P-=J
*P
AK( P'K((B-P=OP)P=PPPPc                N  K   	 |                      t          j        t          j        t          j        | j                   d {V  | j        t          j        u rdS n# t          j        $ r Y dS w xY w| j	        }	 | 
                    d           d {V | _	        |                                  d {V  	 |                                 d {V  dS # t          t          j        f$ r Y |                                 d {V  dS w xY w# |                                 d {V  w xY w)Nr   FT)r   rh   rt   ru   rq   r   r!   r   r   r   r   r   r   r   )r0   previous_wss     r2   r3  z)VoiceConnectionState._potential_reconnect  s     	&&#;#:#0	 '          z0===u > # 	 	 	55	 g	& 33E::::::::DG++--------- ##%%%%%%%%%%% !'"67 	 	 	 ##%%%%%%%%%%%	
 ##%%%%%%%%%%s6   AA A/.A/::C D'D DD D$abc.Snowflakec                   K   | j         j        j                            |           d {V  t          j        | _        d S )Nr%  )r}   r   r   r#  rh   rr   r!   )r0   r   s     r2   r  zVoiceConnectionState._move_to  sF      '-@@@QQQQQQQQQ(>


r3   r   Optional[int]c                R    |o| j                             |          | j        _        d S rI   )r   get_channelr}   r   )r0   r   s     r2   r   z*VoiceConnectionState._update_voice_channel  s(    $.$U4:3I3I*3U3U!!!r3   )r}   r   r|   r~   r"   r#   )r"   rh   )r!   rh   r"   r#   )r"   r   )r"   r   )r"   r   )r"   r   )r"   r   )r"   r   rc   )r   r   r"   r#   )r`   r   r"   r#   )r`   r   r"   r#   )r   r   r   r   r   r   r   r   rG   r   rU   r   r"   r#   )r   r
   r"   r#   )
r   r   r   r   r   r   rG   r   r"   r#   )r   r   r   r   r   r   r   r   rG   r   r"   r#   )rE   r   r   r   rU   r   r"   r#   )r   rh   r"   r#   )r   r  r   r	  r"   r#   rI   )r   r	  r"   r   )r   r	  r"   r#   )r  r  r"   r#   rb   )r!   rh   r  rh   r   r	  r"   r#   )r   r   r   r   r"   r#   )rG   r   r"   r   )r   r   r"   r#   )r   r<  r"   r#   )r   r>  r"   r#   )-r[   rd   re   rp   r(   propertyr!   setterr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rh   ru   r   r  rU   r  r  r  r  r  r  r   r   r  r   r   r   r  r3  r  r   rz   r3   r2   r   r      s       >>UY "$ "$ "$ "$ "$ "$H    X \
$ 
$ 
$ \
$ ' ' ' X' & & & X& 1 1 1 X1 # # # X# > > > X> i i i Xi   $	) 	) 	) 	)? ? ? ?*3K 3K 3K 3Kj5" 5" 5" 5"p pt" " " " " "&       8
} 
} 
} 
} 15dY^ +, +, +, +, +, +,Z J]Is            ,, , , ,0- - - - -S S S S S; ; ; ;$ $ $ $/ / / /1 1 1 1S S S S jnM M M M M M 9>QV j j j j j j	# 	# 	# 	#   3 3 3 3% % % %
Y Y Y Yv& & & &2? ? ? ?V V V V V Vr3   r   )<rp   
__future__r   rV   rW   r   loggingr+   typingr   r   r   r   r   r	   r
   r   enumsr   utilsr   r   errorsr   r6  r   gatewayr    r   r   r   r   r   memberr   r}   r   types.voicer   r   r   r   r   strWebsocketHookr  r5   __annotations__r   r   ImportError__all__	getLoggerr[   rN   Threadr   rh   r   rz   r3   r2   <module>rT     s  % % %N # " " " " "         W W W W W W W W W W W W W W W W W W W W       ) ) ) ) ) ) ) ) $ $ $ $ $ $ ' ' ' ' ' ' * * * * * * 2      """"""))))))          X'<d38n&MyY\^acfYfOg&ghiM#UGSL1 LLLHH   HHH $w""ZK ZK ZK ZK ZK9# ZK ZK ZKz         $       Q	V Q	V Q	V Q	V Q	V Q	V Q	V Q	V Q	V Q	Vs   0B7 7C C