Beispiel #1
0
async def handler(event):
    builder = event.builder
    result = None
    query = event.text.lower()
    if query == 'ping':
        result = builder.article('Pong!', text='This bot works inline')
    elif query == 'group':
        result = builder.article(
            'Move to the right group!',
            text='Try moving to the [right group](t.me/TelethonChat)',
            buttons=custom.Button.url('Join the group!', 't.me/TelethonChat'),
            link_preview=False)
    elif query in ('python', 'learn'):
        result = builder.article('Resources to Learn Python',
                                 text=GOOD_RESOURCES,
                                 link_preview=False)
    else:
        m = re.match('(client|msg).(.+)', query)
        if m:
            text = get_docs_message(m.group(1), m.group(2))
            query = markdown.parse(text)[0]
            result = builder.article(query, text=text)
        else:
            m = re.match('ref.(.+)', query)
            if m:
                query = m.group(1)
                text = DOCS.format(query, urllib.parse.quote(query))
                result = builder.article(query, text=text)

    await event.answer([result] if result else None)
Beispiel #2
0
    def test_dump_msg_entities(self):
        """Show that entities are correctly parsed and stored"""
        message = types.Message(
            id=1,
            to_id=types.PeerUser(321),
            date=datetime.now(),
            message='No entities'
        )
        dumper = Dumper(self.dumper_config)
        fmt = BaseFormatter(dumper.conn)

        # Test with no entities
        await dumper.dump_message(message, 123, None, None)
        dumper.commit()
        assert not next(fmt.get_messages_from_context(123, order='DESC')).formatting

        # Test with many entities
        text, entities = markdown.parse(
            'Testing message with __italic__, **bold**, inline '
            '[links](https://example.com) and [mentions](@hi), '
            'as well as `code` and ``pre`` blocks.'
        )
        entities[3] = types.MessageEntityMentionName(
            entities[3].offset, entities[3].length, 123
        )
        message.id = 2
        message.date -= timedelta(days=1)
        message.message = text
        message.entities = entities
        await dumper.dump_message(message, 123, None, None)
        dumper.commit()
        msg = next(fmt.get_messages_from_context(123, order='ASC'))
        assert utils.decode_msg_entities(msg.formatting) == message.entities
def test_entities_together():
    """
    Test that an entity followed immediately by a different one behaves well.
    """
    original = '**⚙️**__Settings__'
    stripped = '⚙️Settings'

    text, entities = markdown.parse(original)
    assert text == stripped
    assert entities == [MessageEntityBold(0, 2), MessageEntityItalic(2, 8)]

    text = markdown.unparse(text, entities)
    assert text == original
def test_offset_at_emoji():
    """
    Tests that an entity starting at a emoji preserves the emoji.
    """
    text = 'Hi\n👉 See example'
    entities = [
        MessageEntityBold(0, 2),
        MessageEntityItalic(3, 2),
        MessageEntityBold(10, 7)
    ]
    parsed = '**Hi**\n__👉__ See **example**'

    assert markdown.parse(parsed) == (text, entities)
    assert markdown.unparse(text, entities) == parsed
Beispiel #5
0
    async def handler(event):
        builder = event.builder
        result = None
        query = event.text.lower()
        m = re.match('(client|msg).(.+)', query)
        if m:
            text = get_docs_message(m.group(1), m.group(2))
            query = markdown.parse(text)[0]
            result = builder.article(query, text=text)
        else:
            m = re.match('ref.(.+)', query)
            if m:
                query = m.group(1)
                text = DOCS.format(query, urllib.parse.quote(query))
                result = builder.article(query, text=text)

        await event.answer([result] if result else None)
