o
    zsg>!                     @   sp   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eZG dd dZdS )z;
 Defines the RealtimePresence class and its dependencies.
    N)AnyCallableDictListOptionalUnion   )PresenceDiffPresenceEventsPresenceOnJoinCallbackPresenceOnLeaveCallbackPresenceOptsRawPresenceDiffRawPresenceStateRealtimePresenceStatec                
   @   s0  e Zd Zd&dee fddZdefddZdefdd	Z	de
g df fd
dZde
g df fddZde
g df fddZdefddZdeeef fddZdeeef fddZdedeeef dededef
ddZdedeeef dededef
d d!Zdefd"d#Zedeeef defd$d%ZdS )'AsyncRealtimePresenceNoptsc                 C   s   || _ i | _g | _d | _dd dd dd dd dd d| _|r$|jntdd	d
}| j j|j| jd | j j|j	| j
d | j jd| jd d S )Nc                  W      d S N argsr   r   T/var/www/html/minecraft/env/lib/python3.10/site-packages/realtime/_async/presence.py<lambda>       z0AsyncRealtimePresence.__init__.<locals>.<lambda>c                  W   r   r   r   r   r   r   r   r      r   c                   S   r   r   r   r   r   r   r   r      r   c                   S   r   r   r   r   r   r   r   r       r   c                   S   r   r   r   r   r   r   r   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   r*   r   r   r   __init__   s"   

zAsyncRealtimePresence.__init__r$   c                 C      || j d< d S )Nr   r)   r/   r$   r   r   r   on_join.      zAsyncRealtimePresence.on_joinc                 C   r1   )Nr   r2   r3   r   r   r   on_leave1   r5   zAsyncRealtimePresence.on_leavec                 C   r1   )Nr   r2   r3   r   r   r   on_sync4   r5   zAsyncRealtimePresence.on_syncc                 C   r1   )Nr   r2   r3   r   r   r   on_auth_success7   r5   z%AsyncRealtimePresence.on_auth_successc                 C   r1   )Nr   r2   r3   r   r   r   on_auth_failure:   r5   z%AsyncRealtimePresence.on_auth_failurepayloadc                 G   sl   | j d }| j d }| j d }| jj| _| | j|||| _| jD ]}| | j|||| _q!g | _|  d S Nr   r   r   )r)   r&   r(   _sync_stater"   r'   
_sync_diff)r/   r:   r   r   r   r   r#   r   r   r   r,   =   s   





z%AsyncRealtimePresence._on_state_eventc                 G   sT   | j d }| j d }| j d }|  r| j| d S | | j|||| _|  d S r;   )r)   in_pending_sync_stater'   appendr=   r"   )r/   r:   r   r   r   r   r   r   r   r-   J   s   



z$AsyncRealtimePresence._on_diff_eventc                 G   s.   | ddkr| jd   d S | jd   d S )Nstatusokr   r   )getr)   )r/   r:   r   r   r   r   r.   U   s   z$AsyncRealtimePresence._on_auth_eventcurrent_state	new_stater   r   returnc                    s   dd |  D }t|i }fdd|  D }  D ]A\}}	||g }
t|
dkr\dd |	D dd |
D   fdd	|	D }fd
d	|
D }|rU|||< |r[|||< q|	||< q| |||d||S )Nc                 S   s   i | ]	\}}|t |qS r   )list).0keyvaluer   r   r   
<dictcomp>b   s    z5AsyncRealtimePresence._sync_state.<locals>.<dictcomp>c                    s   i | ]\}}| vr||qS r   r   )rG   kv)transformed_stater   r   rJ   f       r   c                 S      h | ]}| d qS presence_refrB   rG   presencer   r   r   	<setcomp>n   s    z4AsyncRealtimePresence._sync_state.<locals>.<setcomp>c                 S   rO   rP   rR   rS   r   r   r   rU   o       
c                       g | ]}| d  vr|qS rP   rR   rG   p)cur_presence_refsr   r   
<listcomp>s   rN   z5AsyncRealtimePresence._sync_state.<locals>.<listcomp>c                    rW   rP   rR   rX   )new_presence_refsr   r   r[   v   
    )joinsleaves)itemsr   _transform_staterB   lenr=   )r/   rC   rD   r   r   r"   r^   r_   rH   rI   current_presencesjoined_presencesleft_presencesr   )rZ   r\   rM   r   r<   [   s8   




z!AsyncRealtimePresence._sync_stater"   r#   c                    s  t |di }t |di }| D ]7\}}||g }	|||< t|	dkrGdd ||D  t fdd|	D }
|
||  ||< |||	| q| D ]6\}}||g }	t|	dkre |S dd |D fd	d
|	D }	|	||< |||	| t|	dkr||= qR|S )Nr^   r_   r   c                 S   rO   rP   rR   rS   r   r   r   rU      rV   z3AsyncRealtimePresence._sync_diff.<locals>.<setcomp>c                 3   s"    | ]}| d  vr|V  qdS )rQ   NrR   rS   )joined_presence_refsr   r   	<genexpr>   s    z3AsyncRealtimePresence._sync_diff.<locals>.<genexpr>c                 S   rO   rP   rR   rS   r   r   r   rU      rV   c                    rW   rP   rR   rS   )presence_refs_to_remover   r   r[      r]   z4AsyncRealtimePresence._sync_diff.<locals>.<listcomp>)r   ra   rB   r`   rb   rF   )r/   r"   r#   r   r   r^   r_   rH   new_presencesrc   cur_presencesre   r   )rf   rh   r   r=      s>   
z AsyncRealtimePresence._sync_diffc                 C   s   | j d u p| j | jj kS r   )r(   r&   )r/   r   r   r   r>      s   z+AsyncRealtimePresence.in_pending_sync_statec                 C   sv   i }|   D ]2\}}t|tr4d|v r4g ||< |d D ]}|dd|d< |dd || | qq|||< q|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_refNrQ   phx_ref_prev)r`   
isinstancedictpopr?   )r"   rD   rH   	presencesrT   r   r   r   ra      s   &
z&AsyncRealtimePresence._transform_stater   )__name__
__module____qualname__r   r   r0   r   r4   r   r6   r   r7   r8   r9   r   r,   r   strr   r-   r.   r   r   r<   r   r	   r=   boolr>   staticmethodra   r   r   r   r   r      sN    

,

2
r   )__doc__loggingtypingr   r   r   r   r   r   typesr	   r
   r   r   r   r   r   r   	getLoggerrr   loggerr   r   r   r   r   <module>   s     (
