
    g>!                         d Z ddlZddlmZmZmZmZmZmZ ddl	m
Z
mZmZmZmZmZmZmZ  ej$                  e      Z G d d      Zy)z;
 Defines the RealtimePresence class and its dependencies.
    N)AnyCallableDictListOptionalUnion   )PresenceDiffPresenceEventsPresenceOnJoinCallbackPresenceOnLeaveCallbackPresenceOptsRawPresenceDiffRawPresenceStateRealtimePresenceStatec            
       .   e Zd Zddee   fdZdefdZdefdZ	de
g df   fdZde
g df   fdZde
g df   fd	Zd
efdZd
eeef   fdZd
eeef   fdZdedeeef   dededef
dZdedeeef   dededef
dZdefdZedeeef   defd       Zy)AsyncRealtimePresenceNoptsc                    || _         i | _        g | _        d | _        d d d d d d| _        |r|j
                  nt        dd	      }| j                   j                  |j                  | j                  
       | j                   j                  |j                  | j                  
       | j                   j                  d| j                  
       y )Nc                       y N argss    M/var/www/openai/venv/lib/python3.12/site-packages/realtime/_async/presence.py<lambda>z0AsyncRealtimePresence.__init__.<locals>.<lambda>   s    D    c                       y r   r   r   s    r   r   z0AsyncRealtimePresence.__init__.<locals>.<lambda>       Tr   c                       y r   r   r   r   r   r   z0AsyncRealtimePresence.__init__.<locals>.<lambda>   s    dr   c                       y r   r   r   r   r   r   z0AsyncRealtimePresence.__init__.<locals>.<lambda>    r   r   c                       y r   r   r   r   r   r   z0AsyncRealtimePresence.__init__.<locals>.<lambda>!   r   r   )onJoinonLeaveonSynconAuthSuccessonAuthFailurepresence_statepresence_diff)statediff)callbackphx_auth)channelr*   pending_diffsjoin_refcallereventsr   _on_on_state_eventr+   _on_diff_event_on_auth_event)selfr.   r   r2   s       r   __init__zAsyncRealtimePresence.__init__   s    ,.
46'+()"))
  KK&6_M 	 	0D0DEt/B/BCd.A.ABr   r,   c                 "    || j                   d<   y )Nr#   r1   r7   r,   s     r   on_joinzAsyncRealtimePresence.on_join.        (Hr   c                 "    || j                   d<   y )Nr$   r:   r;   s     r   on_leavezAsyncRealtimePresence.on_leave1   s    !)Ir   c                 "    || j                   d<   y )Nr%   r:   r;   s     r   on_synczAsyncRealtimePresence.on_sync4   r=   r   c                 "    || j                   d<   y )Nr&   r:   r;   s     r   on_auth_successz%AsyncRealtimePresence.on_auth_success7       '/O$r   c                 "    || j                   d<   y )Nr'   r:   r;   s     r   on_auth_failurez%AsyncRealtimePresence.on_auth_failure:   rD   r   payloadc                 ^   | j                   d   }| j                   d   }| j                   d   }| j                  j                  | _        | j                  | j                  |||      | _        | j
                  D ]%  }| j                  | j                  |||      | _        ' g | _         |        y Nr#   r$   r%   )r1   r.   r0   _sync_stater*   r/   
_sync_diff)r7   rG   r   r#   r$   r%   r+   s          r   r4   z%AsyncRealtimePresence._on_state_event=   s    X&++i(X&--%%djj'67K
&&DT67KDJ 'r   c                 
   | j                   d   }| j                   d   }| j                   d   }| j                         r| j                  j                  |       y | j	                  | j
                  |||      | _         |        y rI   )r1   in_pending_sync_stater/   appendrK   r*   )r7   rG   r   r#   r$   r%   s         r   r5   z$AsyncRealtimePresence._on_diff_eventJ   sk    X&++i(X&%%'%%g.WfgNDJHr   c                 ~    |j                  d      dk(  r | j                  d           y  | j                  d           y )Nstatusokr&   r'   )getr1   )r7   rG   r   s      r   r6   z$AsyncRealtimePresence._on_auth_eventU   s5    ;;x D((DKK(*(DKK(*r   current_state	new_stater#   r$   returnc                    |j                         D ci c]  \  }}|t        |       }}}t        j                  |      }i }	|j                         D 
