
ß¾ˆY€  ã            	   @   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
 m Z m Z d d l m Z d d l m Z e j d ƒ Z e j e j ƒ d a e d	 d
 d d d g ƒ Z e d d
 d d d d d d g ƒ Z e j ƒ  Z g  Z e d g  ƒ Z e d g  ƒ Z d Z e j d e j  e j! Bƒ Z" e d d „  ƒ Z d d „  Z# d d „  Z$ d d „  Z% d d „  Z& d  d! „  Z' d" d# „  Z( d$ d% „  Z) d& d' d( „  g d) d* d( „  g i Z* e
 d e" ƒ d+ d „  ƒ Z+ d S),zB
.tell and .remind from Karkat, Infobot-ized

* depends: database
é    N)Útimezoneé   )ÚcommandÚinitÚprocess_privmsg)ÚCaseInsensitiveDefaultDict)Ú
namedtupleÚremindÚTellÚidÚ	from_nickÚmessageÚdateÚReminderÚto_nickÚchannelÚbegintsÚendtsÚdefaultzF\.remind (me|@?[A-z0-9]+) (?:in (.+?) to (.+)$|(?:to )?(.+?) in (.+)$)a`  ^
    \.(?:tell|remind)\s
        (?P<nick> me|@? [A-z0-9]+)\s
        (?:
            (?:in\s(?P<time> .+?))\s(?:to \s (?P<message>.+)$)
            |
            (?:
                (?:to \s )?
                    (?:(?P<message>.+)\sin\s(?P<time>.+)
                    |
                    (?P<message>.+)
                )
            )
        )c             C   s"   |  j  d a t ƒ  t |  ƒ d  S)NÚdb)Údatar   Údb_get_tellsÚdb_get_reminders)Úbot© r   ú./plugins/reminders.pyr   1   s    r   c             C   s$   t  |  j t | | | | ƒ ƒ d  S)N)ÚtellsÚappendr
   )r   Útellidr   r   r   r   r   r   Úadd_tell8   s    
r   c             G   s¤   t  | Œ  } | j t j j ƒ  } | j ƒ  d k  r8 d  St j | j ƒ  t d |  | f ƒ} | j ƒ  t	 j
 | ƒ t | j j
 | ƒ t j d | | j ƒ  ƒ d  S)Nr   Úargsz'Added reminder %r (fires in %f seconds))r   r   ÚdatetimeÚutcnowÚtotal_secondsÚ	threadingÚTimerÚremind_handlerÚstartÚtimersr   Ú	remindersr   ÚloggerÚdebug)r   r    ÚreminderÚdeltaÚtimerr   r   r   Úadd_reminder<   s    $
r/   c              C   s4   t  j d ƒ j ƒ  }  x |  D] } t | Œ  q Wd  S)NzWSELECT to_nick, tellid, from_nick, message, begints FROM tells WHERE fulfilled = false;)r   ÚexecuteÚfetchallr   )r   Útellr   r   r   r   H   s    r   c             C   s7   t  j d ƒ j ƒ  } x | D] } t |  | Œ q Wd  S)NzgSELECT id, to_nick, from_nick, message, channel, begints, endts FROM reminders WHERE fulfilled = false;)r   r0   r1   r/   )r   r   r,   r   r   r   r   M   s    r   c             C   sµ   t  j t j j ƒ  | j ƒ } d j |  j j d ƒ |  j j | ƒ |  j j | j	 ƒ |  j j d j | j
 ƒ ƒ |  j j d j | ƒ ƒ ƒ } |  j | | ƒ t j d | j ƒ d  S)Nu   {} {}: {} Â· {} Â· {}u   | âœ‰ |zfrom {}u   âŒš {}z4UPDATE tells SET fulfilled = true WHERE tellid = %s;)ÚhumanizeÚnaturaltimer!   r"   r   ÚformatÚstyleÚgreenÚtealr   r   Únoticer   r0   r   )r   ÚnickÚchanr2   Ú
timestringÚoutputr   r   r   Ú	send_tellR   s    r>   c             C   s?   | t  k r; x% t  | D] } t |  | | | ƒ q Wt  | =d  S)N)r   r>   )r   r:   r;   r2   r   r   r   Útell_handler`   s    r?   c             C   s¾   t  j t j j ƒ  | j ƒ } d j |  j j d ƒ |  j j | j	 ƒ |  j j | j
 ƒ |  j j d j | j ƒ ƒ |  j j d j | ƒ ƒ ƒ } |  j | j | ƒ t j d | j f ƒ d  S)Nu   {} {}: {} Â· {} Â· {}u   | âœ‰ |zfrom {}u   âŒš {}z4UPDATE reminders SET fulfilled = true WHERE id = %s;)r3   r4   r!   r"   r   r5   r6   r7   r8   r   r   r   r9   r   r   r0   r   )r   r,   r<   r=   r   r   r   r&   f   s    r&   ÚPRIVMSGc             C   s   t  |  t | ƒ d  d … Œ S)Né   )r?   r   )ÚbÚmr   r   r   Ú<lambda>v   s    rD   ÚJOINc             C   s/   t  |  | d j d ƒ d | d d d  … ƒ S)NÚhostú!r   Úargr   )r?   Úsplit)rB   rC   r   r   r   rD   y   s    c             C   s¨  | d } | d } | d } | d k r0 | } | j  d ƒ } | d  k	 rFt j | d t d ƒ ƒd } t j j ƒ  j d t d ƒ ƒ }	 | |	 }
 t j d	 | | | | | f ƒ j	 ƒ  d } t
 | | | | | t j j ƒ  | ƒ } t j |
 j ƒ  t d
 |  | f ƒ} | j ƒ  t j | ƒ t | j | ƒ |  j | d ƒ n^ t j d | | | f ƒ j	 ƒ  d } t | j t | | | t j j ƒ  ƒ ƒ |  j | d ƒ d  S)Nr:   Útimer   Úmeú@ÚtzinfoÚUTCr   ziINSERT INTO reminders (from_nick, to_nick, message, channel, endts) VALUES (%s,%s,%s,%s,%s) RETURNING id;r    zI'll remind them.zSINSERT INTO tells (to_nick, from_nick, message) VALUES (%s,%s,%s) RETURNING tellid;zI'll tell them that.)ÚstripÚcalendarZparseDTr   r!   r"   Úreplacer   r0   Úfetchoner   r$   r%   r#   r&   r'   r(   r   r)   Úmsgr   r
   )r   r:   r;   ÚgrrH   r   rJ   r   r   r"   r-   Z
reminderidr,   r.   r   r   r   r   r	   |   s,    


!
	"'$
	)),Ú__doc__Zparsedatetimer!   r3   Úregexr$   ÚloggingZpytzr   Zutil.decoratorsr   r   r   Z	util.dictr   ZCIDDÚcollectionsr   Ú	getLoggerr*   ÚsetLevelÚDEBUGr   r
   r   ÚCalendarrP   r(   r)   r   Z	REMIND_REÚcompileÚXZV1ZREMIND_TELL_REr   r/   r   r   r>   r?   r&   Ú__callbacks__r	   r   r   r   r   Ú<module>   sH   $