
-»šjÒ'  ã               @   sñ  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 d d l	 m
 Z
 e j j e j j e ƒ ƒ Z e j j e d ƒ Z d d „  Z e e ƒ Z e j d d	 ƒ Z e j d
 d	 ƒ Z e j d d	 ƒ Z e ƒ  Z xH e j d d	 ƒ j d ƒ D]+ Z e j ƒ  Z e re j e e ƒ ƒ qWd e e j d d ƒ ƒ f d e e j d d ƒ ƒ f g Z e e j d d ƒ ƒ Z  e e j d d ƒ ƒ Z! d Z" d e d Z# d Z$ i  Z% i  Z& i  Z' e j( ƒ  Z) d d „  Z* d d „  Z+ d  d! d" „ Z, d# d$ „  Z- d% d& „  Z. d' d( „  Z/ d d) d* „ Z0 d d+ d, „ Z1 d- d. „  Z2 d/ d0 „  Z3 d  d1 d2 „ Z4 d d3 d4 „ Z5 d5 d6 „  Z6 d7 d8 „  Z7 d9 d: „  Z8 d; d< „  Z9 d= d> „  Z: d? d@ „  Z; dA dB „  Z< e= dC k ríe< ƒ  d S)Dai  
Bot Telegram para los SAI Delta InsightPower.

/estado    -> botones para consultar DELTA1 o DELTA2 (respuesta desde cache).
Boton Actualizar -> fuerza consulta SNMP nueva.
Vigilancia -> sondea en segundo plano, alimenta la cache y avisa
              solo cuando un SAI cambia de estado.

Compatible Python 3.5. Requiere delta_status.py y formato.py al lado.
é    N)Úleer_sai)Úformatear_telegramz.envc             C   s»   i  } t  j j |  ƒ s | St |  d ƒ �‰ } x | D]w } | j ƒ  } | s5 | j d ƒ s5 d | k rl q5 | j d ƒ \ } } } | j ƒ  j d ƒ j d ƒ | | j ƒ  <q5 WWd  QRX| S)NÚrú#ú=ú"ú')ÚosÚpathÚexistsÚopenÚstripÚ
startswithÚ	partition)ZrutaZvaloresÚfZlineaZclaveÚ_Zvalor© r   ú
sai_bot.pyÚ
cargar_env   s    "3r   ZSAI_BOT_TOKENÚ ZSAI_COMMUNITYZSAI_HOSTZ	SAI_CHATSú,ZDELTA1ZSAI_PUERTO_1Z16161ZDELTA2ZSAI_PUERTO_2Z16162ZSAI_INTERVALOZ60ZSAI_CACHE_TTLZ90é   zhttps://api.telegram.org/botú/é   c          
   C   s(   t  � t j ƒ  | f t |  <Wd  QRXd  S)N)Ú
CACHE_LOCKÚtimeÚCACHE)ÚnombreÚdatosr   r   r   Úguardar_cacheP   s    r   c          	   C   sW   t  � t j |  ƒ } Wd QRX| s' d S| \ } } t j ƒ  | t k rM d S| | f S)z0Devuelve (ts, datos) si hay dato fresco, o None.N)r   r   Úgetr   Ú	CACHE_TTL)r   ÚentradaÚtsr   r   r   r   Ú
leer_cacheU   s    r$   Fc             C   se   | s3 t  |  ƒ } | d k	 r3 | d | d d f St t | t ƒ } t |  | ƒ | t j ƒ  d f S)zDevuelve (datos, ts, de_cache).Né   r   TF)r$   r   ÚHOSTÚ	COMMUNITYr   r   )r   ÚpuertoÚforzarr"   r   r   r   r   Úobtenera   s    r*   c             K   s•   y3 t  j t |  d | d t d ƒ} | j ƒ  } Wn  t k
 rU t j ƒ  d  SYn X| j d ƒ sˆ t	 d j
 |  | j d ƒ ƒ ƒ d  S| j d ƒ S)NÚjsonÚtimeouté
   ÚokzAPI {0} error: {1}ZdescriptionÚresult)ÚrequestsZpostÚAPIÚTIMEOUT_POLLr+   Ú	ExceptionÚ	tracebackÚ	print_excr    ÚprintÚformat)ZmetodoZparamsr   r   r   r   r   Úapio   s    #
	r8   c              C   sG   g  }  x1 t  D]) \ } } |  j d | d d | i ƒ q Wd |  g i S)NÚtextÚcallback_datazsai:Úinline_keyboard)ÚSAISÚappend)ZfilaÚetiquetaZ_puertor   r   r   Úteclado_menu|   s    !r?   c             C   s/   d d d d d |  i d d d d i g g i S)Nr;   r9   u   ðŸ”„ Actualizarr:   znew:u
   â¬… VolverÚmenur   )Údestinor   r   r   Úteclado_resultadoƒ   s    rB   c             C   s(   t  d d |  d | d | d d d d ƒS)	NZsendMessageÚchat_idr9   Úreply_markupÚ
