Example #1
0
    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)
Example #2
0
    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)
Example #3
0
    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")
Example #4
0
    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")
Example #5
0
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()
Example #6
0
 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)
Example #7
0
    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()
Example #8
0
    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()
Example #9
0
    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)
Example #10
0
    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()
        )
Example #11
0
    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
Example #12
0
    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
Example #13
0
    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
Example #14
0
    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()
        )
Example #15
0
    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()
Example #16
0
    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)
Example #17
0
    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)
Example #18
0
    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()
Example #19
0
    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()
Example #20
0
 def _add_etag_to_result(self):
     state = yield idiokit.consume()
     idiokit.stop(self._etag, state)
Example #21
0
 def main(self, state):
     return idiokit.consume()
Example #22
0
 def _catch(self, errors):
     try:
         yield idiokit.consume()
     except:
         errors.throw()
         raise
Example #23
0
 def throw_stop_on_signal():
     try:
         yield idiokit.consume()
     except idiokit.Signal:
         raise services.Stop()
Example #24
0
 def main(self):
     return idiokit.consume()
Example #25
0
 def session(self, state, **keys):
     return idiokit.consume()
Example #26
0
    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())
Example #27
0
 def to_room(self, name):
     return self.room_handlers.inc(name) | idiokit.consume()
Example #28
0
 def to_room(self, name):
     return self.room_handlers.inc(name) | idiokit.consume()
Example #29
0
 def _catch(self, errors):
     try:
         yield idiokit.consume()
     except:
         errors.throw()
         raise
Example #30
0
 def main(self, state):
     yield idiokit.consume()
Example #31
0
 def from_room(self, name):
     return idiokit.consume() | self.room_handlers.inc(name)
Example #32
0
 def session(self, state, **keys):
     return idiokit.consume()
Example #33
0
 def from_room(self, name):
     return idiokit.consume() | self.room_handlers.inc(name)
Example #34
0
 def configs(self):
     yield idiokit.consume()
Example #35
0
 def _dst(self, dst):
     return idiokit.pipe(
         self._rooms.inc(dst),
         idiokit.consume())
Example #36
0
 def configs(self):
     yield idiokit.consume()
Example #37
0
 def main(self):
     return idiokit.consume()
Example #38
0
 def main(self, state):
     return idiokit.consume()
Example #39
0
 def session(self, state, **keys):
     yield idiokit.consume()
Example #40
0
 def throw_stop_on_signal():
     try:
         yield idiokit.consume()
     except idiokit.Signal:
         raise services.Stop()