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 |