parse_modeÚHTMLZprotect_contentT)r8   )rC   ÚtextoÚteclador   r   r   ÚenviarŒ   s    rI   c             C   s(   t  d d |  d | d | d | d d ƒS)NZeditMessageTextrC   Ú
message_idr9   rD   rE   rF   )r8   )rC   rJ   rG   rH   r   r   r   Úeditar‘   s    rK   c             C   s"   x t  D] } t | |  ƒ q Wd S)z5Manda el mismo mensaje a todos los chats autorizados.N)ÚCHATS_OKrI   )rG   rC   r   r   r   Údifundir–   s    rM   c             C   s
   |  t  k S)N)rL   )rC   r   r   r   Ú
autorizadož   s    rN   c       	      C   s‘   x€ t  D]x \ } } | |  k r t | | | ƒ \ } } } t | | | ƒ } | r{ t t j ƒ  | ƒ } | d j | ƒ 7} | Sq Wd t |  ƒ S)NzI
<i>Dato de hace {0} s. Pulsa Actualizar para consultar el SAI ahora.</i>zSAI desconocido: )r<   r*   r   Úintr   r7   Ústr)	r>   r)   r   r(   r   r#   Zde_cacherG   Zedadr   r   r   Útexto_estado¢   s    	
rQ   c             C   s<   d } | r% t  |  | | t ƒ  ƒ n t |  | t ƒ  ƒ d  S)Nu(   âš¡ <b>Estado de los SAI</b>

Elige uno:)rK   r?   rI   )rC   rJ   rG   r   r   r   r@   ¯   s    r@   c             C   s¡   |  d d } |  j  d d ƒ j ƒ  j ƒ  } d | k rK | j d ƒ d } t | ƒ sq t d j | | ƒ ƒ d  St d j | | ƒ ƒ | d k r� t | ƒ d  S)NÚchatÚidr9   r   ú@r   zchat NO autorizado: {0} ({1})zchat {0}: {1}ú/estadoú/startú/sai)rU   rV   rW   )r    r   ÚlowerÚsplitrN   r6   r7   r@   )ÚmsgrC   rG   r   r   r   Úprocesar_mensaje·   s    r[   c             C   s  |  d d d } |  d d } t  d d |  d ƒt | ƒ sW t d j | ƒ ƒ d  S|  j d d	 ƒ } | d
 k r† t | | ƒ d  S| j d ƒ s¤ | j d ƒ r	| j d ƒ } | j d d ƒ d } | rç t | | d | d ƒ t | | t	 | | ƒ t
 | ƒ ƒ d  S)NÚmessagerR   rS   rJ   ZanswerCallbackQueryZcallback_query_idzcallback NO autorizado: {0}Údatar   r@   zsai:znew:ú:r%   zConsultando z...)r8   rN   r6   r7   r    r@   r   rY   rK   rQ   rB   )ÚcbrC   rJ   Zdator)   rA   r   r   r   Úprocesar_callbackÇ   s"    r`   c             C   sP   |  j  d ƒ s d S|  j  d ƒ r& d S|  j  d ƒ r9 d S|  j  d ƒ rL d Sd S)	Nr.   Úsin_respuestaZ
en_bateriaÚbateriaZ	en_bypassÚbypassÚbat_criticaÚnormal)r    )Údr   r   r   Úclave_estadoã   s    rg   c             C   s£   | d k r d j  |  ƒ S| d k r2 d j  |  ƒ S| d k rK d j  |  ƒ S| d k rd d j  |  ƒ S| d k r} d	 j  |  ƒ S| d k r– d
 j  |  ƒ Sd j  |  ƒ S)Nrb   u2   ðŸ”´ <b>{0} EN DESCARGA</b>
