Передача личных сообщений
DMconnect
На стороне сервера передача личных сообщений происходит по следующему алгоритму:
А теперь подробнее про конструкцию приватных (личных) сообщений. Тут :_ (_ заменяет пропуск) - стандартная конструкция 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. Спасибо за внимание!