o
    uyi                     @   st   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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   )	PresencePresenceDiffPresenceEventsPresenceOnJoinCallbackPresenceOnLeaveCallbackPresenceOptsRawPresenceDiffRawPresenceStateRealtimePresenceStatec                   @   s   e Zd ZedefddZ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fddZdefddZdedefddZdededefddZededefddZdS )AsyncRealtimePresencereturnc                 C   s   | j d up| jd up| jd uS N)on_join_callbackon_leave_callbackon_sync_callbackself r   [/home/ubuntu/maya3_transcribe/venv/lib/python3.10/site-packages/realtime/_async/presence.py_has_callback_attached   s
   
z,AsyncRealtimePresence._has_callback_attachedc                 C   s   i | _ d | _d | _d | _d S r   )stater   r   r   r   r   r   r   __init__    s   
zAsyncRealtimePresence.__init__callbackc                 C   
   || _ d S r   )r   r   r   r   r   r   on_join&      
zAsyncRealtimePresence.on_joinc                 C   r    r   )r   r!   r   r   r   on_leave)   r#   zAsyncRealtimePresence.on_leaveNc                 C   r    r   )r   r!   r   r   r   on_sync,   r#   zAsyncRealtimePresence.on_syncpayloadc                 C   s,   t |}| || _| jr|   d S d S r   )r   _transform_state_sync_stater   r   )r   r&   r   r   r   r   _on_state_event/   s
   
z%AsyncRealtimePresence._on_state_eventc                 C   s@   t |d }t |d }| ||| _| jr|   d S d S )Njoinsleaves)r   r'   
_sync_diffr   r   )r   r&   r*   r+   r   r   r   _on_diff_event6   s   z$AsyncRealtimePresence._on_diff_event	new_statec           	         s   i }fdd| j  D } D ]B\}}| j |g }t|dkrPdd |D dd |D   fdd|D }fd	d|D }|rI|||< |rO|||< q|||< q| ||S )
Nc                    s   i | ]\}}| vr||qS r   r   ).0kv)r.   r   r   
<dictcomp>B   s    z5AsyncRealtimePresence._sync_state.<locals>.<dictcomp>r   c                 S      h | ]}|d  qS presence_refr   r/   presencer   r   r   	<setcomp>H   s    z4AsyncRealtimePresence._sync_state.<locals>.<setcomp>c                 S   r3   r4   r   r6   r   r   r   r8   I   s    c                       g | ]
}|d   vr|qS r4   r   r/   p)cur_presence_refsr   r   
<listcomp>M   s    z5AsyncRealtimePresence._sync_state.<locals>.<listcomp>c                    r9   r4   r   r:   )new_presence_refsr   r   r=   P   s
    )r   itemsgetlenr,   )	r   r.   r*   r+   keyvaluecurrent_presencesjoined_presencesleft_presencesr   )r<   r>   r.   r   r(   =   s,   


z!AsyncRealtimePresence._sync_stater*   r+   c                    s  |  D ]<\}}| j|g }|| j|< t|dkr6dd |D  t fdd|D }|| j|  | j|< | jr@| ||| q|  D ]>\}}| j|g }t|dkrZ | jS dd |D fdd|D }|| j|< | jry| ||| t|dkr| j|= qE| jS )	Nr   c                 S      h | ]}| d qS r4   r@   r6   r   r   r   r8   g       
z3AsyncRealtimePresence._sync_diff.<locals>.<setcomp>c                 3   s"    | ]}| d  vr|V  qdS )r5   NrH   r6   )joined_presence_refsr   r   	<genexpr>j   s    z3AsyncRealtimePresence._sync_diff.<locals>.<genexpr>c                 S   rG   r4   rH   r6   r   r   r   r8   z   rI   c                    s   g | ]}| d  vr|qS r4   rH   r6   )presence_refs_to_remover   r   r=   }   s
    z4AsyncRealtimePresence._sync_diff.<locals>.<listcomp>)r?   r   r@   rA   listr   r   )r   r*   r+   rB   new_presencesrD   cur_presencesrF   r   )rJ   rL   r   r,   _   s@   


z AsyncRealtimePresence._sync_diffr   c                 C   sd   i }|   D ])\}}g ||< |d D ]}d|v r|d= d|di}|| || | 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_ref_prevr5   phx_ref)r?   popupdateappend)r   r.   rB   	presencesr7   new_presencer   r   r   r'      s   &
z&AsyncRealtimePresence._transform_state)__name__
__module____qualname__propertyboolr   r   r   r"   r   r$   r   r%   r   r)   r   r-   r   r(   r,   staticmethodr'   r   r   r   r   r      s6    
"
-r   )__doc__loggingtypingr   r   r   r   r   r   typesr	   r
   r   r   r   r   r   r   r   	getLoggerrX   loggerr   r   r   r   r   <module>   s     ,
