Exemplo n.º 1
0
    def send_message(
            self,
            peer: Peer or AsyncTask,
            text: str,
            interactive_media_groups: List[InteractiveMediaGroup] = None,
            uid: int = None) -> UUID:
        """Send text message to peer.
        Message can contain interactive media groups (buttons, selects etc.).

        :param peer: Peer or AsyncTask (in which located User or Group)
        :param text: message text (not null)
        :param interactive_media_groups: groups of interactive media components (buttons etc.)
        :param uid: send message only for user by id
        :return: UUID (message id)
        """
        peer = get_peer(peer)
        if text == '' or text is None:
            raise AttributeError('Text message must contain some text.')
        out_peer = self.manager.get_out_peer(peer)
        msg = messaging_pb2.MessageContent()
        msg.textMessage.text = text
        if interactive_media_groups is not None:
            for g in interactive_media_groups:
                media = msg.textMessage.media.add()
                g.render(media)
        request = messaging_pb2.RequestSendMessage(
            peer=out_peer,
            deduplication_id=random.randint(0, 100000000),
            message=msg,
            is_only_for_user=uid)
        return self.__send_message(request)
Exemplo n.º 2
0
    def update_message(
            self,
            message: Message or AsyncTask,
            text: str,
            interactive_media_groups: List[InteractiveMediaGroup] = None
    ) -> None:
        """Update text message or interactive media (buttons, selects etc.).

        :param message: Message or AsyncTask (in which located Message)
        :param text: message text (not null)
        :param interactive_media_groups: groups of interactive media components (buttons etc.)
        :return: None
        """
        try:
            if isinstance(message, AsyncTask):
                message = message.wait()[0]
                if not isinstance(message, Message):
                    raise AttributeError()
        except Exception as e:
            raise AttributeError(
                "if message is AsyncTask class, result must be list of Message"
            )
        msg = messaging_pb2.MessageContent()
        msg.textMessage.text = text
        if interactive_media_groups is not None:
            for g in interactive_media_groups:
                media = msg.textMessage.media.add()
                g.render(media)

        self.__update(message, msg)
Exemplo n.º 3
0
    def reply(
            self,
            peer: Peer or AsyncTask,
            mids: List[UUID or AsyncTask],
            text: str = None,
            interactive_media_groups: List[InteractiveMediaGroup] = None
    ) -> UUID:
        """Reply messages to peer. Message can contain interactive media groups (buttons, selects etc.).

        :param peer: Peer or AsyncTask (in which located User or Group)
        :param mids: list of UUIDs
        :param text: message text
        :param interactive_media_groups: groups of interactive media components (buttons etc.)
        :return: UUID (message id)
        """
        peer = get_peer(peer)
        mids = get_uuids(mids)
        if text is None:
            text = ''

        out_peer = self.manager.get_out_peer(peer)
        msg = messaging_pb2.MessageContent()
        msg.textMessage.text = text
        if interactive_media_groups is not None:
            for g in interactive_media_groups:
                media = msg.textMessage.media.add()
                g.render(media)
        request = messaging_pb2.RequestSendMessage(
            peer=out_peer,
            deduplication_id=random.randint(0, 100000000),
            message=msg,
            reply=messaging_pb2.ReferencedMessages(mids=mids))
        return self.__send_message(request)
Exemplo n.º 4
0
    def send_image(self, peer: Peer or AsyncTask, file: str) -> UUID or None:
        """Send image as image (not as file) to peer.

        :param peer: Peer or AsyncTask (in which located User or Group)
        :param file: path to image file
        :return: UUID (message id)
        """
        peer = get_peer(peer)

        if isinstance(file, str) and not is_image(file):
            raise IOError('File is not an image.')

        location = self.internal.uploading.upload_file(file).wait()
        if location is None:
            return None
        location = location.to_api()
        out_peer = self.manager.get_out_peer(peer)
        msg = messaging_pb2.MessageContent()

        msg.documentMessage.CopyFrom(content.get_image_content(file, location))

        request = messaging_pb2.RequestSendMessage(
            peer=out_peer,
            deduplication_id=random.randint(0, 100000000),
            message=msg)

        return self.__send_message(request)
Exemplo n.º 5
0
    def send_file_by_location(self, peer, file, location):
        msg = messaging_pb2.MessageContent()

        msg.documentMessage.CopyFrom(self.get_document_content(file, location))

        return self.messaging.SendMessage(
            messaging_pb2.RequestSendMessage(peer=peer,
                                             deduplication_id=random.randint(
                                                 0, 100000000),
                                             message=msg))
Exemplo n.º 6
0
    def delete(self, message: Message or AsyncTask) -> None:
        """Delete message.

        :param message: Message or AsyncTask (in which located Message)
        :return: None
        """
        msg = messaging_pb2.MessageContent(
            deletedMessage=messaging_pb2.DeletedMessage(
                is_local=wrappers_pb2.BoolValue(value=False)))
        self.__update(message, msg)
