3
[!              	   @   s  d 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 ddlmZ dd	lmZ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dddZg Zeg dZeg dZ e!dddZ"dZ#ej$dj%e#e#ej&Z'ej$dej(ej&B Z)d d! Z*d"d# Z+d$d% Z,d&d' Z-d(d) Z.d*d+ Z/eed,d-d.Z0dCd/d0Z1d1d2d3 giZ2d4d5 Z3d6d7 Z4ede)d8d Z5ed9d:d;d<d= Z6ed>d:d;d?d@ Z7e	dAdB Z	dS )DzB
.tell and .remind from Karkat, Infobot-ized

* depends: database
    N)utc   )commandinitprocess_privmsg)CaseInsensitiveDefaultDict)CommandException)
namedtuple)datetime	timedelta)search_datesremindTellid	from_nickmessagedateReminderto_nickchannelbegintsendtsTUTC)ZRETURN_AS_TIMEZONE_AWAREZTIMEZONE)default)timespanc             C   s4   | dkrdS | dkrdS | dkr$dS | dkr0dS dS )Nweekwkwi:	 daydiQ hourhrhi  minuteminm<   r   )r   r   r   )r   r   )r    r!   r"   )r#   r$   r%    )r   r'   r'   !/opt/Infobot/plugins/reminders.pyget_seconds_for_timespan!   s    r)   zT(?:(?P<number>\d+) ?(?P<span>week|wk|w|day|d|hour|hr|h|minute|min|m|second|sec|s)s?)zin {}( ?\+? ?{})*za^
    \.(?:tell|remind)\s
        (?P<nick> me|@? [A-z0-9]+)\s
        (?P<message_with_time>.+)$c             C   s   t |  jt|||| d S )N)tellsappendr   )r   tellidr   r   r   r'   r'   r(   add_tell6   s    r-   c             G   s   t | }tjt}||jkr*t| | d S |j| }tj|j t| |fd}||_	d|_
|j  tj| t|j j| tjd||j  d S )N)argsTz'Added reminder %r (fires in %f seconds))r   r
   nowr   r   remind_handler	threadingTimertotal_secondsreminderdaemonstarttimersr+   	remindersr   loggerdebug)botr.   r4   current_timedeltatimerr'   r'   r(   add_reminder:   s    




r?   c              C   s(   t jdj } x| D ]}t|  qW d S )NzWSELECT to_nick, tellid, from_nick, message, begints FROM tells WHERE fulfilled = false;)dbexecutefetchallr-   )datatellr'   r'   r(   db_get_tellsJ   s    
rE   c             C   s.   t jdj }x|D ]}t| f|  qW d S )NzgSELECT id, to_nick, from_nick, message, channel, begints, endts FROM reminders WHERE fulfilled = false;)r@   rA   rB   r?   )r;   rC   r4   r'   r'   r(   db_get_remindersO   s    
rF   c             C   s~   t jtjt|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   r   formatstylegreentealr   r   noticer@   rA   r   )r;   nickchanrD   
timestringoutputr'   r'   r(   	send_tellT   s    

rR   c             C   s2   |t kr.xt | D ]}t| ||| qW t |= d S )N)r*   rR   )r;   rN   rO   rD   r'   r'   r(   tell_handlerb   s    rS   )tdreturnc             C   s   t t| j dS )N)seconds)r   roundr3   )rT   r'   r'   r(   round_to_secondsh   s    rX   c             C   s   t jttjt|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;)rG   rH   rX   r
   r/   r   r   rI   rJ   rK   rL   r   r   r   rM   r   r@   rA   r   )r;   r4   Z	late_timerP   rQ   r'   r'   r(   r0   k   s    
r0   PRIVMSGc             C   s   t | ft|d d  S )N   )rS   r   )br%   r'   r'   r(   <lambda>{   s    r\   c             C   s   | d S )Nr   r'   )timesr'   r'   r(   time_select~   s    r^   c             C   s   t j| }tjd|  |s"d S t|jd|jd}d}x$|D ]\}}|t|t| 7 }qDW t|d}tjd|  |j	dt
jt| ffS )NzFound timestamp match: numberspanr   )rV   ztimedelta: )SIMPLE_SPAN_REsearchr9   r:   zipZcapturesr)   intr   groupr
   r/   r   )msgr%   