Beispiel #6
0
async def answer(self,
                 *args,
                 log: str or Tuple[str, str] = None,
                 reply: bool = False,
                 **kwargs) -> Union[custom.Message, List[custom.Message]]:
    """Custom bound method for the Message object"""
    message_out = None
    message = await self.client.get_messages(self.chat_id, ids=self.id)
    reply_to = self.reply_to_msg_id or self.id

    if len(args) == 1 and isinstance(args[0], str):
        is_reply = reply or kwargs.get('reply_to', False)
        text = args[0]
        msg, msg_entities = markdown.parse(text)
        if len(msg) <= MAXLIM:
            if (not (message and message.out) or is_reply or self.fwd_from or
                (self.media
                 and not isinstance(self.media, types.MessageMediaWebPage))):
                kwargs.setdefault('reply_to', reply_to)
                try:
                    kwargs.setdefault('silent', True)
                    message_out = await self.respond(text, **kwargs)
                except Exception as e:
                    LOGGER.exception(e)
            else:
                if len(msg_entities) > 100:
                    messages = await _resolve_entities(msg, msg_entities)
                    chunks = [markdown.unparse(t, e) for t, e in messages]
                    message_out = []
                    try:
                        first_msg = await self.edit(chunks[0], **kwargs)
                    except errors.rpcerrorlist.MessageIdInvalidError:
                        first_msg = await self.respond(chunks[0], **kwargs)
                    except Exception as e:
                        LOGGER.exception(e)
                    message_out.append(first_msg)
                    for t in chunks[1:]:
                        try:
                            kwargs.setdefault('silent', True)
                            sent = await self.respond(t, **kwargs)
                            message_out.append(sent)
                        except Exception as e:
                            LOGGER.exception(e)
                else:
                    try:
                        message_out = await self.edit(text, **kwargs)
                    except errors.rpcerrorlist.MessageIdInvalidError:
                        message_out = await self.respond(text, **kwargs)
                    except Exception as e:
                        LOGGER.exception(e)
        else:
            if (message and message.out
                    and not (message.fwd_from or message.media)):
                try:
                    await self.edit("`Output exceeded the limit.`")
                except errors.rpcerrorlist.MessageIdInvalidError:
                    await self.respond("`Output exceeded the limit.`")
                except Exception as e:
                    LOGGER.exception(e)

            kwargs.setdefault('reply_to', reply_to)
            output = io.BytesIO(msg.strip().encode())
            output.name = "output.txt"
            try:
                kwargs.setdefault('silent', True)
                message_out = await self.respond(file=output, **kwargs)
                output.close()
            except Exception as e:
                output.close()
                LOGGER.exception(e)
    else:
        kwargs.setdefault('reply_to', reply_to)
        try:
            kwargs.setdefault('silent', True)
            message_out = await self.respond(*args, **kwargs)
        except Exception as e:
            LOGGER.exception(e)

    if log:
        if isinstance(log, tuple):
            command, extra = log
            text = f"**USERBOT LOG** #{command}"
            if extra:
                text += f"\n{extra}"
        else:
            text = f"**USERBOT LOG** `Executed command:` #{log}"
        if self.client.logger:
            logger_group = self.client.config['userbot'].getint(
                'logger_group_id', False)
            entity = False
            try:
                entity = await self.client.get_input_entity(logger_group)
            except TypeError:
                LOGGER.info("Your logger group ID is unsupported")
            except ValueError:
                LOGGER.info("Your logger group ID cannot be found")
            except Exception as e:
                LOGGER.exception(e)

            if entity:
                message, msg_entities = markdown.parse(text)
                if len(message) <= MAXLIM and len(msg_entities) < 100:
                    messages = [(message, msg_entities)]
                else:
                    messages = await _resolve_entities(message, msg_entities)
                for text, entities in messages:
                    try:
                        await self.client(
                            functions.messages.SendMessageRequest(
                                peer=entity,
                                message=text,
                                no_webpage=True,
                                silent=True,
                                entities=entities))
                        await asyncio.sleep(2)
                    except Exception as e:
                        print("Report this error to the support group.")
                        LOGGER.exception(e)
    return message_out