Exemplo n.º 7
0
 def __get_out_peer_and_message(self, peer: peers_pb2.Peer, text: str,
                                interactive_media_groups: List[InteractiveMediaGroup]) \
         -> Tuple[peers_pb2.OutPeer, messaging_pb2.MessageContent]:
     out_peer = self.manager.get_out_peer(peer)
     msg = messaging_pb2.MessageContent()
     msg.textMessage.text = text
     if interactive_media_groups is not None:
         for g in interactive_media_groups:
             media = msg.textMessage.media.add()
             g.render(media)
     return out_peer, msg
Exemplo n.º 8
0
 def send_message(self, peer, text, iteractive_media_groups=None):
     outpeer = self.manager.get_outpeer(peer)
     msg = messaging_pb2.MessageContent()
     msg.textMessage.text = text
     if iteractive_media_groups is not None:
         for g in iteractive_media_groups:
             media = msg.textMessage.media.add()
             g.render(media)
     return self.internal.messaging.SendMessage(
         messaging_pb2.RequestSendMessage(peer=outpeer,
                                          rid=int(time.time()),
                                          message=msg)).mid
Exemplo n.º 9
0
    def send_file(self, user, target_outpeer, file):
        """Send file to current peer.

        :param peer: receiver's peer
        :param file: path to file
        :return: value of SendMessage response object
        """
        location = self.upload_file(user, file)
        msg = messaging_pb2.MessageContent()

        msg.documentMessage.CopyFrom(
            content.get_document_content(file, location))

        return user.messaging.SendMessage(
            messaging_pb2.RequestSendMessage(peer=target_outpeer,
                                             deduplication_id=random.randint(
                                                 0, 100000000),
                                             message=msg))
Exemplo n.º 10
0
    def send_file(self, peer, file):
        """Send file to current peer.

        :param peer: receiver's peer
        :param file: path to file
        :return: mid value of SendMessage response object
        """

        location = self.internal.uploading.upload_file(file)
        outpeer = self.manager.get_outpeer(peer)
        msg = messaging_pb2.MessageContent()

        msg.documentMessage.CopyFrom(
            content.get_document_content(file, location))

        return self.internal.messaging.SendMessage(
            messaging_pb2.RequestSendMessage(peer=outpeer,
                                             rid=int(time.time()),
                                             message=msg)).mid
Exemplo n.º 11
0
    def send_media(self, peer: Peer or AsyncTask,
                   medias: List[MessageMedia]) -> UUID:
        """Send media to peer.

        :param peer: Peer or AsyncTask (in which located User or Group)
        :param medias: medias (list of MessageMedias)
        :return: UUID (message id)
        """
        peer = get_peer(peer)
        medias = self.__get_medias(medias)
        out_peer = self.manager.get_out_peer(peer)
        text_message = messaging_pb2.TextMessage()
        for media in medias:
            text_message.media.append(media)
        msg = messaging_pb2.MessageContent(textMessage=text_message)
        request = messaging_pb2.RequestSendMessage(
            peer=out_peer,
            deduplication_id=random.randint(0, 100000000),
            message=msg)
        return self.__send_message(request)
Exemplo n.º 12
0
    def send_image(self, peer, file):
        """Send image as image (not as file) to current peer.

        :param peer: receiver's peer
        :param file: path to image file
        :return: mid value of SendMessage response object
        """

        if imghdr.what(file) not in ['gif', 'jpeg', 'png', 'bmp']:
            raise IOError('File is not an image.')

        location = self.internal.uploading.upload_file(file)
        outpeer = self.manager.get_outpeer(peer)
        msg = messaging_pb2.MessageContent()

        msg.documentMessage.CopyFrom(content.get_image_content(file, location))

        return self.internal.messaging.SendMessage(
            messaging_pb2.RequestSendMessage(peer=outpeer,
                                             rid=int(time.time()),
                                             message=msg)).mid
Exemplo n.º 13
0
    def send_message(self, peer, text, interactive_media_groups=None):
        """Send text message to current peer. Message can contain interactive media groups (buttons, selects etc.).

        :param peer: receiver's peer
        :param text: message text (not null)
        :param interactive_media_groups: groups of interactive media components (buttons etc.)
        :return: mid value of SendMessage response object
        """

        if text == '' or text is None:
            raise AttributeError('Text message must contain some text.')

        outpeer = self.manager.get_outpeer(peer)
        msg = messaging_pb2.MessageContent()
        msg.textMessage.text = text
        if interactive_media_groups is not None:
            for g in interactive_media_groups:
                media = msg.textMessage.media.add()
                g.render(media)
        return self.internal.messaging.SendMessage(
            messaging_pb2.RequestSendMessage(peer=outpeer,
                                             rid=int(time.time()),
                                             message=msg)).mid
