Skip to content

Commit

Permalink
Update msgs.md
Browse files Browse the repository at this point in the history
  • Loading branch information
1aerostorm authored Aug 30, 2024
1 parent 7572acf commit e85ff50
Showing 1 changed file with 31 additions and 8 deletions.
39 changes: 31 additions & 8 deletions golos-lib-js/docs/files/msgs.md
Original file line number Diff line number Diff line change
Expand Up @@ -147,23 +147,46 @@ golos.messages.newImageMsg('https://site.com/https-is-recommended.jpg', (err, ms

:electron: `golos.messages.decodeMsgs` использует WebAssembly.

```js
await golos.importNativeLib();
Пример для приватного чата:

golos.api.getThread('alice', 'bob', {}, (err, results) => {
results = golos.messages.decode('alice private key', 'bob public memo key', results);
```js
golos.api.getThread({ from: 'alice', to: 'bob', }, (err, results) => {
results = await golos.messages.decodeMsgs({ private_memo: 'alice private key', msgs: results })
alert(results[0].message.body);
});
```

**Примечание:** это также проверяет сообщения на соответствие следующим правилам:
В случае с группой, getThread позволяет **сразу** расшифровать сообщения.
От Алисы для этого нужен не memo-, а posting-ключ.

```js
const results = await golos.auth.withNodeLogin({ account: 'alice', keys: {
posting: 'alice POSTING key',
}, call: async (loginData) => {
const th = await golos.api.getThreadAsync({
...loginData,
group: 'test-group',
})
return th
}})
alert(results)
```

Однако, перед рендерингом сообщений в uI вам все равно нужно вызвать `decodeMsgs`, чтобы:
- проверить сообщения на соответствие правилам (об этом ниже) и по результатам проверки либо исключить, либо пометить ошибочные сообщения;
- можно было вызывать `getThread` только при открытии пользователем группы, как более тяжелый, а при получении новых сообщений через Golos Notify Service вызывать лишь `decodeMsgs`.

При этом, `decodeMsgs` расшифрует лишь те сообщения в массиве, которые не были расшифрованы до этого (встроенной расшифровкой в `getThread`, или прошлым вызовом `decodeMsgs`).
Для еще большей оптимизации вы можете кешировать сообщения, используя `before_decode` и `for_each`, как это делаем мы в коде Golos Messenger.

**Примечание:** `decodeMsgs` также проверяет сообщения на соответствие следующим правилам:
- сообщение должно быть правильным объектом JSON с полями, соответствующими следующим правилам;
- поле `app` должно быть строкой длиной от 1 до 16;
- поле `версия` должно быть целым числом, начиная с 1;
- body должно быть строкой;
- для сообщений-изображений: previewWidth и previewHeight должны быть целыми числами, которые являются результатом подгонки изображения к области 600x300 пикселей.

**Примечание:** если сообщение не может быть расшифровано, распарсено как JSON и/или проверено, оно все равно добавляется к результату, но имеет `message: null` (если не может быть распарсено как JSON или проверено) и `raw_message: null` (если вообще не может быть расшифровано). Такое поведение позволяет клиенту пометить это сообщение как прочитанное в блокчейне, но не отображать его пользователю. Если вы хотите изменить это поведение, вы можете переопределить параметр `on_error` в `golos.messages.decode` (подробнее см. в коде).
**Примечание:** если сообщение не может быть расшифровано, распарсено как JSON и/или проверено, оно все равно добавляется к результату, но имеет `message: null` (если не может быть распарсено как JSON или проверено) и `raw_message: null` (если вообще не может быть расшифровано). Такое поведение позволяет клиенту пометить это сообщение как прочитанное в блокчейне, но не отображать его пользователю. Если вы хотите изменить это поведение, вы можете переопределить параметр `on_error` в `golos.messages.decodeMsgs` (подробнее см. в коде).

### Мгновенное получение сообщений

Expand All @@ -181,7 +204,7 @@ golos.api.getThread('alice', 'bob', {}, (err, results) => {

Для создания диапазонов вы можете использовать `golos.messages.makeDatedGroups`, который строит такие диапазоны по условию и может превращать их в реальные операции "на лету".

Он принимает декодированные сообщения от `golos.messages.decode`.
Он принимает декодированные сообщения от `golos.messages.decodeMsgs`.

**Примечание: функция должна перебирать сообщения от start к end.**

Expand Down Expand Up @@ -257,7 +280,7 @@ msg = {...msg, ...quote}; // добавляем цитату

#### Отображение сообщений с цитатами

`golos.messages.decode` поддерживает сообщения с цитатами. Каждое такое сообщение имеет поле `quote` в своем поле `сообщение`. Но, если `quote` сообщения неверна (сообщение составлено с некорректным пользовательским интерфейсом, который не использует `makeQuoteMsg` и неправильно составляет цитаты), **весь объект сообщения будет считаться некорректным**, то есть поле `message` будет `null`.
`golos.messages.decodeMsgs` поддерживает сообщения с цитатами. Каждое такое сообщение имеет поле `quote` в своем поле `сообщение`. Но, если `quote` сообщения неверна (сообщение составлено с некорректным пользовательским интерфейсом, который не использует `makeQuoteMsg` и неправильно составляет цитаты), **весь объект сообщения будет считаться некорректным**, то есть поле `message` будет `null`.

#### Редактирование сообщений с цитатами

Expand Down

0 comments on commit e85ff50

Please sign in to comment.