
    -Gh               
       P   d dl m Z mZ d dlmZ d dlmZmZmZ d dlZd dl	Z	d dl
mZmZmZ d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dlZd dlZd dlZd Z eej2                  j5                  d	d
      ej2                  j5                  dd       eej2                  j5                  dd                   Z eej2                  j5                  dd      e      Z edd      Z eej2                  j5                  dd            Zej2                  j5                  dd      Z eej2                  j5                  dd            Zg Z ej2                  j5                  dd      Z!da"ejF                  jI                  e%       dej2                  j5                  dd        Z&d! Z'd" Z( e ed#       ed$d%&      '      d(        Z)d) Z* e	j                  e	jV                  e*        e	j                  e	jX                  e*       d* Z- ej\                  e-       d.d+Z/d, Z0e1d-k(  r e0        yy)/    )timesleep)Redis)WorkerQueueget_current_jobN)retrywait_exponentialstop_after_attempt)setup_logger)generate_dedupe_keyc                     t        t        j                               | d<   t        j                  | d      j                  d      }t        j                  |      j                         S )N	unique_idT)	sort_keyszutf-8)	struuiduuid4jsondumpsencodehashlibmd5	hexdigest)job_data
job_strings     >/var/www/trellinator.diamondhoofcare.com/public_html/worker.pygenerate_md5_hashr      sJ    

-H[H5<<WEJ;;z",,..    
REDIS_HOST	localhost
REDIS_PORT6379REDIS_DB)hostportdbREDIS_QUEUEztrello-notifications
connectionworkerz
worker.log)log_fileMAX_JOBS_PER_MINUTE   	REDIS_KEYjob_count_last_minuteTIMEOUTiX  GAS_WEBHOOK_URLz3https://script.google.com/macros/s/{script-id}/execF/SID_FILE_PATHz	sids.jsonc                      t         j                  j                  t              sy t	        t        d      5 } t        j                  |       }|r|d   d   nd cd d d        S # 1 sw Y   y xY w)Nrsid)ospathexistsr3   openr   load)filedatas     r   get_latest_sidr?   /   sR    77>>-(	mS	! 1Tyy"&tBxD1 1 1s   !A  A)c                  4   t        t                     } t        j                  t        d| dz
         t        j                  t              }t        j                  d| dt                |t        k  r&t        j                  t        t        |       | i       yy)Nz-inf   zJOB COUNT : z || MAX_JOBS_PER_MINUTE : TF)intr   rediszremrangebyscorer.   zcardloggerinfor,   zaddr   )current_time	job_counts     r   can_process_jobrK   7   su    tv;L	9flR.?@I&I
KK,yk)CDWCXYZ&&

9s<0,?@r         <   )minmax)stopwaitc                 2   	 t        j                  t        j                  dt	                     |       }|j                          t        j                  d       y # t         j                  j                  $ r}t        j                  d|         d }~ww xY w)Nz{script-id})r   z1Successfully sent job data to Google Apps Script.zFailed to send data to GAS: )requestspostr1   replacer?   raise_for_statusrF   rG   
exceptionsRequestExceptionerror)r   responsees      r   send_to_gasr]   D   st    ==!8!8HX!Y`hi!!#GH// 3A378s   AA B8BBc                 H    da t        j                  d       t        d       y )NTz&Gracefully shutting down the worker...   )graceful_shutdownrF   rG   r   )signalframes     r   handle_shutdownrc   O   s    
KK89	!Hr   c                  <    t         rt        j                  d       y y )Nz+Worker shutting down, cleaning resources...)r`   rF   rG    r   r   cleanup_on_exitrf   Z   s    AB r   c                 P   	 t               }|rDt        j                  d|j                   dt	        j
                          d|j                          t        j                  d|j                   dt	        j
                          d|j                          t               rt        |       }t        j                  d|        t        j                  d|       rt        j                  d       y t        j                  d| dd	       t        j                  d
       t        |        y t        j                  dd      }dt        t!                     dz  z
  }t        j                  dt#        ||       d       t%        t#        ||             t'        | d       y # t(        $ r|}t        j+                  d|        t-        |       }| j                  dd      }|dk  r8|dz   | d<   t%        t        j                  dd             t'        | d       Y d }~y Y d }~y d }~ww xY w)NzCALLBACK :: Processing job id: z | worker id: z | worker name: zProcessing job id: zHash: z	job-hash-zDuplicate Jobi  	processedzProcessing job...rM      
   zMRate limit reached, bursting possible jobs. Waiting for the rate to reset in z...TzError: retriesr   )r   rF   rG   idr8   getpidworker_namerK   r   rC   getsetexr]   randomrandintrB   r   rO   r   process_job	ExceptionrZ   r   )	r   callbackjobjob_hashburst_wait_time	time_leftr\   keyrk   s	            r   rs   rs   a   s    (KK9#&&PRPYPYP[}\lmpm|m|l}~)#&&		}L\]`]l]l\mno'18;;z*+ii)H:./[[);;8*-t[A;;*+x $nnQ2Oc$&kB./IKKghkl{  ~G  iH  hI  IL  M  N #oy12$' (wqc]#!(+,,y!,a<")A+HY&..A&'$'' 	(s&   C.F  1:F  ,A3F   	H%)A-H  H%c                     t        t        gt              } t        sB	 | j	                  d       t        ry t
        j                  d       t        d       t        sAy y # t        r Y y t
        j                  d       t        d       w xY w)Nr(   T)burstz3Nothing to process, taking a break for 3 seconds...ri   )r   queuerC   r`   workrF   rG   r   )r*   s    r   mainr      sf    UG.F	KKdK# KKMN!H   !KKMN!Hs   A   B*!B__main__)F)2r   r   rC   r   rqr   r   r   rT   ra   tenacityr	   r
   r   atexitr8   r   rq   rF   r   brokerr   r   r   r   environro   rB   r}   r,   r.   r0   JOBSr1   r`   r9   dirname__file__r3   r?   rK   r]   rc   SIGINTSIGTERMrf   registerrs   r   __name__re   r   r   <module>r      s     - -   @ @  	    &   / 	2::>>,<::>>,7RZZ^^J23	5 	bjjnn],BCPUV 
h	6 "**..)>CD JJNN;(?@	
bjjnnY,
-	 **..!24ij  77??8,-Qrzz~~o{/[.\]1
 q!(8QB(GH I fmm_ - fnno .C   !(J	 zF r   