
    j                        U d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
 ddlZdZded	<   d
Zded<    ed       G d d             Z G d d      Z G d d      Zy)zEPrivate durable addresses for the profile-gated Telegram check-in UI.    )annotationsN)	dataclass)Path)Finali  z
Final[int]_MODEi  	_DIR_MODET)slotsc                      e Zd ZU dZded<   ded<   ded<   ded<   ded<   ded	<   ded
<   ded<   dZded<   edd       ZddZy)WizardBindingzENo health values: only the exact Telegram address of a wizard prompt.str
session_idowner_idchat_idtopic_idstepintversion
message_id
expires_atFboolawaiting_textc                v   t        t              sy d}t        fd|D              ry 	 t        j	                  d            }t        j	                  d            }|dk  s|dk  ry  | d   d   d   d	   d
   |d   |t        j	                  dd            	      S # t
        t        f$ r Y y w xY w)N)r   r   r   r   r   r   c              3  n   K   | ],  }t        j                  |      t               xs |     . y wN)
isinstancegetr   ).0keyvalues     j/home/cube/projects/richard/.worktrees/nutricoach-v140-impl/gateway/platforms/physique_checkin_bindings.py	<genexpr>z*WizardBinding.from_dict.<locals>.<genexpr>%   s4     YPX:eiinc22D%*nDPXs   25r   r   r   r   r   r   r   r   r   r   F	r   r   r   r   r   r   r   r   r   )r   dictanyr   r   	TypeError
ValueErrorr   )clsr   requiredr   r   s    `   r    	from_dictzWizardBinding.from_dict    s    %&ZYPXYY	%))I./GUYY|45J Q;*/\*U:5FPUV_P`:&U6]G\*zuyy%@A	
 	
	 :& 		s   4B& &B87B8c           
         | j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  d	S )Nr"   r"   selfs    r    to_dictzWizardBinding.to_dict5   sK    //t}}QUQ]Q]tyyT\\//!//	
 	
    N)r   objectreturnzWizardBinding | None)r0   zdict[str, str | int | bool])	__name__
__module____qualname____doc____annotations__r   classmethodr)   r-    r.   r    r   r      sN    OOMLM
ILOOM4
 
(
r.   r   c                  6    e Zd ZdZddZd	dZd
dZddZd Zy)BindingStorezKAtomic owner-only persistence for prompt addresses across gateway restarts.c                X    || _         |j                  |j                  dz         | _        y )Nz.lock)_pathwith_suffixsuffix
_lock_path)r,   paths     r    __init__zBindingStore.__init__A   s$    
**4;;+@Ar.   c                *   | j                         5  | j                         }t        |t              r|j	                  dg       ng }i }t        |t
              r|ng D ]b  }t        j                  |      }	|	|	j                  |k  r*|	j                  |	j                  |	j                  f|||fk7  rT|	||	j                  <   d t        |t              r|j	                  d      nd }
t        |
t              r|
|v r|
nd }||fcd d d        S # 1 sw Y   y xY w)Nbindingsactive_session_id)_locked_read_unlockedr   r#   r   listr   r)   r   r   r   r   r   r   )r,   r   r   r   	now_epochrawvaluesrB   itembindingactive	active_ids               r    loadzBindingStore.loadE   s    \\^%%'C0:30ESWWZ,2F13H",VT":B'11$7?g&8&8I&E$$goow7G7GHXW^`hLii/6++, C 6@T5JSWW01PTF",VS"9f>PVZIY& ^^s   C.D		Dc                V   | j                         5  d||j                         D cg c]  }|j                          c}d}| j                  j                  j                  ddt               | j                  j                  j                  t               | j                  j                  | j                  j                  dz         }|j                  dd      5 }|j                  t               t        j                  ||d	d
       |j                          t        j                   |j#                                d d d        t        j$                  || j                         | j                  j                  t               d d d        y c c}w # 1 sw Y   VxY w# 1 sw Y   y xY w)N   )r   rC   rB   Tparentsexist_okmodez.tmpwutf-8encoding),:)
separators	sort_keys)rD   rI   r-   r;   parentmkdirr   chmodr<   r=   openr   jsondumpflushosfsyncfilenoreplace)r,   rB   rC   rK   payload	temporaryhandles          r    savezBindingStore.saveU   s*   \\^%6>Foo>OP>O7W__.>OPG
 JJ##D4i#PJJ##I.

..tzz/@/@6/IJIg6&&		'6jDQ)	 7
 JJy$**-JJU# ^ Q
 76 ^s6   FF
BFA"F>AFFF	FF(c                    | j                   j                         si S 	 t        j                  | j                   j	                  d            S # t
        t        j                  f$ r i cY S w xY w)NrV   rW   )r;   existsra   loads	read_textOSErrorJSONDecodeErrorr+   s    r    rE   zBindingStore._read_unlockedg   s\    zz  "I	::djj22G2DEE--. 	I	s   .A A+*A+c                   | j                   j                  j                  ddt               | j                   j                  j	                  t               | j                   j                  dd      }| j                   j	                  t               t        j                  |j                         t        j                         t        |      S )NTrQ   arV   rW   )r>   r]   r^   r   r_   r`   r   fcntlflockrf   LOCK_EX_BindingLockr,   rj   s     r    rD   zBindingStore._lockedo   s    $$TDy$Q$$Y/%%cG%<e$FMMOU]]3F##r.   N)r?   r   r0   None)
r   r   r   r   r   r   rG   r   r0   z+tuple[dict[str, WizardBinding], str | None])rB   zdict[str, WizardBinding]rC   z
str | Noner0   ry   )r0   r/   )	r1   r2   r3   r4   r@   rN   rk   rE   rD   r7   r.   r    r9   r9   >   s    UB' $$$r.   r9   c                  $    e Zd ZddZddZddZy)rw   c                    || _         y r   )_handlerx   s     r    r@   z_BindingLock.__init__y   s	    r.   c                     y r   r7   r+   s    r    	__enter__z_BindingLock.__enter__|   s    r.   c                    t        j                  | j                  j                         t         j                         | j                  j                          y r   )rt   ru   r|   rf   LOCK_UNclose)r,   exc_typeexc	tracebacks       r    __exit__z_BindingLock.__exit__   s1    DLL'')5==9r.   N)r0   ry   )r1   r2   r3   r@   r~   r   r7   r.   r    rw   rw   x   s    r.   rw   )r4   
__future__r   ra   rd   dataclassesr   pathlibr   typingr   rt   r   r5   r   r   r9   rw   r7   r.   r    <module>r      sg    K "  	 !    z 	:  (
 (
 (
V7$ 7$t	 	r.   