Exemplo n.º 14
0
class TestMessaging(unittest.TestCase):
    bot.internal.messaging = Messaging()
    bot.internal.updates = Updates()
    bot.internal.media_and_files = MediaAndFiles()

    test_file = "../dialog_bot_sdk/examples/files/example.png"

    peer = Peer(1, PEERTYPE_PRIVATE)
    message = Message(UUID(1, 1), UUID(0, 0), peer, None, [], [], 0, 0)
    outpeer = peers_pb2.OutPeer(type=PEERTYPE_PRIVATE, id=0, access_hash=0)
    mid = definitions_pb2.UUIDValue(msb=0, lsb=0)
    msg_content = messaging_pb2.MessageContent()
    msg_content.textMessage.text = "Hello"
    interactive_media = [
        InteractiveMediaGroup([
            InteractiveMedia("1", InteractiveMediaButton("Yes", "Да")),
            InteractiveMedia("2", InteractiveMediaButton("No", "Нет")),
        ])
    ]

    # msg_content_with_group = copy.deepcopy(msg_content)
    # group[0].render(msg_content_with_group.textMessage.media.add())
    # doc_msg = messaging_pb2.DocumentMessage(
    #     file_id=0,
    #     access_hash=0,
    #     file_size=60,
    #     name=""
    # )

    def test_send_message(self):
        send = bot.messaging.send_message(self.peer, "text",
                                          self.interactive_media)
        self.assertTrue(isinstance(send, AsyncTask))
        self.assertTrue(isinstance(send.wait(), UUID))

    def test_update_message(self):
        update = bot.messaging.update_message(self.message, "text",
                                              self.interactive_media)
        self.assertTrue(isinstance(update, AsyncTask))
        self.assertIsNone(update.wait())

    def test_delete_message(self):
        delete = bot.messaging.delete(self.message)
        self.assertTrue(isinstance(delete, AsyncTask))
        self.assertIsNone(delete.wait())

    def test_get_messages_by_id(self):
        msg = bot.messaging.get_messages_by_id([UUID(1, 1)])
        self.assertTrue(isinstance(msg, AsyncTask))
        self.assertTrue(isinstance(msg.wait()[0], Message))

    def test_messages_read(self):
        read = bot.messaging.messages_read(self.peer, 0)
        self.assertTrue(isinstance(read, AsyncTask))
        self.assertIsNone(read.wait())

    @patch('requests.put')
    def test_send_file(self, put):
        put.return_value = Put(200)
        send = bot.messaging.send_file(self.peer, self.test_file)
        self.assertTrue(isinstance(send, AsyncTask))
        self.assertTrue(isinstance(send.wait(), UUID))
        put.return_value = Put(400)
        send = bot.messaging.send_file(self.peer, self.test_file)
        self.assertTrue(isinstance(send, AsyncTask))
        self.assertIsNone(send.wait())

    @patch('requests.put')
    def test_send_media(self, put):
        put.return_value = Put(200)
        image = bot.internal.uploading.upload_file(self.test_file).wait()
        media = MessageMedia(image=ImageMedia(ImageLocation(image)))
        send = bot.messaging.send_media(self.peer, [media])
        self.assertTrue(isinstance(send, AsyncTask))
        self.assertTrue(isinstance(send.wait(), UUID))

    @patch('requests.put')
    def test_send_image(self, put):
        put.return_value = Put(200)
        send = bot.messaging.send_image(self.peer, self.test_file)
        self.assertTrue(isinstance(send, AsyncTask))
        self.assertTrue(isinstance(send.wait(), UUID))
        put.return_value = Put(400)
        send = bot.messaging.send_image(self.peer, self.test_file)
        self.assertTrue(isinstance(send, AsyncTask))
        self.assertIsNone(send.wait())

    def test_reply(self):
        reply = bot.messaging.reply(self.peer, [UUID(1, 1)], None,
                                    self.interactive_media)
        self.assertTrue(isinstance(reply, AsyncTask))
        self.assertTrue(isinstance(reply.wait(), UUID))

    def test_forward(self):
        forward = bot.messaging.forward(self.peer, [UUID(1, 1)], None,
                                        self.interactive_media)
        self.assertTrue(isinstance(forward, AsyncTask))
        self.assertTrue(isinstance(forward.wait(), UUID))

    def test_load_message_history(self):
        history = bot.messaging.load_message_history(
            self.peer, 0, ListLoadMode.LISTLOADMODE_BACKWARD, 1)
        self.assertTrue(isinstance(history, AsyncTask))
        self.assertTrue(isinstance(history.wait()[0], Message))