mirror of
https://github.com/LonamiWebs/Telethon.git
synced 2024-11-22 01:16:35 +03:00
Move working with messages to the wiki
parent
f40c4408b2
commit
33a6792667
117
Sending-more-than-just-messages.md
Normal file
117
Sending-more-than-just-messages.md
Normal file
|
@ -0,0 +1,117 @@
|
|||
The current version of the library, v1, does not yet implement some features in the friendly methods, such as spoilers in `client.send_message`. And it never might, as it increases the maintenance burden, but are not so commonly used. However, that doesn't mean the library can't do those things.
|
||||
|
||||
|
||||
# Sending stickers
|
||||
|
||||
Stickers are nothing else than ``files``, and when you successfully retrieve the stickers for a certain sticker set, all you will have are ``handles`` to these files. Remember, the files Telegram holds on their servers can be referenced through this pair of ID/hash (unique per user), and you need to use this handle when sending a "document" message. This working example will send yourself the very first sticker you have:
|
||||
|
||||
```python
|
||||
# Get all the sticker sets this user has
|
||||
from telethon.tl.functions.messages import GetAllStickersRequest
|
||||
sticker_sets = await client(GetAllStickersRequest(0))
|
||||
|
||||
# Choose a sticker set
|
||||
from telethon.tl.functions.messages import GetStickerSetRequest
|
||||
from telethon.tl.types import InputStickerSetID
|
||||
sticker_set = sticker_sets.sets[0]
|
||||
|
||||
# Get the stickers for this sticker set
|
||||
stickers = await client(GetStickerSetRequest(
|
||||
stickerset=InputStickerSetID(
|
||||
id=sticker_set.id, access_hash=sticker_set.access_hash
|
||||
),
|
||||
hash=0
|
||||
))
|
||||
|
||||
# Stickers are nothing more than files, so send that
|
||||
await client.send_file('me', stickers.documents[0])
|
||||
```
|
||||
|
||||
# Sending reactions
|
||||
|
||||
It works very similar to replying to a message. You need to specify the chat, message ID you wish to react to, and reaction, using :tl:`SendReaction`:
|
||||
|
||||
```python
|
||||
from telethon.tl.functions.messages import SendReactionRequest
|
||||
await client(SendReactionRequest(
|
||||
peer=chat,
|
||||
msg_id=42,
|
||||
reaction=[types.ReactionEmoji(
|
||||
emoticon='❤️'
|
||||
)]
|
||||
))
|
||||
```
|
||||
|
||||
Note that you cannot use strings like ``:heart:`` for the reaction. You must use the desired emoji directly. You can most easily achieve this by copy-pasting the emoji from an official application such as Telegram Desktop.
|
||||
|
||||
If for some reason you cannot embed emoji directly into the code, you can also use its unicode escape (which you can find using websites like [unicode-table.com](https://unicode-table.com/en/emoji/)), or install a different package, like [`emoji`](https://pypi.org/project/emoji/):
|
||||
|
||||
```python
|
||||
# All of these work exactly the same (you only need one):
|
||||
import emoji
|
||||
reaction = emoji.emojize(':red_heart:')
|
||||
reaction = '❤️'
|
||||
reaction = '\u2764'
|
||||
|
||||
from telethon.tl.functions.messages import SendReactionRequest
|
||||
await client(SendReactionRequest(
|
||||
peer=chat,
|
||||
msg_id=42,
|
||||
reaction=[types.ReactionEmoji(
|
||||
emoticon=reaction
|
||||
)]
|
||||
))
|
||||
```
|
||||
|
||||
Please make sure to check the help pages of the respective websites you use if you need a more in-depth explanation on how they work. Telethon only needs you to provide the emoji in some form. Some packages or websites can make this easier.
|
||||
|
||||
|
||||
# Sending spoilers and custom emoji
|
||||
|
||||
Telethon's v1 `markdown` parser does not offer a way to send spoiler (hidden text) or custom emoji. However, it's easy to add support for them.
|
||||
|
||||
Telethon's [`parse_mode`](https://docs.telethon.dev/en/stable/modules/client.html#telethon.client.messageparse.MessageParseMethods.parse_mode) supports using a custom object with `parse` and `unparse` functions to work. This means it's possible to leverage the current markdown implementation and extend it with custom functionality.
|
||||
|
||||
Copy the following code into your own:
|
||||
|
||||
```python
|
||||
from telethon.extensions import markdown
|
||||
from telethon import types
|
||||
|
||||
class CustomMarkdown:
|
||||
@staticmethod
|
||||
def parse(text):
|
||||
text, entities = markdown.parse(text)
|
||||
for i, e in enumerate(entities):
|
||||
if isinstance(e, types.MessageEntityTextUrl):
|
||||
if e.url == 'spoiler':
|
||||
entities[i] = types.MessageEntitySpoiler(e.offset, e.length)
|
||||
elif e.url.startswith('emoji/'):
|
||||
entities[i] = types.MessageEntityCustomEmoji(e.offset, e.length, int(e.url.split('/')[1]))
|
||||
return text, entities
|
||||
@staticmethod
|
||||
def unparse(text, entities):
|
||||
return markdown.unparse(text, entities)
|
||||
```
|
||||
|
||||
This creates a custom class with `parse` and `unparse`. `CustomMarkdown.parse` uses `markdown.parse` (so it works just like the default markdown), but before returning, it scans the parsed text for the following inline URLs:
|
||||
|
||||
```python
|
||||
message = 'this is a [link text](spoiler) and [❤️](emoji/10002345) too'
|
||||
```
|
||||
|
||||
Here, the message contains a `link text` with URL `spoiler`. The above code will replace the URL with [`MessageEntitySpoiler`](https://tl.telethon.dev/constructors/message_entity_spoiler.html). It also contains a URL with `emoji/10002345`, which will be replaced with [`MessageEntityCustomEmoji`](https://tl.telethon.dev/constructors/message_entity_custom_emoji.html). Effectively sending those instead of the URL.
|
||||
|
||||
To use the class, you must change your `client.parse_mode` to it (be sure to use an instance, because the type is callable and the library would attempt to create an instance to parse it):
|
||||
|
||||
```python
|
||||
client.parse_mode = CustomMarkdown()
|
||||
```
|
||||
|
||||
Now, in your message text, you can use inline links which become spoilers and custom emoji! (Note that for custom emoji to work, the inline link text **must** be a normal emoji):
|
||||
|
||||
```python
|
||||
client.send_message('me', 'hello this is a [hidden text](spoiler), with custom emoji [❤️](emoji/10002345) !')
|
||||
```
|
||||
|
||||
You may have noticed the emoji URL is followed by a number. This number is a `document_id`. To find it, the easiest way is to send a message to your own chat with the premium emoji you want to use using an official client, and then use Telethon to print the `message.entities`. It will contain the `document_id` you need to use.
|
|
@ -1,47 +0,0 @@
|
|||
Telethon's v1 `markdown` parser does not offer a way to send spoiler (hidden text) or custom emoji. However, it's easy to add support for them.
|
||||
|
||||
Telethon's [`parse_mode`](https://docs.telethon.dev/en/stable/modules/client.html#telethon.client.messageparse.MessageParseMethods.parse_mode) supports using a custom object with `parse` and `unparse` functions to work. This means it's possible to leverage the current markdown implementation and extend it with custom functionality.
|
||||
|
||||
Copy the following code into your own:
|
||||
|
||||
```python
|
||||
from telethon.extensions import markdown
|
||||
from telethon import types
|
||||
|
||||
class CustomMarkdown:
|
||||
@staticmethod
|
||||
def parse(text):
|
||||
text, entities = markdown.parse(text)
|
||||
for i, e in enumerate(entities):
|
||||
if isinstance(e, types.MessageEntityTextUrl):
|
||||
if e.url == 'spoiler':
|
||||
entities[i] = types.MessageEntitySpoiler(e.offset, e.length)
|
||||
elif e.url.startswith('emoji/'):
|
||||
entities[i] = types.MessageEntityCustomEmoji(e.offset, e.length, int(e.url.split('/')[1]))
|
||||
return text, entities
|
||||
@staticmethod
|
||||
def unparse(text, entities):
|
||||
return markdown.unparse(text, entities)
|
||||
```
|
||||
|
||||
This creates a custom class with `parse` and `unparse`. `CustomMarkdown.parse` uses `markdown.parse` (so it works just like the default markdown), but before returning, it scans the parsed text for the following inline URLs:
|
||||
|
||||
```python
|
||||
message = 'this is a [link text](spoiler) and [❤️](emoji/10002345) too'
|
||||
```
|
||||
|
||||
Here, the message contains a `link text` with URL `spoiler`. The above code will replace the URL with [`MessageEntitySpoiler`](https://tl.telethon.dev/constructors/message_entity_spoiler.html). It also contains a URL with `emoji/10002345`, which will be replaced with [`MessageEntityCustomEmoji`](https://tl.telethon.dev/constructors/message_entity_custom_emoji.html). Effectively sending those instead of the URL.
|
||||
|
||||
To use the class, you must change your `client.parse_mode` to it (be sure to use an instance, because the type is callable and the library would attempt to create an instance to parse it):
|
||||
|
||||
```python
|
||||
client.parse_mode = CustomMarkdown()
|
||||
```
|
||||
|
||||
Now, in your message text, you can use inline links which become spoilers and custom emoji! (Note that for custom emoji to work, the inline link text **must** be a normal emoji):
|
||||
|
||||
```python
|
||||
client.send_message('me', 'hello this is a [hidden text](spoiler), with custom emoji [❤️](emoji/10002345) !')
|
||||
```
|
||||
|
||||
You may have noticed the emoji URL is followed by a number. This number is a `document_id`. To find it, the easiest way is to send a message to your own chat with the premium emoji you want to use using an official client, and then use Telethon to print the `message.entities`. It will contain the `document_id` you need to use.
|
Loading…
Reference in New Issue
Block a user