Ha entrado en bateria.rc   u7   ðŸŸ  <b>{0} EN BYPASS</b>
La carga esta sin proteccion.rd   u   ðŸŸ  <b>{0} BATERIA CRITICA</b>ra   u4   âš ï¸� <b>{0} NO RESPONDE</b>
Sin contestacion SNMP.u;   ðŸŸ¢ <b>{0} RED RESTABLECIDA</b>
Ha vuelto a red electrica.u"   ðŸŸ¢ <b>{0} VUELVE A RESPONDER</b>u   ðŸŸ¢ <b>{0} NORMAL</b>)r7   )r   ÚprevioÚnuevor   r   r   Úcabeceraï   s"    rj   c             C   sB  t  t | t ƒ } t |  | ƒ t | ƒ } | d k rh t j |  d ƒ d t |  <t |  t k  rr d  Sn
 d t |  <t j |  ƒ } | d  k rä | t |  <t	 d j
 |  | ƒ ƒ | d k rà t t |  | | ƒ d t | |  ƒ ƒ d  S| | k rô d  S| t |  <t	 d j
 |  | | ƒ ƒ t t |  | | ƒ d t | |  ƒ ƒ d  S)Nra   r   r%   z"vigilancia {0}: estado inicial {1}re   z

zvigilancia {0}: {1} -> {2})r   r&   r'   r   rg   ÚFALLOSr    ÚFALLOS_PARA_AVISARÚESTADO_PREVIOr6   r7   rM   rj   r   )r   r(   rf   ri   rh   r   r   r   Úrevisar  s,    

$
rn   c              C   su   t  d j t t ƒ ƒ xX xD t D]< \ }  } y t |  | ƒ Wq  t k
 r[ t j ƒ  Yq  Xq  Wt	 j
 t ƒ q Wd  S)Nz)Vigilancia activa cada {0} s, cache {1} s)r6   r7   Ú	INTERVALOr!   r<   rn   r3   r4   r5   r   Úsleep)r   r(   r   r   r   Úvigilar*  s    	rq   c              C   s³  t  s t s t r, t d ƒ t j d ƒ t sI t d ƒ t j d ƒ t d ƒ }  |  sr t d ƒ t j d ƒ t d j |  j	 d ƒ ƒ ƒ t d j t
 t ƒ ƒ ƒ t j d	 t ƒ } d
 | _ | j ƒ  d  } xÚ yŽ t d d | d t ƒ} | d  k rt j d ƒ wÕ xS | D]K } | d d } d | k rDt | d ƒ qd | k rt | d ƒ qWWqÕ t k
 r‚t d ƒ PYqÕ t k
 rªt j ƒ  t j d ƒ YqÕ XqÕ Wd  S)Nz5Falta SAI_BOT_TOKEN, SAI_COMMUNITY o SAI_HOST en .envr%   z4SAI_CHATS vacio en .env: define el chat_id del grupoZgetMez3No se pudo contactar con Telegram. Revisa el token.zBot arrancado: @{0}ZusernamezChats autorizados: {0}ÚtargetTZ
getUpdatesÚoffsetr,   é   Z	update_idr\   Zcallback_queryzparado por el usuario)ÚTOKENr'   r&   r6   ÚsysÚexitrL   r8   r7   r    ÚsortedÚ	threadingZThreadrq   ZdaemonÚstartr2   r   rp   r[   r`   ÚKeyboardInterruptr3   r4   r5   )ZyoZhilors   ZupdatesZupr   r   r   Úmain8  sD    


	


r|   Ú__main__)>Ú__doc__r	   rv   ry   r   r4   r0   Zdelta_statusr   Zformator   r
   ÚdirnameÚabspathÚ__file__ZRUTAÚjoinZRUTA_ENVr   ZENVr    ru   r'   r&   ÚsetrL   rY   Ztrozor   ÚaddrO   r<   ro   r!   rl   r1   r2   rm   rk   r   ZLockr   r   r$   r*   r8   r?   rB   rI   rK   rM   rN   rQ   r@   r[   r`   rg   rj   rn   rq   r|   Ú__name__r   r   r   r   Ú<module>   sh   	"!	",