
    vWQj\                        d Z ddlZddlZddlZddlZddlZddlZddlmZm	Z	 ddl
mZmZ ej                            ej                            e          dd          Zddd	d
ddddddddddddZd ZdedefdZdee         defdZdedefdZdedeeeef         fd ZdMd"ed#edefd$Zd%Zd%ZdNd'ed(ed)edefd*Zd+efd,Z ed'          Z!ed&          Z"ed-          ed.          Z#ed/          Z$ed0          Z%ed1          Z&ed2          Z'ed3          Z(ed4          Z)ed5          Z*ed6          Z+ed7          Z,ed8          Z-ed9          Z.ed.          Z/ed/          Z0d:ed;ed<efd=Z1d>efd?Z2d:ed;ed<efd@Z3d:ed;ed<efdAZ4d:ed;ed<efdBZ5d:ed;ed<efdCZ6d:ed;ed<efdDZ7d:ed;ed<efdEZ8d:ed;ed+efdFZ9 G dG dHej:        j;                  Z<d+edIedefdJZ=dK Z>e?dLk    r e>             dS dS )Ou  Evolution API Webhook Listener — structured terminal output for humans & LLMs.

Features:
  - Print every event in a parseable structured format
  - MESSAGES_UPSERT: extract sender phone, profile name, message type, content
  - Save raw payloads to webhook-logs/YYYY-MM-DD/ organized by date
  - Handle all message types (text, image, video, audio, document, etc.)

Usage:
    python3 scripts/webhook-listener.py [port]

Defaults to port 9999. POSTs to /webhook.
    N)datetimetimezone)AnyOptionalz..zwebhook-logsz[0mz[1mz[2mz[38;5;245mz
[38;5;39mz
[38;5;15mz[38;5;220mz
[38;5;76mz[38;5;208mz[38;5;196mz[38;5;213mz
[38;5;81mz[38;5;119mz[38;5;187mz[38;5;244m)resetbolddimlabelkeyvalheadokwarnerrnamephonetypetsmetac                  .    t           D ]} dt           | <   dS )z>Disable all ANSI colors (for LLM-pipe mode or dumb terminals). N)C)ks    3/var/www/vendas_oficina/scripts/webhook-listener.py	no_colorsr   /   s&      !     jidreturnc                 @    | r|                      d          d         ndS )z>Extract phone number from JID like 555198228085@s.whatsapp.net@r   r   )split)r   s    r   extract_phoner"   7   s!     #+399S>>!+r   unix_tsc                     | sdS 	 t          j        | t          j                  }|                    d          S # t
          t          f$ r t          |           cY S w xY w)z(Format unix timestamp to ISO + relative.?)tzz%Y-%m-%dT%H:%M:%SZ)r   fromtimestampr   utcstrftimeOSError
ValueErrorstr)r#   dts     r   fmt_tsr.   <   sp     s#G==={{/000Z    7||s   4;  AAfull_idc                 N    | r t          |           dk    r| dd         dz   n| pdS )z!Shorten a message ID for display.   N      …r%   )len)r/   s    r   short_idr5   G   s4    #*Ts7||b/@/@73B3<%gnQTTr   msgc           
      N   | sdS i dddddddd	d
ddddddddddddddddddddddd d!d"d#d$d%d&d'd(d)}|                                 D ]\  }\  }}|                     ||                     |                                                    }|rH|d*k    rZ|                    d*|                    dt          |                              }|d+d,                             d-d.          ||fc S |dk    r,|                    d/d0          }|rd1|d+d2          nd3||fc S |dk    rI|                    d/d0          }|                    d4d5          }|rd6| d7|d+d2          nd6| d8||fc S |d
k    r=|                    d4d5          }|                    d9          rd:nd0}	d;| d<|	 d=||fc S |dk    r5|                    d>|                    d?d5                    }
d@|
 d=||fc S |dk    rdA||fc S |dBk    rW|                    dCi           }|                    d*d5          }|                    dDd5          d+dE         }dF| dG| ||fc S |dHk    r!|                    dId5          }dJ| d=||fc S |dk    r:|                    dKd5          }|                    dLd5          }dM| dN| d=||fc S |dk    r!|                    dOd5          }dP| d=||fc S |dk    rQ|                    dQi                               dR|                    d>d5                    }dS|d+dT          d=||fc S |dk    r=|                    dU|                    dVd5                    }dW|d+dT          d=||fc S |dk    r9|                    dXd5          }|                    dYd5          }dZ| | d=||fc S |d[k    rd\||fc S d]| d=||fc S | D ]"}|                    d^          rd]| d=|d_fc S #t          |           d+d2         d_d0fS )`zExtract (content_preview, message_type, subtype_detail) from message body.

    Handles: conversation, extendedTextMessage, imageMessage, videoMessage,
    audioMessage, documentMessage, stickerMessage, contactMessage, locationMessage,
    etc.
    )z[empty]unknownr   conversation)