ci c]  \  }
}|
|vs|
| }}
}|j                         D ]  \  }}|j	                  |g       }t        |      dkD  r|D ch c]  }|j	                  d       }}|D ch c]  }|j	                  d       }}|D cg c]  }|j	                  d      |vs| }}|D cg c]  }|j	                  d      |vr| }}|r||	|<   |s|||<   ||	|<    | j                  ||	|d||      S c c}}w c c}}
w c c}w c c}w c c}w c c}w )Nr   presence_ref)joinsleaves)itemslistr   _transform_staterR   lenrK   )r7   rS   rT   r#   r$   keyvaluer*   transformed_staterX   kvrY   current_presencespresencenew_presence_refscur_presence_refspjoined_presencesleft_presencess                       r   rJ   z!AsyncRealtimePresence._sync_state[   s    5B4G4G4IJ4Ijc5d5k!4IJ1BB9M ""[[]"
*TQa7H.HAqD] 	 "
 ,113JC %		#r 2$%)RW$XRWhX\\.%ARW!$XAR%ARXHLL0AR " %
  %$$!n(=EV(VAu ! $
 /".uu^,4EE .  " $!1E#J!"0F3K"c
/ 42 Uf5vw
 	
C K"
 %Y%$"s/   EE$E&EE""E';E'E,r*   r+   c                    t         j                  |j                  di             }t         j                  |j                  di             }|j                         D ]  \  }}|j                  |g       }	|||<   t	        |	      dkD  rM|j                  |      D 
ch c]  }
|
j                  d       c}
t        fd|	D              }|||   z   ||<    |||	|        |j                         D ]  \  }}|j                  |g       }	t	        |	      dk(  r |S |D 
ch c]  }
|
j                  d       }}
|	D 
cg c]  }
|
j                  d      |vr|
 }	}
|	||<    |||	|       t	        |	      dk(  s||=  |S c c}
w c c}
w c c}
w )NrX   rY   r   rW   c              3   H   K   | ]  }|j                  d       vr|  yw)rW   N)rR   ).0rd   joined_presence_refss     r   	<genexpr>z3AsyncRealtimePresence._sync_diff.<locals>.<genexpr>   s+      %$5||N3;OO $5s   ")r   r\   rR   rZ   r]   r[   )r7   r*   r+   r#   r$   rX   rY   r^   new_presencesrc   rd   cur_presencesri   presence_refs_to_removerm   s                 @r   rK   z AsyncRealtimePresence._sync_diff   s    &66txx7LM&7728NO"'++-C %		#r 2&E#J$%)AF3(AOXHLL0($ !% %$5% !
 +U3Z7c
3)=9 #0" $*<<>C %		#r 2$%*"  >L'=K^,^ $ '
 !2! 1H<</7NN  1  !
 +E#JC*N;$%*#J' $2* C($'!s   E>F;Fc                 h    | j                   d u xs# | j                   | j                  j                   k7  S r   )r0   r.   )r7   s    r   rM   z+AsyncRealtimePresence.in_pending_sync_state   s)    }}$N9N9N(NNr   c                    i }| j                         D ]i  \  }}t        |t              rOd|v rKg ||<   |d   D ]=  }|j                  dd      |d<   |j                  dd       ||   j	                  |       ? e|||<   k |S )aX  
        Transform the raw presence state into a standardized RealtimePresenceState format.

        This method processes the input state, which can be either a RawPresenceState or
        an already transformed RealtimePresenceState. It handles the conversion of the
        Phoenix channel's presence format to our internal representation.

        Args:
            state (Union[RawPresenceState, RealtimePresenceState[T]]): The presence state to transform.

        Returns:
            RealtimePresenceState[T]: The transformed presence state.

        Example:
            Input (RawPresenceState):
            {
                "user1": {
                    "metas": [
                        {"phx_ref": "ABC123", "user_id": "user1", "status": "online"},
                        {"phx_ref": "DEF456", "phx_ref_prev": "ABC123", "user_id": "user1", "status": "away"}
                    ]
                },
                "user2": [{"user_id": "user2", "status": "offline"}]
            }

            Output (RealtimePresenceState):
            {
                "user1": [
                    {"presence_ref": "ABC123", "user_id": "user1", "status": "online"},
                    {"presence_ref": "DEF456", "user_id": "user1", "status": "away"}
                ],
                "user2": [{"user_id": "user2", "status": "offline"}]
            }
        metasphx_refNrW   phx_ref_prev)rZ   
isinstancedictpoprN   )r*   rT   r^   	presencesrd   s        r   r\   z&AsyncRealtimePresence._transform_state   s    L ,.	#kkmNC)T*w)/C!#	# )' 2H/7||It/LH^,LL6cN))(3 !3 "+	# , r   r   )__name__
__module____qualname__r   r   r8   r   r<   r   r?   r   rA   rC   rF   r   r4   r   strr   r5   r6   r   r   rJ   r   r
   rK   boolrM   staticmethodr\   r   r   r   r   r      sc   Ch|&< C.) 6 )*!8 *)T 2 )0T(: 00T(: 0'7 	d38n 	+d38n +*
,*
 )+@@A*
 '	*

 )*
 
*
X0$0 O\120 '	0
 )0 
0dOt O 1%'<<=1	1 1r   r   )__doc__loggingtypingr   r   r   r   r   r   typesr
   r   r   r   r   r   r   r   	getLoggerr{   loggerr   r   r   r   <module>r      sD     = =	 	 	 
		8	$X Xr   