Ë
    âß²j„  ã                  óØ   — d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	  ej                  e«      Z ej                  d«      Z ej                  d«      Zdd„Zdd	„Zdd
„Zdd„Zdd„Zy)až  Shared helpers for canonicalising WhatsApp sender identity.

The bridge can surface one human as a LID (``999...@lid``) or a phone JID
(``1555...@s.whatsapp.net``) within one conversation. Authorisation (:mod:`gateway.run`) and
session keys (:mod:`gateway.session`) both resolve aliases here so they never drift apart;
plugins should use :func:`canonical_whatsapp_identifier` to line up with Hermes' session keys.
é    )ÚannotationsN)ÚSet)Úget_hermes_dirz^[A-Za-z0-9@.+\-]+$z^\+?[\d\s().\-]+$c                óª   — t        | xs d«      j                  «       j                  ddd«      j                  dd«      d   j                  dd«      d   S )z�Strip JID/LID/device/plus syntax down to the bare numeric identifier:
    ``"6012:47@s.whatsapp.net"``, ``"6012@lid"`` and ``"+6012"`` all become ``"6012"``.Ú ú+é   ú:r   ú@)ÚstrÚstripÚreplaceÚsplit)Úvalues    ú>/home/ubuntu/.hermes/hermes-agent/gateway/whatsapp_identity.pyÚnormalize_whatsapp_identifierr      sQ   € ô ˆuŠ{˜Ó×!Ñ!Ó#×+Ñ+¨C°°QÓ7×=Ñ=¸cÀ1ÓEÀaÑH×NÑNÈsÐTUÓVÐWXÑYÐYó    c                ó  — | syt        | «      j                  «       }d|v r3d|v r/|j                  d«      \  }}}|j                  dd«      d   › d|› �}d|v r|S t        j                  |«      rt        j                  dd|«      }|r|› d�S |S )aU  Normalize an *outbound* target to a bridge-safe JID (inverse of normalize).  Baileys'
    ``jidDecode`` crashes on a bare phone, so bare phones become ``<digits>@s.whatsapp.net``;
    ``user:device@domain`` collapses to ``user@domain``; anything else is returned unchanged
    so the bridge can surface a real error.  ``""`` for empty input.r   r
   r   r	   r   z\D+z@s.whatsapp.net)r   r   Ú	partitionr   Ú_BARE_PHONE_REÚ	fullmatchÚreÚsub)r   Ú
normalizedÚprefixÚ_ÚdomainÚdigitss         r   Úto_whatsapp_jidr   #   s§   € ñ
 ØÜ�U“×!Ñ!Ó#€JØ
ˆjÑ˜S JÑ.Ø&×0Ñ0°Ó5Ñˆ��6ØŸ™ S¨!Ó,¨QÑ/Ð0°°&°Ð:ˆ
Ø
ˆjÑØÐÜ×Ñ 
Ô+Ü—‘˜  JÓ/ˆÙØ�X˜_Ð-Ð-ØÐr   c                ó–   — t        | «      }|j                  d«      \  }}}|r&|j                  «       r|j                  «       r|dv r|S dS )zBReturn a valid participant JID for an outbound mention, or ``""``.r   >   ús.whatsapp.netÚlidr   )r   r   ÚisasciiÚisdigit)r   ÚjidÚuserÚ	separatorr   s        r   Únormalize_whatsapp_mention_jidr(   7   sU   € ä
˜%Ó
 €CØ!Ÿm™m¨CÓ0Ñ€Dˆ)�Vñ Ø�L‰LŒNØ�L‰LŒNØÐ/Ñ/ð	 	ðð ðr   c                ó@  — t        | «      }|s
t        «       S t        dd«      }t        «       }|g}|r®|j                  d«      }|r||v st        j                  |«      sŒ/|j                  |«       dD ]h  }|d|› |› d�z  }|j                  «       sŒ	 t        j                  |j                  d¬«      «      }t        |«      }	|	sŒS|	|vsŒX|j                  |	«       Œj |rŒ®|S # t        t        j                  f$ r!}
t        j                  d	||
«       Y d
}
~
Œ¥d
}
~
ww xY w)z¬All identifiers transitively reachable via the bridge's ``lid-mapping-*.json`` files;
    always includes the normalized input itself (empty set if it normalizes to empty).zplatforms/whatsapp/sessionzwhatsapp/sessionr   )r   Ú_reversezlid-mapping-z.jsonzutf-8)Úencodingz(whatsapp_identity: failed to read %s: %sN)r   Úsetr   ÚpopÚ_SAFE_IDENTIFIER_REÚmatchÚaddÚexistsÚjsonÚloadsÚ	read_textÚOSErrorÚJSONDecodeErrorÚloggerÚdebugÚappend)Ú
identifierr   Úsession_dirÚresolvedÚqueueÚcurrentÚsuffixÚmapping_pathÚrawÚmappedÚexcs              r   Úexpand_whatsapp_aliasesrD   E   s#  € ô /¨zÓ:€JÙÜ‹uˆÜ Ð!=Ð?QÓR€KÜ›€HØˆL€EÙ
Ø—)‘)˜A“,ˆñ ˜' XÑ-Ô5H×5NÑ5NÈwÔ5WØØ�‰�WÔØ&ò 	%ˆFØ&¨<¸°yÀÀÈÐ)NÑNˆLØ×&Ñ&Ô(ØðÜ—j‘j ×!7Ñ!7ÀÐ!7Ó!IÓJ�Ü6°sÓ;�ò ˜&¨Ò0Ø—‘˜VÕ$ð	%ò ð& €Oøô œT×1Ñ1Ð2ò Ü—‘ÐGÈÐWZÔ[Üûðús   Â0C#Ã#DÃ<DÄDc                óP   — t        | «      }|syt        |«      }t        |d„ ¬«      S )a  Stable sender identity across phone-JID/LID variants (DM ``chat_id`` and group
    ``participant_id`` alike): the shortest alias from :func:`expand_whatsapp_aliases`, which
    degrades to the normalized input when no mapping files exist.  ``""`` for empty input.r   c                ó   — t        | «      | fS )N)Úlen)Úcs    r   ú<lambda>z/canonical_whatsapp_identifier.<locals>.<lambda>n   s   € ¤s¨1£v¨q k€ r   )Úkey)r   rD   Úmin)r:   r   Úaliasess      r   Úcanonical_whatsapp_identifierrM   d   s.   € ô /¨zÓ:€JÙØô & jÓ1€GÜˆwÑ1Ô2Ð2r   )r   r   Úreturnr   )r:   r   rN   zSet[str])r:   r   rN   r   )Ú__doc__Ú
__future__r   r2   Úloggingr   Útypingr   Úhermes_constantsr   Ú	getLoggerÚ__name__r7   Úcompiler.   r   r   r   r(   rD   rM   © r   r   ú<module>rX      sq   ðñõ #ã Û Û 	Ý å +à	ˆ×	Ñ	˜8Ó	$€ð !�b—j‘jÐ!7Ó8Ð ð �—‘Ð0Ó1€óZóó(óô>
3r   