text/plaintextextendedTextMessage)ztext/extendedr;   imageMessage)imagemediavideoMessage)videor?   audioMessage)audior?   documentMessage)documentr?   documentWithCaptionMessagestickerMessage)stickerr?   contactMessage)contactvcardlocationMessage)locationgeoliveLocationMessage)zlocation/liverN   buttonsMessage)buttonsinteractivebuttonsResponseMessage)zbuttons/responserR   listMessage)listrR   listResponseMessage)zlist/responserR   orderMessage)ordercommercepaymentMessage)paymentrY   )reactionr\   )protocolsystem)pollr_   )zpoll/updater_   )zgroup/inviter^   )zgroup/changer^   )reactionMessageprotocolMessagepollCreationMessagepollUpdateMessagegroupInviteMessagegroupChangeMessager;   Ni  
z\ncaptionr   z[image]    z[image]secondsr%   z[video zs] zs]pttz (voice)z[audios]titlefileNamez[document: z	[sticker]r`   r   id   z
reaction 'z' to rb   r   z[poll: degreesLatitudedegreesLongitudez
[location ,displayNamez
[contact: singleSelectReplyselectedRowIdz[list/select: d   selectedButtonIdselectedDisplayTextz	[button: totalAmount1000currencyCodez[order ra   z
[protocol][Messager8   )itemsgetlowerr,   replaceendswith)r6   type_mapmsg_typer
   categorysubr;   rg   durrj   r   r   
reacted_toqlatlngdisplayselectedtotalcurrencyr   s                        r   get_msg_contentr   L   sJ     *)).8 	* 	*	
 	* 	0 	%&; 	. 	. 	. 	7 	4 	!"E 	. 	?  	-!" 	1#$ 41/488/  H4 (0~~'7'7 27 27##5(ggh(8(8 9 9:: 0	76!!wwvsww~s3xx'H'HIITcT
**477IIII^++'')R006=L274C4=2229eU]^^^^^++'')R00ggi--=D[9#99'$3$-999J[TWJ[J[J[]bdlmmmm^++ggi--$'GGENN:jj---s---uh????...www
C(@(@AA-d---uh????---#UH5555...ggeR((wwvs++ WWT3//3
<T<<
<<eXNNNN222GGFC((&!x8888...gg/55gg0#661S1131115(CCCC---''-55/W///AAAA22277#6;;??QTQXQXY`beQfQfgg:$3$:::E8LLLL55577#5sww?TVY7Z7Z[[5HTcTN555uhGGGG^++ 137777>3774%4444eXFFFF...$eX6666$EeX6666a0	7f  , ,::i   	,HHHa++++	, HHTcTNIr**r     vmaxlenc                 l    | dS t          |           }t          |          |k    r|d|         dz   n|S )zSafely stringify a value.N   ∅r3   )r,   r4   )r   r   rk   s      r   label_vr      s=    yuAA!$Q&1WfW:a7r   u   ────────────────────────────────────────────────────────────r   r
   value	color_keyc           
          dt           d          |  dt           d          dt           |          t          |           t           d          	S )zColored key: value line.  r
   :r    )r   r   )r
   r   r   s      r   cvalr      sF    ['
[E[[AgJ[[9[wu~~[qQXz[[[r   datac                 z   |                      dd          }|                      dd          }|                      d          p|                      d          pi }t                       |r6dt          |                                          v rt	          |||           dS |r6dt          |                                          v rt          |||           dS |r6dt          |                                          v rt          |||           dS |r6d	t          |                                          v rt          |||           dS |r6d
t          |                                          v rt          |||           dS |r6dt          |                                          v rt          |||           dS |r6dt          |                                          v rt          |||           dS |dk    r5t          dt          d          dt           d| d| dt           
           dS t          |||            dS )z8Route webhook payload to appropriate structured display.eventr%   instancer   payloadzmessages.upsertzmessages.setzmessages.deletezsend.messagezconnection.updateqrcodecallAPPLICATION_STARTUPr   r   EVENT   z | z | Evolution API startedN)r   printr,   r   _print_messages_upsert_print_messages_set_print_messages_delete_print_send_message_print_connection_update_print_qrcode_print_callr   r   N_print_generic)r   r   r   
event_datas       r   print_eventr      si   HHWc""Exx
C((H &!!>TXXi%8%8>BJ	GGG ."c%jj&6&6&8&888uh
;;;;;	 .>SZZ%5%5%7%777E8Z88888	 .$E

(8(8(:(:::uh
;;;;;	 .>SZZ%5%5%7%777E8Z88888	 
.&#e***:*:*<*<<< *=====	 .8s5zz//1111eXz22222	 .6SZZ--////E8Z00000	'	'	'Z1T7ZZZZ5ZZXZZWXZZ[[[[[ 	uh-----r   r   r   r   r   r   r   r   r	   r   r   r   r   r   r   r   r   c                    t          |t                    r|n|g}|D ]]}t          |t                    s|                    di           }|                    dd          }|                    dd          }|                    dd          }|                    dd          p|                    dd          }	t	          |	p|          }
|                    dd          }|                    d	          }|                    d
d          }|                    dd          }|                    dd          }|                    di           }d|v }t          |          \  }}}t          |          }|rt           dt           nt           dt           }|rdnd}t          dt           d| d| dt                      t          dt           dt                      t          dt           dt           dt           dt                      t          dt           dt           dt           dt           dt           |
 t                      |	r|sdt	          |           dnd}|	rMt          dt           dt           dt           dt           dt           t	          |	           t                      |rOt	          |          }t          dt           dt           dt           d t           d!t           | t                      |rMt          dt           dt           dt           d"t           d#t           t	          |           t                      t          dt           dt           dt           d$t           dt            |pd% t                      |                    d&|                    d'd                    }|rAt          dt           dt           dt           d(t           d#t            | t                      n?t          dt           dt           dt           d(t           d#t           d)t                      t          dt           dt                      t          dt           dt           dt           d*t                      t          dt           dt           dt           d+t           d,t"           | t                      t          dt           dt           dt           d-t           d.t"           | t                      t          dt           dt           dt           d/t           d#t$           | t                      t          dt           dt           dt           d0t           dt           t'          |           t                      t          dt           dt                      t          dt           dt           dt           d1t                      t          dt           dt           dt           d2t           d!t(           | t                      t          dt           dt           dt           d3t           d,t           |pd t                      t          dt           dt                      t          dt           dt           dt           d4t                      t          dt           dt           dt           d5t           dt           |  t                      t          dt           dt           dt           d6t           d.t           | t                      t          dt           dt           dt           d7t           d8t           | t                      t          dt           dt           dt           d9t           d8t           |pd t                      t          dt           dt           dt           d:t           d,t           |
 t                      t          dt           dt                      t          dt           d;t                      t                       t+          | ||
