Exemple #1
0
    def session(self, state, src_room, dst_room, window_time=60.0, rule=None):
        if rule is None:
            rule = rules.Anything()
        rule = rules.rule(rule)

        queue = collections.deque()
        ids = dict()

        to = self.to_room(dst_room)
        idiokit.pipe(self.purge(ids, queue), events.events_to_elements(), to)

        yield idiokit.pipe(self.from_room(src_room),
                           events.stanzas_to_events(), self.match(rule),
                           self.process(ids, queue, window_time),
                           events.events_to_elements(), to)
Exemple #2
0
    def handle_room(self, name):
        self.log.info("Joining room %r", name)
        room = yield self.xmpp.muc.join(name, self.bot_name)
        self.log.info("Joined room %r", name)

        try:
            yield idiokit.pipe(room, self.reply(room.jid),
                               events.events_to_elements())
        finally:
            self.log.info("Left room %r", name)
Exemple #3
0
    def session(self, state, src_room, dst_room, window_time=60.0, rule=None):
        if rule is None:
            rule = rules.Anything()
        rule = rules.rule(rule)

        queue = collections.deque()
        ids = dict()

        to = self.to_room(dst_room)
        idiokit.pipe(self.purge(ids, queue), events.events_to_elements(), to)

        yield idiokit.pipe(
            self.from_room(src_room),
            events.stanzas_to_events(),
            self.match(rule),
            self.process(ids, queue, window_time),
            events.events_to_elements(),
            to
        )
Exemple #4
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()
        )
Exemple #5
0
 def handle_room(inner, self, name):
     self.log.info("Joining room %r", name)
     room = yield inner.sub(self.xmpp.muc.join(name, self.bot_name))
     self.log.info("Joined room %r", name)
     try:
         yield inner.sub(events.events_to_elements()
                         | room
                         | events.stanzas_to_events()
                         | self.distribute(name))
     finally:
         self.log.info("Left room %r", name)
Exemple #6
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()
        )
Exemple #7
0
 def handle_room(inner, self, name):
     self.log.info("Joining room %r", name)
     room = yield inner.sub(self.xmpp.muc.join(name, self.bot_name))
     self.log.info("Joined room %r", name)
     try:
         yield inner.sub(events.events_to_elements()
                         | room
                         | events.stanzas_to_events()
                         | self.distribute(name))
     finally:
         self.log.info("Left room %r", name)
Exemple #8
0
    def _room(inner, self, name):
        self.log.info("Joining room %r", name)
        room = yield inner.sub(self.xmpp.muc.join(name, self.bot_name))

        self.log.info("Joined room %r", name)
        try:
            yield inner.sub(events.events_to_elements()
                            | room
                            | threado.dev_null())
        finally:
            self.log.info("Left room %r", name)
    def handle_room(self, name):
        self.log.info("Joining room %r", name)
        room = yield self.xmpp.muc.join(name, self.bot_name)
        self.log.info("Joined room %r", name)

        try:
            yield idiokit.pipe(
                room,
                self.reply(room.jid),
                events.events_to_elements())
        finally:
            self.log.info("Left room %r", name)
Exemple #10
0
    def main(inner, self):
        # Join the XMPP network using credentials given from the command line
        conn = yield self.xmpp_connect()

        # Join the XMPP room
        room = yield conn.muc.join(self.xmpp_room, self.bot_name)
        self.log.info("Joined room %r", self.xmpp_room)

        # Fetch the URL info and data as an file-like object.
        # Info contains e.g. the HTTP(S) headers, ignored for now.
        info, fileobj = yield utils.fetch_url(self.url)
        self.log.info("Opened URL %r", self.url)
        
        yield self.parse(fileobj) | events.events_to_elements() | room | threado.dev_null()
Exemple #11
0
    def main(inner, self):
        # Join the XMPP network using credentials given from the command line
        conn = yield self.xmpp_connect()

        # Join the XMPP room
        room = yield conn.muc.join(self.xmpp_room, self.bot_name)
        self.log.info("Joined room %r", self.xmpp_room)

        # Fetch the URL info and data as an file-like object.
        # Info contains e.g. the HTTP(S) headers, ignored for now.
        info, fileobj = yield utils.fetch_url(self.csv_url)
        self.log.info("Opened URL %r", self.csv_url)

        # csv_to_events feeds out abusehelper.core.events.Event
        # objects, so convert them to XML elements before sending them
        # to the room.
        csv_feed = utils.csv_to_events(fileobj,
                                       delimiter=self.csv_delimiter,
                                       columns=self.csv_columns)
        yield csv_feed | events.events_to_elements() | room | threado.dev_null()
