Передача личных сообщений

DMconnect

На стороне сервера

На стороне сервера передача личных сообщений происходит по следующему алгоритму:

  1. Сравнение формата сокета-получаетял с форматом WS
  2. Если формат соответствует WS, сервер асинхронно отправляет (Private) USER: MSG (подробности будут ниже)
  3. Если формат не соответствует WS, сервер отправляет сообщение (Private) USER: MSG\n (подробности также будут ниже)

Конструкция сообщения

А теперь подробнее про конструкцию приватных (личных) сообщений. Тут :_ (_ заменяет пропуск) - стандартная конструкция 3A 20 (см. предыдущий документ), т. е. формат разделения идентичен обычным сообщениям на подсервере (USER: MSG), но тут прибавляется ещё (Private). Этот префикс в HEX:

28 50 72 69 76 61 74 65 29 20
(HEX-вид префикса)

Обратите внимание на символ 20 - он тут не лишний, а как раз нужный. Т. е. финальная конструкция личного сообщения включает сразу два разделителя, возьмем за начинающий символ разделителя #1 (представлен выше) символ 29. Наша финальная конструкция будет выглядеть так:

28 50 72 69 76 61 74 65 29 20 USER 3A 20 MSG
(финальный вид конструкции с синтаксисом)

К сожалению, определить точный размер даже такой конструкции невозможно, ведь объем имени пользователя и самого сообщения всегда разный. Тем не менее, если взять за объем имени 1 байт (например, 61), а за сообщения - тоже 1 байт (возьмем 62), то объем пакета такой конструкции будет 14 байт / 112 бит. Сформируем конструкцию с нашими параметрами 61 и 62:

28 50 72 69 76 61 74 65 29 20 61 3A 20 62
(пакет сообщения с параметрами, размер - 14 байт)

На самом деле, размер такого пакета почти ни на что не влияет. Во-первых, потому что обычно используется разделение конструкции и самих данных, т. е. для нашего примера клиент примет отдельно 28 50 72 69 76 61 74 65 29 20 x 3A 20 x и 61 62, заменяя пропуски. Как можно видеть из примера, расстояние между двумя параметрами - всего 2 байта / 16 бит, так что отделить такое сообщение по паттерну не составит особого труда.

Работа с сообщениями на стороне клиента

Мы уже говорили, что у подобного рода пакетов не может быть четко установленного объема, но может быть чёткий объем конструкции. Увы, но для клиента отправлять сообщение придется без разделения, таким образом:

2F 70 6D 20 USER 20 MSG
(вид пакета)

Тут тоже обратите внимание на разделяющий символ 20 - это особая конструкция разделения без начинающего символа (вернее, когда начинающий символ является и завершающим). Проще говоря - это разделительная конструкция из одного символа (какого - думаю, понятно). На пакет неправильного вида сервер ответит следующим образом:

55 73 61 67 65 3A 20 2F 70 6D 20 3C 75 73 65 72 6E 61 6D 65 3E 20 3C 6D 65 73 73 61 67 65 3E
(ответ в HEX)

Usage: /pm <username> <message>
(обработанный ответ в UTF-8)

Размер этого пакета данных равен 31 байтам / 248 битам. Рассмотрим возможные ответы сервера далее. Вот так выглядит ответ сервера, если имя получателя не зарегстрирован:

55 73 65 72 20 64 6F 65 73 20 6E 6F 74 20 65 78 69 73 74 2E
(ответ в HEX)

User does not exist.
(обработанный ответ в UTF-8)

Размер уже этого пакета - 20 байт / 160 бит. Такой ответ от сервера будет, в случае, если пользователь попробует отправить сообщение самому себе, например, заполнив 1-й пропуск (см. конструкцию отправляемого пакета выше) своим USERNAME:

59 6F 75 20 63 61 6E 6E 6F 74 20 73 65 6E 64 20 70 72 69 76 61 74 65 20 6D 65 73 73 61 67 65 73 20 74 6F 20 79 6F 75 72 73 65 6C 66 2E
(ответ в HEX)

You cannot send private messages to yourself.
(обработанный ответ в UTF-8)

Размер этого пакета - 45 байт / 360 бит. Ответ сервера, в случае получатель находится в списке заблокированных на сервере:

USER 20 69 73 20 62 61 6E 6E 65 64 2E
(ответ в HEX)

USER is banned.
(обработанный ответ в UTF-8)

У этого пакета нет точного размера, т. к. присутствует изменяемый параметр (USER). Обратите внимание на символ 20, их тут два. Это - односимвольная разделяющая конструкция между переменной и конструкцией самого пакета. Если личное сообщение не удалось доставить по неизвестной причине, ответ сервера будет таким:

46 61 69 6C 65 64 20 74 6F 20 73 65 6E 64 20 70 72 69 76 61 74 65 20 6D 65 73 73 61 67 65 2E
(ответ в HEX)

Failed to send private message.
(обработанный ответ в UTF-8)

Размер этого пакета - 31 байт / 248 бит. Переходим к последнему ответу сервера - SUCESS. Ответный пакет выглядит так:

50 72 69 76 61 74 65 20 6D 65 73 73 61 67 65 20 73 65 6E 74 20 74 6F 20 USER xxx 2E
(ответ в HEX)

Private message sent to USER.
(обработанный ответ в UTF-8)

У этого пакета также нет точного размера, но обратите внимание на символ 2E. Это - завершающий HEX-символ после переменной в данных пакета. Т. е. данные отделены сразу двумя односимвольными конструкциями - 20 и 2E.

В заключение

Документ подготовлен PredoK_CyXaR и Octavian. Оригинальный адрес документа: http://rsd.w10.site/docs/dmc_rsd4.htm. Спасибо за внимание!