date_partslengthnumr`   tr'   r'   r(   get_simple_ts   s    
 
rk   c          	   C   s`  |d }|d }t |}|dkr$|}|s8t|dgtd}||krDdnd}|jd}|rt|\}	}
|j|	d	j }tjd
|	 d|
  tj	t
}|
|k rtdtjd|||||
fj d }t| |||||||
 t|
| }| j|d| d| d| d nV|}tjd|||fj d }t| jt|||tj	t
 | j|d| d| d d S )NrN   message_with_timemeen)	languagessettingsZthemZyou@ zTo cut: z	 End TS: z9You're trying to start a reminder for a date in the past.ziINSERT INTO reminders (from_nick, to_nick, message, channel, endts) VALUES (%s,%s,%s,%s,%s) RETURNING id;r   zI'll remind z in z. To cancel, send .rmcancel .zSINSERT INTO tells (to_nick, from_nick, message) VALUES (%s,%s,%s) RETURNING tellid;z
I'll tell z  that. To cancel, send .tcancel )rk   r   dp_settingsstripr^   replacer9   r:   r
   r/   r   r   r@   rA   fetchoner?   rX   rf   r*   r+   r   )r;   rN   rO   grargr   rl   r]   ZpronounZcutr   r   utcnowZ
reminderidr=   r,   r'   r'   r(   r      s4    

"Zrmcancelrs   )cmdcharc             C   s   yt |}W n  tk
r,   tdddY nX tjd|fj }|sLtd|\}}}}	|	tjtkrntd||kr~tdtjd|f x"t	D ]}
|
j
j|kr|
j  P qW | j|d	 d
S )z> .rmcancel <id> - Cancels your started reminder, if possible. zreminder id missing or invalid.T)send_doczGSELECT from_nick, to_nick, message, endts FROM reminders WHERE id = %s;zthat reminder does not exist.z that reminder has already fired.z!you did not create that reminder!z$DELETE FROM reminders WHERE id = %s;z Reminder cancelled successfully.N)rd   
ValueErrorr   r@   rA   rw   r
   r/   r   r7   r4   r   cancelrf   )r;   rN   rO   ry   Zridrowr   r   r   r   r>   r'   r'   r(   cancel_reminder   s&    
r   Ztcancelc             C   s   yt |}W n  tk
r,   tdddY nX tjd|fj }|sLtd|\}}}}	}
|
rftd||krvtdtjd|f x t| D ]}|j|kr|}P qW t| j| | j	|d	 d
S )z1 .tcancel <id> - Cancels your tell, if possible. ztell id missing or invalid.T)r|   zTSELECT to_nick, from_nick, message, begints, fulfilled FROM tells WHERE tellid = %s;zthat tell does not exist.z that tell has already been sent.zyou did not create that tell!z$DELETE FROM tells WHERE tellid = %s;zTell cancelled successfully.N)
rd   r}   r   r@   rA   rw   r*   r   removerf   )r;   rN   rO   ry   tidr   r   r   r   r   Z	fulfilledrD   Z	to_remover'   r'   r(   cancel_tell   s(    
r   c                s<    j d at   jjj fdd  jjjdd  d S )Nr@   c                  s   t  S )N)rF   r'   )r;   r'   r(   r\      s    zinit.<locals>.<lambda>c             S   s   t | |jdd |S )N!r   )rS   split)r;   hostr   r'   r'   r(   r\     s    )rC   r@   rE   eventsWelcomeregisterJoin)r;   r'   )r;   r(   r      s    
r   )N)8__doc__rG   regexr1   loggingZpytzr   Zutil.decoratorsr   r   r   Z	util.dictr   ZCIDDZ	util.datar   collectionsr	   r
   r   Zdateparser.searchr   	getLoggerr9   setLevelDEBUGr@   r   r   rt   r7   r8   r*   strr)   Z	TIMESPANScompilerI   ZV1ra   XZREMIND_TELL_REr-   r?   rE   rF   rR   rS   rX   r0   __callbacks__r^   rk   r   r   r   r'   r'   r'   r(   <module>   sV   





, 