Exemple #12
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:
                tail = self._stats(name) | room | idiokit.consume()
                if self.xmpp_rate_limit is not None:
                    tail = self._output_rate_limiter() | tail
                yield self.augment() | events.events_to_elements() | tail
            finally:
                log.close("Left " + msg, attrs, status="left")
Exemple #13
0
 def _handle_augment(self, src_room, dst_room, args):
     return idiokit.pipe(self.from_room(src_room),
                         events.stanzas_to_events(), self.augment(*args),
                         events.events_to_elements(),
                         self.to_room(dst_room))
Exemple #14
0
class OverviewBot(RoomBot):
    def __init__(self, *args, **keys):
        RoomBot.__init__(self, *args, **keys)
        self._aggregates = dict(self.aggregates())

    def aggregates(self):
        return dict(max=Max, min=Min, count=Count, sum=Sum)

    @idiokit.stream
    def throttle(self, throttle_time):
        """
        Ensure that updates for a given event id are sent at least
        throttle_time apart.
        """

        sleeper = timer.sleep(1.0)

        ids = dict()
        queue = list()

        while True:
            yield timer.sleep(1.0)

            item = yield idiokit.next()
            current_time = time.time()

            id, event = item
            previous, _, update_time = ids.get(id, (None, None, None))
            if update_time is None:
                update_time = current_time + 1.0
                heapq.heappush(queue, (update_time, id))
            ids[id] = previous, event, update_time

            while queue and queue[0][0] <= current_time:
                _, id = heapq.heappop(queue)

                previous, next, _ = ids[id]
                if previous == next == None:
                    del ids[id]
                    continue

                if previous != next:
                    if next is None:
                        event = events.Event()
                    else:
                        event = events.Event(next)
                    event.add("id", id)
                    yield idiokit.send(event)

                if previous != next:
                    update_time = current_time + throttle_time
                    heapq.heappush(queue, (update_time, id))
                else:
                    update_time = None
                ids[id] = next, next, update_time

    @idiokit.stream
    def aggregate(self, group_keys, window_info):
        """
        Create aggregated events and ids for them.
        """

        group_keys = tuple(set(group_keys))
        key_groups = dict()

        while True:
            yield timer.sleep(1.0)

            event = yield idiokit.next()

            current_time = time.time()
            updated = set()

            key = tuple(tuple(sorted(event.values(x))) for x in group_keys)
            updated.add(key)

            if key not in key_groups:
                windows = []
                for constructor, keys, output_key in window_info:
                    windows.append((constructor(**keys), output_key))
                key_groups[key] = windows

            for window, output_key in key_groups[key]:
                window.push(current_time, event)

            for key, windows in list(key_groups.iteritems()):
                any_expired = False
                for window, _ in windows:
                    any_expired = window.expire(current_time) or any_expired

                if not (any_expired or key in updated):
                    continue

                output = None

                for window, output_key in windows:
                    value = window.value()
                    if value is None:
                        continue

                    if output is None:
                        output = events.Event()
                    output.add(output_key, unicode(value))

                id = hashlib.md5(repr(key)).hexdigest()
                if output is not None:
                    for group_key, group_values in zip(group_keys, key):
                        output.update(group_key, group_values)

                yield idiokit.send(id, output)
                if output is None:
                    del key_groups[key]

    @idiokit.stream
    def session(self,
                state,
                src_room,
                dst_room,
                group_keys=[],
                aggregates=[],
                throttle_time=10.0):
        aggregate_list = list()
        for original_aggregate in aggregates:
            aggregate = dict(original_aggregate)

            try:
                name = aggregate.pop("name")
                output_key = aggregate.pop("output_key")
            except KeyError, error:
                self.log.error("No key %r defined in %r" %
                               (error.args[0], original_aggregate))
                raise

            try:
                aggregate_cls = self._aggregates[name]
            except KeyError:
                self.log.error("No aggregate type %r available" % (name, ))
                raise

            aggregate_list.append((aggregate_cls, aggregate, output_key))

        yield (self.from_room(src_room)
               | events.stanzas_to_events()
               | self.aggregate(group_keys, aggregate_list)
               | self.throttle(throttle_time)
               | events.events_to_elements()
               | self.to_room(dst_room))
Exemple #15
0
 def main(inner, self):
     xmpp = yield inner.sub(self.xmpp_connect())
     rooms = list()
     for name in self.xmpp_rooms:
         self.log.info("Joining room %r", name)
         room = yield inner.sub(xmpp.muc.join(name, self.bot_name))
         self.log.info("Joined room %r", name)
         roompipe = yield inner.sub(room | self.xmpp_to_log(room.nick_jid, room.participants) | events.events_to_elements() | room)
         rooms.append(roompipe)
     for room in rooms:
         print 'room', room
         yield inner.sub(threado.pipe(room))