o
    }jh                     @   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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 )AsyncRealtimePresencec                 C   s   i | _ d | _d | _d | _d S N)stateon_join_callbackon_leave_callbackon_sync_callback)self r   N/var/www/html/bot/env/lib/python3.10/site-packages/realtime/_async/presence.py__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_event.   s   z$AsyncRealtimePresence._on_diff_event	new_statereturnc           	         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>:   s    z5AsyncRealtimePresence._sync_state.<locals>.<dictcomp>r   c                 S      h | ]}|d  qS presence_refr   r-   presencer   r   r   	<setcomp>@   s    z4AsyncRealtimePresence._sync_state.<locals>.<setcomp>c                 S   r1   r2   r   r4   r   r   r   r6   A   s    c                       g | ]
}|d   vr|qS r2   r   r-   p)cur_presence_refsr   r   
<listcomp>E   s    z5AsyncRealtimePresence._sync_state.<locals>.<listcomp>c                    r7   r2   r   r8   )new_presence_refsr   r   r;   H   s
    )r   itemsgetlenr)   )	r   r+   r'   r(   keyvaluecurrent_presencesjoined_presencesleft_presencesr   )r:   r<   r+   r   r%   5   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 r2   r>   r4   r   r   r   r6   _       
z3AsyncRealtimePresence._sync_diff.<locals>.<setcomp>c                 3   s"    | ]}| d  vr|V  qdS )r3   NrF   r4   )joined_presence_refsr   r   	<genexpr>b   s    z3AsyncRealtimePresence._sync_diff.<locals>.<genexpr>c                 S   rE   r2   rF   r4   r   r   r   r6   r   rG   c                    s   g | ]}| d  vr|qS r2   rF   r4   )presence_refs_to_remover   r   r;   u   s
    z4AsyncRealtimePresence._sync_diff.<locals>.<listcomp>)r=   r   r>   r?   listr   r   )r   r'   r(   r@   new_presencesrB   cur_presencesrD   r   )rH   rJ   r   r)   W   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_prevr3   phx_ref)r=   popupdateappend)r   r+   r@   	presencesr5   new_presencer   r   r   r$      s   &
z&AsyncRealtimePresence._transform_state)__name__
__module____qualname__r   r   r   r   r!   r   r"   r   r&   r   r*   r   r%   r)   staticmethodr$   r   r   r   r   r      s2    
"
-r   )__doc__loggingtypingr   r   r   r   r   r   typesr	   r
   r   r   r   r   r   r   r   	getLoggerrV   loggerr   r   r   r   r   <module>   s     ,
