Beispiel #1
0
 def _handle_inbound_error(self, event):
     error = event['error']
     if error['msg'] in ('invalid channel id', 'channel not found'):
         meta_data = SignalMetaData(received_at=datetime.datetime.now())
         self.receive(
             DeliveryFailure(meta_data, error['msg'], error['code']))
     else:
         # TODO: Handle these.
         LOGGER.warning("Ignoring inbound error event: %s" % event)
Beispiel #2
0
 def say_what(sess: TkChatSession, sig: Signal):
     assert isinstance(sig, Message)
     meta_data = SignalMetaData(origin=sig.meta_data.addressees[0]
                                if sig.meta_data.addressees else 'Bot',
                                addressees=[sig.meta_data.origin],
                                response_to=sig.meta_data.identifier,
                                sent_at=datetime.datetime.now(),
                                room=sig.meta_data.room)
     return Message(meta_data=meta_data,
                    content="You said: %s" % sig.content)
Beispiel #3
0
 def on_submit(self, event=None):
     text = self._input_field.get().strip()
     self._input_field.delete(0, tkinter.END)
     if text:
         self.show(self.user_handle + ': ' + text)
         meta_data = SignalMetaData(
             identifier=SignalID(self.user_handle + str(time.time())),
             origin=Handle(self.user_handle),
             sent_at=datetime.datetime.now(),
         )
         signal = Message(meta_data=meta_data, content=text)
         self.receive(signal)
Beispiel #4
0
    def email_to_signal(cls, message: EmailMessage) -> 'Signal':
        meta_data = SignalMetaData(
            identifier=message['message-id'],
            origin=message['from'],
            addressees=parse_email_address_list(message['to']),
            visible_to=parse_email_address_list(message['cc']),
            response_to=message['in-reply-to'],
            sent_at=parse_email_datetime(message['date']),
            received_at=parse_email_datetime(message['received']))

        # Check if it's a delivery failure notification.
        if is_delivery_status_notification(message):
            return DeliveryFailure(meta_data, content=message)

        return Message(meta_data, message)
Beispiel #5
0
    def _get_event_meta_data(self, event):
        room = event['channel']

        origin = event['user']
        user = self._get_user_info(origin)
        if user:
            origin = user.name

        time_stamp = event.get('ts', None)
        if time_stamp is None:
            sent_time = None
        else:
            sent_time = datetime.datetime.fromtimestamp(float(time_stamp))

        visible_to = []
        channel = self._get_channel_info(room)
        if channel:
            room = channel.name
            for member in channel.members:
                user = self._get_user_info(member)
                visible_to.append(Handle(user.name if user else member))

        bot = Handle(self._slack_client.server.username)
        if visible_to:
            addressees = None  # We can't know.
        else:
            # This only happens when we're in a private channel, so the addressee is clear.
            addressees = [bot]

        if origin not in visible_to:
            visible_to.append(Handle(origin))
        if bot not in visible_to:
            visible_to.append(bot)

        return SignalMetaData(identifier=SignalID('/'.join(
            [room, origin, time_stamp])),
                              origin=Handle(origin),
                              addressees=addressees,
                              visible_to=visible_to,
                              response_to=None,
                              sent_at=sent_time,
                              received_at=datetime.datetime.now(),
                              room=Handle(room))
Beispiel #6
0
    def test_delivery_failure(self):
        sent_at = datetime.datetime.now()
        meta_data = SignalMetaData(
            identifier=SignalID('bad-message-%s' % sent_at.timestamp()),
            origin=Handle('mailer-daemon@' + self.smtp_config.host),
            addressees=[self.imap_config.handle_configs[0].handle],
            sent_at=sent_at)
        content = "Delivery failure"
        message = Message(meta_data, content)
        self.sender_session.send(message)

        for _ in range(self.max_receiver_delay * 1000):
            time.sleep(.001)
            if self.received:
                failure = self.received.popleft()
                break
        else:
            failure = self.received.popleft()
        assert isinstance(failure, DeliveryFailure)
        assert failure.meta_data.identifier == meta_data.identifier
Beispiel #7
0
    def test_delivery_failure(self):
        sent_at = datetime.datetime.now()
        meta_data = SignalMetaData(
            origin=self.slack_config2.handle_configs[0].handle,
            addressees=[Handle('nonexistent_channel')],
            sent_at=sent_at
        )
        content = "Delivery failure"
        message = Message(meta_data, content)
        self.receiver_session.send(message)

        for _ in range(self.max_receiver_delay * 1000):
            time.sleep(.001)
            if self.received:
                failure = self.received.popleft()
                break
        else:
            failure = self.received.popleft()
        assert isinstance(failure, DeliveryFailure)
        assert failure.meta_data.identifier == meta_data.identifier
Beispiel #8
0
    def _get_meta_data(event):
        origin = Handle(event['from'].bare)
        visible_to = [origin]

        if event.get('to', None):
            addressees = [Handle(event['to'].bare)]
            visible_to.extend(addressees)
        else:
            addressees = None

        if event.get('room', None):
            room = Handle(event['room'].bare)
            # TODO: Add everyone in the room to visible_to
        else:
            room = None

        return SignalMetaData(identifier=SignalID(event['id']),
                              origin=origin,
                              addressees=addressees,
                              visible_to=visible_to,
                              response_to=None,
                              sent_at=None,
                              received_at=datetime.datetime.now(),
                              room=room)
Beispiel #9
0
 def meta_data_sequence(self) -> Iterable[SignalMetaData]:
     for counter in range(10):
         yield SignalMetaData(origin=self.sender_handle,
                              addressees=[self.receiver_handle])