def _delayed_log(self, log, name, attrs, delay=1.0): try: result = yield timer.timeout(delay, idiokit.consume()) except timer.Timeout: log.open("Waiting for {0!r}".format(name), attrs, status="waiting") try: result = yield idiokit.consume() except Cancel: log.close("Stopped waiting for {0!r}".format(name), attrs, status="removed") raise idiokit.stop(result)
def manage_room(self, name): msg = "room {0!r}".format(name) attrs = events.Event({ "type": "room", "service": self.bot_name, "sent events": "0", "room": name }) with self.log.stateful(repr(self.xmpp.jid), "room", repr(name)) as log: log.open("Joining " + msg, attrs, status="joining") room = yield self.xmpp.muc.join(name, self.bot_name) log.open("Joined " + msg, attrs, status="joined") try: head = self.augment() if self.drop_older_than is not None: head = self._cutoff() | head tail = self._stats(name) | room | idiokit.consume() if self.xmpp_rate_limit is not None: tail = self._output_rate_limiter() | tail yield head | events.events_to_elements() | tail finally: log.close("Left " + msg, attrs, status="left")
class Service(object): def __init__(self, state_file=None): self.file = None self.sessions = dict() self.state = dict() if state_file is not None: state_dir = os.path.dirname(os.path.abspath(state_file)) try: os.makedirs(state_dir) except OSError, (code, error_str): if code != errno.EEXIST: raise self.file = open_file(state_file) try: if not lock_file_nonblocking(self.file): raise RuntimeError("state file %r already in use" % state_file) except: self.file.close() raise try: self.state = pickle.load(self.file) except EOFError: pass self.errors = idiokit.consume()
def _catch(self, jid, session_id): try: yield idiokit.consume() finally: end = Element("end", xmlns=SERVICE_NS, id=session_id) self.xmpp.core.message(jid, end) self._discard_session(jid, session_id)
def session(self, state, dst_room, **keys): connections = [] for feed_key in self.feed_keys(dst_room=dst_room, **keys): connections.append(self._connections.inc(feed_key, dst_room)) if connections: return idiokit.pipe(*connections) return idiokit.consume()
def _cleanup(self, key): try: yield idiokit.consume() finally: if self.counter.dec(key): yield idiokit.sleep(self.grace_period) if not self.counter.contains(key) and key in self.tasks: task = self.tasks.pop(key) task.throw(self.signal)
def main(self): xmpp = yield self.xmpp_connect() room = yield xmpp.muc.join(self.room) yield idiokit.pipe( self._read_stdin(), events.events_to_elements(), _rate_limiter(self.rate_limit), room, idiokit.consume() )
def main(self): self.log.info("Starting bot {0!r} version {1}".format(self.bot_name, __version__)) xmpp = yield self.xmpp_connect() self.log.info("Joining lobby {0!r}".format(self.service_room)) lobby = yield services.join_lobby(xmpp, self.service_room, self.bot_name) self.log.addHandler(log.RoomHandler(lobby.room)) errors = idiokit.consume() yield errors | self.configs() | self._handle_updates(lobby, errors) | lobby
def kill_sessions(self): try: yield idiokit.consume() raise Stop() finally: for session in self.sessions.itervalues(): session.throw(Stop()) while self.sessions: session = tuple(self.sessions.itervalues())[0] yield session
def main(self): dst = yield self._join("dst", self.xmpp_dst_jid, self.xmpp_dst_password, self.xmpp_dst_host, self.xmpp_dst_port, self.xmpp_dst_ignore_cert, self.xmpp_dst_extra_ca_certs, self.xmpp_dst_room) src = yield self._join("src", self.xmpp_src_jid, self.xmpp_src_password, self.xmpp_src_host, self.xmpp_src_port, self.xmpp_src_ignore_cert, self.xmpp_src_extra_ca_certs, self.xmpp_src_room) yield src | peel_messages() | dst | idiokit.consume()
def session(self, state, **keys): # Try to build a mail for quick feedback that the templates etc. are # at least somewhat valid. try: yield self.build_mail(None, **keys) except templates.TemplateError as te: self.log.error(u"Mail template was not valid ({0}), pausing session".format(te)) try: yield idiokit.consume() except services.Stop: idiokit.stop(state) result = yield ReportBot.session(self, state, **keys) idiokit.stop(result)
def __init__(self, state_file=None): self.file = None self.sessions = dict() self.state = dict() if state_file is not None: self.file = open_file(state_file) try: if not lock_file_nonblocking(self.file): raise RuntimeError("state file %r already in use" % state_file) except: self.file.close() raise try: self.state = pickle.load(self.file) except EOFError: pass self.errors = idiokit.consume()
def main(self): dst = yield self._join( "dst", self.xmpp_dst_jid, self.xmpp_dst_password, self.xmpp_dst_host, self.xmpp_dst_port, self.xmpp_dst_ignore_cert, self.xmpp_dst_extra_ca_certs, self.xmpp_dst_room) src = yield self._join( "src", self.xmpp_src_jid, self.xmpp_src_password, self.xmpp_src_host, self.xmpp_src_port, self.xmpp_src_ignore_cert, self.xmpp_src_extra_ca_certs, self.xmpp_src_room) yield src | peel_messages() | dst | idiokit.consume()
def _add_etag_to_result(self): state = yield idiokit.consume() idiokit.stop(self._etag, state)
def main(self, state): return idiokit.consume()
def _catch(self, errors): try: yield idiokit.consume() except: errors.throw() raise
def throw_stop_on_signal(): try: yield idiokit.consume() except idiokit.Signal: raise services.Stop()
def main(self): return idiokit.consume()
def session(self, state, **keys): return idiokit.consume()
def _execute(self): irc = yield irc_connect(self._server, self._port, self._name, self._ssl) yield irc.join(self._channel) yield idiokit.pipe(self._read_pipe(), irc, idiokit.consume())
def to_room(self, name): return self.room_handlers.inc(name) | idiokit.consume()
def main(self, state): yield idiokit.consume()
def from_room(self, name): return idiokit.consume() | self.room_handlers.inc(name)
def configs(self): yield idiokit.consume()
def _dst(self, dst): return idiokit.pipe( self._rooms.inc(dst), idiokit.consume())
def session(self, state, **keys): yield idiokit.consume()