pvl/irk.py
changeset 83 1cb48f2ba1e9
parent 80 231d3de7081a
child 111 4b96c153c113
equal deleted inserted replaced
82:4383c996156e 83:1cb48f2ba1e9
    17     irker = optparse.OptionGroup(parser, 'Irker output')
    17     irker = optparse.OptionGroup(parser, 'Irker output')
    18     
    18     
    19     irker.add_option('--irker', metavar='URL',  default=connect,
    19     irker.add_option('--irker', metavar='URL',  default=connect,
    20             help="Irker daemon URL")
    20             help="Irker daemon URL")
    21 
    21 
       
    22     irker.add_option('--irker-notice',          action='store_true',
       
    23             help="Use irker NOTICE")
       
    24 
    22     return irker
    25     return irker
    23 
    26 
    24 def apply (options) :
    27 def apply (options) :
    25     """
    28     """
    26         Return Irker (XXX: target) from options.
    29         Return Irker (XXX: target) from options.
    27     """
    30     """
    28     
    31     
    29     # None -> stdout
    32     # None -> stdout
    30     return Irker(options.irker)
    33     return Irker(options.irker, options.irker_notice)
    31 
    34 
    32 def connect (host=None, port=None, family=socket.AF_UNSPEC, socktype=socket.SOCK_STREAM) :
    35 def connect (host=None, port=None, family=socket.AF_UNSPEC, socktype=socket.SOCK_STREAM) :
    33     """
    36     """
    34         Return a TCP/UDP socket connected to the given host/port using getaddrinfo.
    37         Return a TCP/UDP socket connected to the given host/port using getaddrinfo.
    35 
    38 
   130 class IrkerTarget (object) :
   133 class IrkerTarget (object) :
   131     """
   134     """
   132         A channel on an Irk connection.
   135         A channel on an Irk connection.
   133     """
   136     """
   134 
   137 
   135     def __init__ (self, irker, target) :
   138     def __init__ (self, irker, target, notice=False) :
   136         self.irker = irker
   139         self.irker = irker
   137         self.target = target
   140         self.target = target
   138 
   141 
       
   142         self._notice = notice
       
   143         
   139     def join (self) :
   144     def join (self) :
   140         log.info("%s", self)
   145         log.info("%s", self)
   141         self.irker.send(to=str(self), privmsg='')
   146         self.irker.send(to=str(self), privmsg='')
   142 
   147 
   143     def privmsg (self, *args) :
   148     def privmsg (self, *args) :
   144         for arg in args :
   149         for arg in args :
   145             log.info("%s: %s", self, arg)
   150             log.info("%s: %s", self, arg)
   146             self.irker.send(to=str(self), privmsg=arg)
   151             self.irker.send(to=str(self), privmsg=arg)
   147 
   152 
   148     __call__ = privmsg
   153     def notice (self, *args) :
       
   154         for arg in args :
       
   155             log.info("%s: %s", self, arg)
       
   156             self.irker.send(to=str(self), notice=arg)
       
   157 
       
   158     def __call__ (self, *args) :
       
   159         # default msg policy
       
   160         if self._notice :
       
   161             return self.notice(*args)
       
   162         else :
       
   163             return self.privmsg(*args)
   149 
   164 
   150     def __str__ (self) :
   165     def __str__ (self) :
   151         return self.target
   166         return self.target
   152 
   167 
   153 class Irker (object) :
   168 class Irker (object) :
   154     """
   169     """
   155         Reconnecting irker.
   170         Reconnecting irker.
   156     """
   171     """
   157 
   172 
   158     def __init__ (self, url=None) :
   173     def __init__ (self, url=None, notice=False) :
   159         if url :
   174         if url :
   160             self.url = urlparse.urlparse(url)
   175             self.url = urlparse.urlparse(url)
   161         else :
   176         else :
   162             self.url = None
   177             self.url = None
   163 
   178 
   164         self.targets = {}
   179         self.targets = {}
       
   180         self.notice = notice
   165         
   181         
   166         self.connect()
   182         self.connect()
   167     
   183     
   168     def connect (self) :
   184     def connect (self) :
   169         """
   185         """
   189         """
   205         """
   190             Bind to given target URL, returning an IrkerTarget for sending messages.
   206             Bind to given target URL, returning an IrkerTarget for sending messages.
   191         """
   207         """
   192 
   208 
   193         if target not in self.targets :
   209         if target not in self.targets :
   194             self.targets[target] = IrkerTarget(self, target)
   210             self.targets[target] = IrkerTarget(self, target, notice=self.notice)
   195             self.targets[target].join()
   211             self.targets[target].join()
   196             
   212             
   197         return self.targets[target]
   213         return self.targets[target]
   198 
   214 
   199     __getitem__ = target
   215     __getitem__ = target