|pd<|pd<||d=||||d>||d?|||d@dA           _d<S )Bu:   Structured display for MESSAGES_UPSERT — the main event.r   	remoteJidr   fromMeFro   participantpushNamemessageTimestampmessageTyper%   sourcestatusmessagez@g.usOUTGOINGINCOMINGu   ▶u   ◀r   u
   ╔══ z
  MESSAGE u^    ═══════════════════════════════u   ║SENDERzPhone:z        z ()zIn Group As:r   z
Group JID:    zSent To:      zProfile Name:r   usernameverifiedNamez	Username:z(not available in payload yet)MESSAGEType:z	         z	Category:     Content:zMessage ID:TIMELINEz
Timestamp:zUnix:METAEvent:	Instance:zSource:       Status:Chat:u   ╚══ MESSAGE END ════════════════════════════════════════N)r   profileNamer   r   r   )r   r   contentro   )	timestampunix)r   r   isGroup)_event	_instancesenderr   timeliner   )
isinstancerU   dictr   r"   r   r.   _OK_N_WARNr   _HEAD_BOLD_LABEL_PHONE_DIM_NAME_TYPE_VALr5   _TS_print_llm_block)r   r   r   msgsmsg_datar   
remote_jidfrom_memsg_idr   r   	push_namemsg_timestampr   r   r   msg_bodyis_groupr   	rich_typer   formatted_ts	directiondirection_iconwhatgroup_phoner   s                              r   r   r      sz	    $J55G::J<D f f(D)) 	ll5"%%WW["--
''(E**r""ggmR00SHLLPR4S4Sk7Z88LLR00	 %788<<s33h,,h++<<	2..j( (7x'@'@$Hm,, -4Os((B(((E9O9O29O9O	")4u 	  l5  l  lN  l  li  l  l  hj  l  l  	m  	m  	m!5!!R!!""" 	4544R4454444555P5PPRPP6PPPPVPUPBPPQQQ4?WW0M*--0000UW 	ljujjjjvjj2jj&j-XcJdJdjfhjjkkk 	Z'
33KXuXXXXvXXXXX{XTVXXYYY 	jhuhhhhvhhrhhhWaIbIbhdfhhiii]5]]R]]6]]]]e]YEWRW]Y[]]^^^<<
HLL,L,LMM 	lWuWWWWvWWWW%WWSUWWXXXXjujjjjvjjjj$jjfhjjkkk 	!5!!R!!"""5555R5555555666S5SSRSS6SSSSUSISrSSTTTR5RRRRR6RRBRRURHRbRRSSSP5PPRPP6PP2PPTP7PBPPQQQY5YYRYY6YYbYYTY8FCSCSYUWYYZZZ 	!5!!R!!"""6566R66566"66777T5TTRTT6TTRTTST,TPRTTUUU]5]]R]]6]]]]T]=CWTW]Y[]]^^^ 	!5!!R!!"""2522R22522b22333N5NNRNN6NNNNTN5N"NNOOOQ5QQRQQ6QQBQQTQ8QRQQRRRO5OOROO6OO"OOTO6O2OOPPPV5VVRVV6VV"VVTV6=SVRTVVWWWN5NNRNN6NNNNTN5N"NNOOO!5!!R!!"""  m5  m  m  ik  m  m  	n  	n  	n 	!(0D$,!'  "$"	  *% 
 ! # )
 
 	 	 	 	[f fr   objc                    dt           t           dt                      t           t           dt           dt           |                     dd           t                      t           t           dt           dt           |                     dd           t                      dd
t
          dt          ffd |                     di           d            |                     di           d            |                     di           d            |                     di           d           t           t           dt                      dS )u   Print a YAML-like structured block for LLMs/SLMs.

    No ANSI codes — pure parseable format. Every LLM block starts and
    ends with a marker line for easy extraction.
    r   z<llm>zevent:r   r   r%   z	instance:r   r   r   depthc                    d|z  z   }|                                  D ]\  }}|                    d          rt          |t                    r2t	          | t
           | dt                       ||dz              b|3t	          | t
           | dt           dt           dt           	           t	          | t
           | dt           dt           | t           	           d S )Nr   _r      r   null)	r~   
startswithr   r   r   _KEYr   r   r   )r   r   pfxr   r   _dumpindents        r   r  z_print_llm_block.<locals>._dumpk  s   te|#IIKK 		< 		<DAq||C   !T"" <,d,A,,,,---a####;d;A;;;;T;;r;;<<<<:d:A::::T:1:b::;;;;		< 		<r   r   r   r   r   r   z</llm>N)r   )r   _METAr   r   r   r   int)r   r  r  s    @@r   r   r   `  s    F	V
%U
%
%
%
%&&&	V
IU
I
I"
I
It
ISWWXs-C-C
IR
I
IJJJ	V
OU
O
OR
O
O$
OS0I0I
O2
O
OPPP< <4 < < < < < < < < 
E#''(B

###	E#'')R
 
 !$$$	E#''*b
!
!1%%%	E#''&"

q!!!	V
&U
&
&"
&
&'''''r   c           
         t          dt           dt                      t          dt           dt           dt           |  t                      t          dt           dt           dt           | t                      t          |t                    rt          |          nd}t          dt           dt           dt           | t                      d S )	Nr   u   ══ MESSAGES SET ══════════════════════════════════════r   r   r   r   r   z	Messages:)r   r   r   r   r   r   rU   r4   )r   r   r   counts       r   r   r     s    	  au  a  a  ]_  a  a  b  b  b	
6v
6
6R
6
6T
65
6"
6
6777	
9v
9
9
9
9T
98
9R
9
9:::)*d;;BC
OOOE	
6v
6
6
6
6T
65
6"
6
677777r   c                 V   t          |t                    r|n|g}|D ]}t          |t                    r|                    di           ni }t	          |                    dd                    }t          dt           dt                      t          dt           dt           dt           |  t           dt           d	t           d
t           | t                      t          dt           dt           dt           |pd t                      t          dt           dt           dt           |                    dd           t                      t          dt           dt           dt           t          |                    dd                     t                      d S )Nr   r   r   r   u   ══ MESSAGE DELETED ════════════════════════════════════r   r     |  r   r   r   r   r%   zFrom Me:r   zMsg ID:r   ro   )r   rU   r   r   r"   r   r   r   r   r   r   r   r5   )r   r   r   r   r6   r   r   s          r   r   r     s   #J55G::J<D R R$.sD$9$9AcggeR   rCGGK4455  b5  b  b  ^`  b  b  	c  	c  	ci6iiiiiuibiiviiPRiiUYi[ciegiijjjA6AAAAAARAABBBK6KK2KKKswwx/E/EKrKKLLLP6PP"PPPxb8I8I/J/JPBPPQQQQR Rr   c                 N   t          |t                    r|                    di           ni }t          |                    dd                    }|                    dd          }t	          t          |t                    r|                    di           ni           \  }}}t          dt           dt                      t          dt           d	t           d
t           |  t           dt           dt           dt           | t                      t          dt           dt           dt           | t                      t          dt           dt           dt           | t                      t          dt           dt           dt           | t                      d S )Nr   r   r   r   r%   r   r   u   ══ SENT MESSAGE ═══════════════════════════════════════r   r   r	  r   r   zTo:r   r   r   r   )r   r   r   r"   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   s           r   r   r     s   '1*d'C'C
K*..
#
#
#C#''+r2233E~~mS11H#ZPZ\`EaEa$iJNN9b$A$A$AgijjMGQ	  du  d  d  `b  d  d  e  e  e	
ev
e
eR
e
eT
e5
e"
e
e6
e
eB
e
eQU
eW_
eac
e
efff	
8v
8
8"
8
8V
8U
8B
8
8999	
:v
:
:B
:
:U
:H
:b
:
:;;;	
8v
8
8r
8
8T
87
8B
8
899999r   c                    |                     dd          }|                     dd          }t          dt           dt                      ddd	d
d                     t	          |                                          d          }t          dt           dt           dt           |  t           dt           dt           dt           | t                      t          dt           dt           d| dt           | t           
           |r2t          dt           dt           dt           | t                      d S d S )Nstater%   r   r   r   u   ══ CONNECTION UPDATE ═══════════════════════════════════u   🟢u   🔴u   🟡u   🟠)openclose
connectingdisconnectingu   ⚪r   r   r	  r   r   zState:r   r   )	r   r   r   r   r,   r   r   r   r   )r   r   r   r  r   icons         r   r   r     su   NN7C((E^^Hb))F	  ]u  ]  ]  Y[  ]  ]  ^  ^  ^V6TZ[[__`cdi`j`j`p`p`r`rtyzzD	
ev
e
eR
e
eT
e5
e"
e
e6
e
eB
e
eQU
eW_
eac
e
efff	
=v
=
=R
=
=T
=
=D
=%
=
=
=>>> =;6;;";;;v;r;;<<<<<= =r   c                    |                     d|                     dd                    }|                     dd          }t          dt           dt                      t          dt           dt           d	t
           |  t           d
t           dt           dt
           | t                      t          |t                    rCt          |          dk    r0t          dt
           dt          |           dt                      n=t          dt           dt           dt
           t          |           t                      |r2t          dt           dt           dt           | t                      d S d S )Nr   coder%   pairingCoder   r   u   ══ QR CODE ════════════════════════════════════════════r   r   r	  r   r   (   z  [QR code base64, z chars]zCode:r   zPairing:)r   r   r   r   r   r   r   r,   r4   r   r   )r   r   r   r  pairings        r   r   r     s   >>(JNN63$?$?@@Dnn]B//G	  nu  n  n  jl  n  n  o  o  o	
ev
e
eR
e
eT
e5
e"
e
e6
e
eB
e
eQU
eW_
eac
e
efff$ DTRB4BBCIIBBbBBCCCCB6BBBBBwt}}BbBBCCC ?=6==2======>>>>>? ?r   c                    |                     dd          }t          |          }|                     dd          }|                     d|                     dd                    }t          dt           dt                      t          dt
           d	t           d
t           |  t           dt
           dt           dt           | t                      t          dt
           dt           dt           | t                      t          dt
           dt           dt           | t                      t          dt
           dt           dt           | t                      d S )Nfromr   r   r%   durationtimer   u   ══ CALL ═══════════════════════════════════════════════r   r   r	  r   r   zFrom:r   r   r   z	Duration:)r   r"   r   r   r   r   r   r   )r   r   r   from_jidr   r   r  s          r   r   r     s   ~~fb))H(##E^^Hc**F~~j*..*E*EFFH	  tu  t  t  pr  t  t  u  u  u	
ev
e
eR
e
eT
e5
e"
e
e6
e
eB
e
eQU
eW_
eac
e
efff	
8v
8
8B
8
8V
8U
8B
8
8999	
7v
7
7b
7
7T
76
72
7
7888	
9v
9
9
9
9T
98
9R
9
9:::::r   c                 4   d |                                 D             }|sddi}t          dt           d|  dt                      t          dt           dt           dt
           |  t           d	t           d
t           dt
           | t                      t          |                                           dd         D ]7\  }}t          dt           | dt           dt           | t           	           8t          dt           dt                      dS )u2   Fallback for unknown events — dump first 3 keys.c                 n    i | ]2\  }}|                     d           |t          |          dd         3S )r   Nx   )r   r,   ).0r   r   s      r   
<dictcomp>z"_print_generic.<locals>.<dictcomp>  s=    SSSTQcARARSCFF4C4LSSSr   _notezempty payloadr   u   ══ EVENT (uq   ) ═════════════════════════════════════r   r   r	  r   r   N   r   z  (full payload saved to file))	r~   r   r   r   r   r   rU   r   r  )r   r   r   	truncatedr   r   s         r   r   r     s[   SSTZZ\\SSSI /o.		  au  a  aE  a  a  ]_  a  a  b  b  b	
ev
e
eR
e
eT
e5
e"
e
e6
e
eB
e
eQU
eW_
eac
e
efffY__&&''+ 3 31161111r11D1!1R112222	
8u
8
8B
8
899999r   c                        e Zd Zd Zd Zd ZdS )Handlerc                    t          | j                            dd                    }|r| j                            |          nd}	 t          j        |          }n-# t
          j        $ r d|                    d          i}Y nw xY wt          || j
        d                   }t          dt           d| t                      t          |           |                     d	           |                     d
d           |                                  | j                            t          j        ddi                                                     d S )NzContent-Lengthr   s   {}_rawr   )errorsr   u   ├─ saved → rh   Content-Typezapplication/jsonr   T)r  headersr   rfilereadjsonloadsJSONDecodeErrordecodesave_payloadclient_addressr   r   r   r   send_responsesend_headerend_headerswfilewritedumpsencode)selflengthbodyr   paths        r   do_POSTzHandler.do_POST  sM   T\%%&6::;;*0;tzv&&&e	;:d##DD# 	; 	; 	;DKKyK99:DDD	; D$"5a"8994444$444555D3);<<<
T4L1188::;;;;;s   A 'BBc                     |                      d           |                     dd           |                                  | j                            d           d S )Nrh   r)  r:   s(   Evolution API webhook listener running.
)r3  r4  r5  r6  r7  )r:  s    r   do_GETzHandler.do_GET  s[    3666
EFFFFFr   c                     d S )N )r:  fmtargss      r   log_messagezHandler.log_message  s    r   N)__name__
__module____qualname__r>  r@  rE  rB  r   r   r%  r%    sD        < < <$G G G    r   r%  remotec                 0   t          j                    }t          j                            t
          |                    d                    }t          j        |d           |                    d          dt          j	                    j
        d d          dz   }t          j                            ||          }|                                |d| d	}t          |d
          5 }t          j        ||dd           d d d            n# 1 swxY w Y   |S )Nz%Y-%m-%dT)exist_okz%H-%M-%S-rp   z.json)received_atrI  )_metar   w   F)r  ensure_ascii)r   nowosr=  joinLOG_DIRr)   makedirsuuiduuid4hex	isoformatr  r-  dump)r   rI  rR  date_dirfnamer=  r   fs           r   r1  r1    s.   
,..Cw||GS\\*%=%=>>HK4((((LL$$'F4:<<+;BQB+?'F'F'FFE7<<%((D!$FCC G 
dC <A	'1QU;;;;< < < < < < < < < < < < < < <Ks   &DDDc                     t          t          j                  dk    rt          t          j        d                   nd} t          j                                        st                       t          dt           dt                      t          dt           dt           dt           d|  dt           
           t          dt           d	t           d
t           t          j                            t                      dt           	           t          dt           dt           dt           dt                      t          dt           dt                      t"          j                            d| ft(                    }	 |                                 d S # t,          $ r7 t          dt.           dt                      |                                 Y d S w xY w)Nr   i'  r   uw   ══ EVOLUTION API WEBHOOK LISTENER ═══════════════════════════zListen:r   zhttp://0.0.0.0:z/webhookzSave logs to:r   /zFormat:zHuman color + LLM yaml blocku   ══════════════════════════════════════════════════════════════z0.0.0.0z
  zStopped.)r4   sysargvr  stdoutisattyr   r   r   r   r   r   r   rS  r=  abspathrU  httpserver
HTTPServerr%  serve_foreverKeyboardInterruptr   server_close)portrg  s     r   mainrm    s   "38}}q003sx{dD : 	  Ru  R  R  NP  R  R  S  S  S	
Ov
O
Ob
O
O
O
OT
O
O2
O
OPPP	
Nv
N
NB
N
N
Nrww/G/G
N
N"
N
NOOO	
Nv
N
Nb
N
N
N
N"
N
NOOO	  Uu  U  U  QS  U  U  V  V  V[##Y$5w??F   (U((B(()))s   F =GG__main__)r   )r   )@__doc__http.serverrf  r-  rS  rera  rW  r   r   typingr   r   r=  rT  dirname__file__rU  r   r   r,   r"   r  r.   r5   r   tupler   r   
HEADER_BAR
FOOTER_BARr   r   r   r   r   _RESETr   r   r   r   r   r   r   r   _ERRr  r   r   r   r   r   r   r   r   r   r   r   rg  BaseHTTPRequestHandlerr%  r1  rm  rF  rB  r   r   <module>r{     s         				 				 



  ' ' ' ' ' ' ' '                 ',,rwx00$
G
G 

 &  ,s ,s , , , ,
HSM c    Uc Uc U U U U
]+ ]+%S#"6 ]+ ]+ ]+ ]+@8 8s 8C 8# 8 8 8 8 

\ \ \C \C \C \ \ \ \
.d . . . .B gJ
E(}V9!ai!!gJV9gJV9	
4l
E(}
E(}	
4lV9
E(}V9V9	'
_k# k k$ k k k k\($ ( ( ( (>8s 8c 8t 8 8 8 8	R# 	R 	R$ 	R 	R 	R 	R	:s 	:c 	:t 	: 	: 	: 	:=C =3 =D = = = =
? 
? 
? 
? 
? 
? 
?	;s 	;c 	;t 	; 	; 	; 	;	:# 	: 	:D 	: 	: 	: 	:    dk0   :t S S      * zDFFFFF r   