ó
bøcc           @  s¤   d  Z  d d l m Z m Z d d l Z d d l Z d d l Z d d l m Z d Z	 d e
 f d	 „  ƒ  YZ d
 d „ Z d „  Z d e
 f d „  ƒ  YZ d „  Z d S(   u¢   
Core chiron library function

Defines the Message object for protocol modules to subclass, a standard
collection of fetcher functions, and the core MatchEngine.
iÿÿÿÿ(   t   print_functiont   unicode_literalsNi   (   t
   fetch_traci   i<   t   Messagec           B  sb   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d	 „  Z RS(
   c         C  sB   t  d t j j ƒ  |  j ƒ  |  j ƒ  |  j ƒ  |  j ƒ  f ƒ d  S(   Nu   %s: -c %s -i "%s": %s -> %s(   t   printt   datetimet   nowt   clst   instancet   sendert	   recipient(   t   self(    (    sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyt   log_arrival   s    c         C  s
   t  ‚ d  S(   N(   t   NotImplementedError(   R   (    (    sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyt   body!   s    c         C  s
   t  ‚ d  S(   N(   R   (   R   (    (    sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyR   $   s    c         C  s   d S(   Nu    (    (   R   (    (    sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyR   '   s    c         C  s
   t  ‚ d  S(   N(   R   (   R   (    (    sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyR	   *   s    c         C  s
   t  ‚ d  S(   N(   R   (   R   (    (    sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyR
   -   s    c         C  s
   t  ‚ d  S(   N(   R   (   R   (    (    sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyt   is_personal0   s    c         C  s
   t  ‚ d S(   uš   Returns whether this message should be skipped

        At a minimum, this probably needs to recognize messages from Chiron,
        to avoid reply loops.N(   R   (   R   (    (    sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyt   skip_message3   s    c         C  s2   d |  j  ƒ  k s |  j ƒ  r( |  j ƒ  S|  j  ƒ  S(   Nu   -test(   R   R   R   (   R   (    (    sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyt   context:   s    
c         C  s
   t  ‚ d  S(   N(   R   (   R   t   messages(    (    sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyt
   send_replyC   s    (   t   __name__t
   __module__R   R   R   R   R	   R
   R   R   R   R   (    (    (    sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyR      s   										i    c           s%   t  j ˆ  | ƒ ‰  ‡  f d †  } | S(   Nc           s   ˆ  j  |  j ƒ  ƒ S(   N(   t   finditerR   (   t   msg(   t   regex(    sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyt   matchH   s    (   t   ret   compile(   R   t   flagsR   (    (   R   sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyt   build_matcherF   s    c         C  sV   |  | k r t  S|  \ } } | \ } } | | k oU | | k oU | | k pU | | k S(   uj  Return whether the (x,y) range indicated by arg1 is entirely contained in arg2

    >>> subspan((1,2), (3,4))
    False
    >>> subspan((1,3), (2,4))
    False
    >>> subspan((3,4), (1,2))
    False
    >>> subspan((2,4), (1,3))
    False
    >>> subspan((1,4), (2,3))
    False
    >>> subspan((2,3), (1,4))
    True
    >>> subspan((1,4), (1,4))
    True
    (   t   True(   t   arg1t   arg2t   beg1t   end1t   beg2t   end2(    (    sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyt   subspanM   s
    t   MatchEnginec           B  sV   e  Z d  „  Z d „  Z d „  Z e e e j d „ Z	 d d „ Z d „  Z d „  Z RS(   c         C  s1   g  |  _  i  |  _ g  |  _ i  |  _ t |  _ d  S(   N(   t   classest   fetcherst   matcherst	   last_seent   Falset   ignore_personals(   R   (    (    sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyt   __init__f   s
    				c         C  s   |  j  j | ƒ d  S(   N(   R'   t   extend(   R   R'   (    (    sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyt   add_classesm   s    c         C  sC   x< | j  ƒ  D]. \ } } | |  j k s. t ‚ | |  j | <q Wd  S(   N(   t   itemsR(   t   AssertionError(   R   R(   t   namet   fetcher(    (    sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyt   add_fetchersp   s    c           sn   | |  j  k s t ‚ | r n' ˆ  t k r6 d „  } n ‡  f d †  } |  j j | t | | ƒ g | f ƒ d  S(   Nc         S  s   t  S(   N(   R   (   t   m(    (    sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyt   <lambda>{   s    c           s/   t  g  ˆ  D] } | |  j ƒ  k r
 | ^ q
 ƒ S(   N(   t   boolR   (   R5   R   (   R'   (    sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyR6   }   s    (   R(   R1   R   R)   t   appendR   (   R   R3   t   regexpt   condR'   R   (    (   R'   sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyt   add_matcheru   s    c         C  s“   | j  ƒ  } | d  k r$ | g } n  | |  j k s9 t ‚ t | ƒ |  j | <|  j | d | f ƒ |  j | d d | ƒ|  j | d d | ƒd  S(   Nu   \b%s[-\s:]*#([0-9]{1,5})\bu   \btrac[-\s:]*#([0-9]{1,5})\bR'   u   #([0-9]{2,5})\b(?!-Ubuntu)(   t   lowert   NoneR(   R1   R   R;   (   R   R2   t   urlR'   t   lname(    (    sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyt   add_trac€   s    c   	        sõ   g  } xè |  j  D]Ý \ } } } | | ƒ r x¿ | D]´ } x« | | ƒ D] } | j ƒ  ‰  t ‡  f d †  | Dƒ ƒ r t d | ˆ  f ƒ qE n  g  | D] } t | d ˆ  ƒ s” | ^ q” } | j | |  j | | j d ƒ ˆ  f ƒ qE Wq2 Wq q W| S(   Nc         3  s*   |  ]  \ } } } } t  ˆ  | ƒ Vq d  S(   N(   R%   (   t   .0t   tracker1t   fetcher1t   t1t   span1(   t   span(    sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pys	   <genexpr>”   s    u-     -> ignoring tracker %s with smaller span %si   i   (   R)   RF   t   anyR   R%   R8   R(   t   group(	   R   R   t   ticketst   trackerR)   R:   t   matcherR   RD   (    (   RF   sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyt   find_ticket_info‹   s    ,8c         C  s‰   | j  ƒ  | j ƒ  r1 t d | j ƒ  f ƒ d  S|  j rT | j ƒ  rT t d ƒ d  S|  j | ƒ } t |  j | | ƒ } | j	 | ƒ d  S(   Nu     -> skipping message from %su     -> ignoring personal(
   R   R   R   R	   R,   R   RL   t   format_ticketsR*   R   (   R   R   RI   R   (    (    sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyt   processž   s    

N(   R   R   R-   R/   R4   R+   R   R   t   IR;   R=   R@   RL   RN   (    (    (    sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyR&   e   s   				c         C  s÷   g  } xê | D]â \ } } } } t  d | | | f ƒ | j ƒ  sW | | | j ƒ  f n d  } |  j | d ƒ t j ƒ  t k  }	 |	 s‘ | j ƒ  r | | ƒ \ }
 } | s¶ d | } n  d | | | f } | j | |
 f ƒ t j ƒ  |  | <q q W| S(   Nu$     -> Found ticket: %s, %s (span: %s)i    u   Unable to identify ticket %su   %s ticket %s: %s(   R   R   R   R=   t   gett   timet   SEEN_TIMEOUTR8   (   R*   R   RI   R   RJ   R3   t   ticketRF   t   age_keyt
   old_enoughR>   R2   t   message(    (    sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyRM   ª   s    '"i,  (   t   __doc__t
   __future__R    R   R   R   RQ   R(   R   RR   t   objectR   R   R%   R&   RM   (    (    (    sX   /afs/sipb.mit.edu/project/chiron/chiron-scripts-venv/src/chiron-bot/chiron_bot/engine.pyt   <module>	   s   -	E