Skip to content

Commit 7ede9c1

Browse files
committed
Add unescaped message to longpoll
1 parent 63ed42f commit 7ede9c1

1 file changed

Lines changed: 20 additions & 10 deletions

File tree

vk_api/longpoll.py

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -321,9 +321,13 @@ class Event(object):
321321
""" Событие, полученное от longpoll-сервера.
322322
323323
Имеет поля в соответствии с `документацией
324-
<https://vk.com/dev/using_longpoll?f=3.%20Структура%20событий>`_.
324+
<https://vk.com/dev/using_longpoll_2?f=3.%2BСтруктура%2Bсобытий>`_.
325325
326-
События с полем `timestamp` также дополнительно имеют поле `datetime`
326+
События `MESSAGE_NEW` и `MESSAGE_EDIT` имеют (среди прочих) такие поля:
327+
- `text` - `экранированный <https://ru.wikipedia.org/wiki/Мнемоники_в_HTML>`_ текст
328+
- `message` - оригинальный текст сообщения.
329+
330+
События с полем `timestamp` также дополнительно имеют поле `datetime`.
327331
"""
328332

329333
def __init__(self, raw):
@@ -375,12 +379,9 @@ def __init__(self, raw):
375379
elif self.type is VkEventType.PEER_FLAGS_REPLACE:
376380
self._parse_peer_flags()
377381

378-
elif self.type is VkEventType.MESSAGE_NEW:
382+
elif self.type in [VkEventType.MESSAGE_NEW, VkEventType.MESSAGE_EDIT]:
379383
self._parse_message()
380384

381-
elif self.type is VkEventType.MESSAGE_EDIT:
382-
self.text = self.text.replace('<br>', '\n')
383-
384385
elif self.type in [VkEventType.USER_ONLINE, VkEventType.USER_OFFLINE]:
385386
self.user_id = abs(self.user_id)
386387
self._parse_online_status()
@@ -427,12 +428,21 @@ def _parse_peer_flags(self):
427428
)
428429

429430
def _parse_message(self):
430-
if self.flags & VkMessageFlag.OUTBOX:
431-
self.from_me = True
432-
else:
433-
self.to_me = True
431+
if self.type is VkEventType.MESSAGE_NEW:
432+
if self.flags & VkMessageFlag.OUTBOX:
433+
self.from_me = True
434+
else:
435+
self.to_me = True
436+
437+
# ВК возвращает сообщения в html-escaped виде,
438+
# при этом переводы строк закодированы как <br> и не экранированы
434439

435440
self.text = self.text.replace('<br>', '\n')
441+
self.message = self.text \
442+
.replace('&lt;', '<') \
443+
.replace('&gt;', '>') \
444+
.replace('&quot;', '"') \
445+
.replace('&amp;', '&')
436446

437447
def _parse_online_status(self):
438448
try:

0 commit comments

Comments
 (0)