Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Всё о Direct Connect _ Описание Протокола NMDC

Автор: Setuper 16.12.2008, 18:57

Protocol NMDC

Структурированное описание протокола NeoModus Direct Connect (NMDC), под управлением которого на сегодняшний день работает подавляющее большинство хабов. Хотя уже внедряется новый протокол ADC, однако, как говориться, всему своё время.

По мере написания, на каждую команду будет появляться ссылка на пост, описывающий эту команду.
Делаю тему закрытой, дабы структурировано описать команды.


О структуре команд

Все команды протокола начинаются с символа $. Исключение составляет команда сообщения чата, которая должна иметь следующую структуру:
Код
<Ник> Сообщение|
При этом, данный синтаксис команды чата обязателен в направлении клиент -> хаб, в то время, как хаб может отсылать клиенту любые сообщения, не начинающиеся с символа $, и клиент должен принимать такие сообщения, однако обработка таких сообщение не регламентирована протоколом (клиент может отображать такие сообщения как в чате, так и в статусной строке, или же вовсе игнорировать такие сообщения).

Символы-разделители протокола: $, | и пробел. Протокол не имеет экранирующих символов, поэтому для отсылки символов $ и | в параметрах команд нужно использовать их коды: &#36; и &#124;
Строка сообщения разделяется на команды по средствам символа |. Пример трёх команд, отосланных одной строкой:
Код
$Cmd1 параметр|$Cmd2|$Cmd3 параметр1 параметр2$параметр3|



Взаимодействие хаб-клиент


$BadPass
$Close
$ConnectToMe
$ForceMove
$GetINFO
$GetNickList
$GetPass
$Hello
$HubIsFull
$HubName
$HubTopic
$Key
$Kick
$Lock
$LogedIn
$MyINFO
$MyPass
$MultiConnectToMe
$MultiSearch
$NickList
$OpForceMove
$OpList
$Quit
$RevConnectToMe
$Search
$SR
$Supports
$UserCommand
$UserIP
$Version
$ValidateNick
$ValidateDenide


Взаимодействие клиент-клиент

$Cancel
$Canceled
$Direction
$Error
$Failed
$FileLength
$Get
$GetListLen
$Key
$Lock
$MaxedOut
$MyNick
$Ping
$Send
$To


Взаимодействие хаб-хаб

$FeaturedNetworks
$ConnectToMe
$Search
$SR
$Up
$UpToo




Взаимодействие хаб-хаблист

$Key
$Lock
$Supports


Взаимодействие пингер-хаб

$BotINFO
$HubINFO
$Key
$Lock
$Supports


Команды характеристик

$ADCGET / $ADCSND
$BotList
$Capabilities
$FeaturedNetworks
$GetZBlock
$MCTo
$Sending
$UGetBlock
$UGetZBlock
$Z
$ZOn


Разное

TTH
Lock2Key


Известные характеристики

Хаб-Клиент:
BotList
ClientID
Feed
HubTopic
IN
MCTo
NoGetINFO
NoHello
OpPlus
QuickList
TTHSearch
UserCommand
UserIP2
ZLine
ZPipe0

Клиент-Клиент:
ADCGet
BZList
CHUNK
ClientID
GetCID
GetTestZBlock
GetZBlock
MiniSlots
TTHL
TTHF
XmlBZList
ZLIG



Общая (обязательная) последовательность входа на хаб.
"Рукопожатие" между клиентом и хабом.

Общая (обязательная) последовательность входа на хаб
Хаб:
Код
$Lock [Код] Pk=[PrimaryKey]|

Клиент:
Код
$Key [Рассчитанный_ключ]|$ValidateNick [Ник]|

Хаб:
Код
$HubName [Имя_хаба]|$Hello [Ник]|

Клиент:
Код
$Version [Версия]|$GetNickList|$MyINFO [Строка]|

Хаб:
Код
Отсылает список пользователей.


Примечания:
  1. Команда $HubName может "выпадать" из этой последовательности и отсылаться, например, после команды $Lock, или вовсе отсутствовать.
  2. Если в начале параметра команды $Lock присутствует слово EXTENDEDPROTOCOL, то клиент должен отослать на хаб команду с поддерживаемыми им характеристиками $Supports. В ответ хаб должен отослать такую же команду со своими характеристиками. Однако, данный механизм обмена характеристиками фактически является не обязательным.
  3. Также, вне зависимости от данной последовательности, в любом месте входа хаб может отослать клиенту команду чата: "<[Бот_хаба]> Этот хаб работает под управлением...".
  4. При входе, клиент отошлёт команды $Version, $GetNickList и $MyINFO только после того, как получит от хаба команду $Hello [Ник], причём со своим ником, который он отсылал на хаб в команде $ValidateNick. Причем команда $GetNickList может и вовсе не отсылаться клиентом.
  5. Команду $Version клиент может отослать и раньше указанного шага (например, непосредственно после $ValidateNick), однако она должна быть отослана до команды $MyINFO.
  6. При отсылке хабом списка пользователей, хаб руководствуется поддержкой со стороны клиента той или иной характеристики. Подробности см. в описании характеристик NoHello и NoGetINFO.


Вход на пальцах выглядит так: Клиент коннектится, сервер отвечает командой $Lock, что мол я такой-то сервер, на что клиент отвечает: ок раз ты такой-то сервер - вот тебе ключ ($Key) и проверь мой ник ($ValidateNick), сервер проверяет ник и отправляет клиенту приглашение на вход под этим ником ($Hello), на что клиент отправляет на сервер внутреннюю версию ($Version), запрашивает список пользователей ($GetNickList) и отправляет информацию о себе ($MyINFO), а сервер отсылает ему список пользователей хаба.



Последовательность входа на хаб, который поддерживает характеристику QuickList.
Входа на хаб при поддержке характеристики QuickList (быстрый вход)
Хаб:
Код
$Lock EXTENDEDPROTOCOL[Код] Pk=[PrimaryKey]|

Клиент:
Код
$Supports QuickList|$Key [Рассчитанный_ключ]|

Хаб:
Код
$Supports QuickList|

Клиент:
Код
$MyINFO [Строка]|$GetNickList|

Хаб:
Код
Отсылает список пользователей.


См. подробности в характеристике QuickList



Последовательность действий хаба при регистрации в хаб-листе
Последовательность действий хаба при регистрации в хаб-листе
Хаб коннектится к хаб-листу.

Хаб-лист:
Код
$Lock [Код] Pk=[PrimaryKey]|

Хаб:
Код
$Key [Рассчитанный_ключ]|[Имя_хаба]|[Хост_хаба(:порт)]|[Описание_хаба]|[Число_юзеров]|[Текущая_шара]|


Тут хаб выступает в роли клиента. Он коннектится к прописанным в настройках хаб-листам и передаёт им текущую информацию о себе.
Коннект к хаб листу должен производится не чаще чем раз в 15 минут, в противном случае, хаб может быть забанен хаб-листом)).



Последовательность входа на хаб PtokaX
(последовательные команды могут отсылаться одной строкой, разделённой символом | )
Последовательность входа на хаб PtokaX
Хаб -> Клиент: ---> $Lock EXTENDEDPROTOCOL[некий_ключ_хаба] Pk=PtokaX
Клиент -> Хаб: ---> $Supports UserCommand NoGetINFO NoHello UserIP2 TTHSearch ZPipe0 |$Key [ключ_сгенерированный_по_полученному_ключу_хаба]|$ValidateNick [Мой_ник]|
Выполнение скриптовой функции SupportsArrival
Выполнение скриптовой функции KeyArrival (выполнение не происходит, если проверка ключа отключена)
Выполнение скриптовой функции ValidateNickArrival
Хаб -> Клиент: ---> $Supports NoHello|$GetPass|
Клиент -> Хаб: ---> $MyPass [Мой_пароль]|
Выполнение скриптовой функции PasswordArrival
Хаб -> Клиент: ---> $Hello [Мой_ник]|
Клиент -> Хаб: ---> $Version 1,0091|$GetNickList|$MyINFO $ALL [Мой_ник] [Описание]<[Клиент] V:[Версия],M:[Режим],H:[Хабы],S:[Слоты]>$[EMail]$[Соедиение][Магический_байт]$ $[Шара]$|
Выполнение скриптовой функции VersionArrival
Выполнение скриптовой функции GetNickListArrival
Выполнение скриптовой функции MyINFOArrival
Хаб -> Клиент: ---> $LogedIn [Мой_ник]|$HubName [Имя_хаба] - [Топик]|<[Бот_хаба]> Этот хаб работает под управлением PtokaX DC Hub ...
Хаб -> Клиент: ---> $ZOn
Хаб -> Клиент: ---> $MyINFO $ALL [Бот_хаба] [Описание]$ $ $[EMail]$0$|$MyINFO $ALL [Ник1] [Описание]<[Клиент] V:[Версия],M:[Режим],H:[Хабы],S:[Слоты]>$[EMail]$[Соедиение][Магический_байт]$ $[Шара]$|$MyINFO $ALL [Ник2] [Описание]<[Клиент] V:[Версия],M:[Режим],H:[Хабы],S:[Слоты]>$[EMail]$[Соедиение][Магический_байт]$ $[Шара]$|
...
$MyINFO $ALL [Мой_ник] [Описание]<[Клиент] V:[Версия],M:[Режим],H:[Хабы],S:[Слоты]>$[EMail]$[Соедиение][Магический_байт]$ $[Шара]$|$OpList [Оператор1]$$[Оператор2]$$[Оператор3]$$ ... $$[ОператорN]$$|$UserIP [Ник1] [IP1]$$[Ник2] [IP2]$$ ... $$[НикN] [IPN]$$|
Выполнение скриптовых функций UserConnected, RegConnected и OpConnected


Примечание: Команда $LogedIn отсылается только в случае если у вас есть ключ (операторские права).

Внимание! Последовательность входа указана для одного потока. Для разных потоков она может быть произвольной, поэтому никогда не используйте глобальные таблицы пользователей, дабы сохранить принцип многопоточности.



Последовательность команд при получении списка пользователей (GetNickList) на хабе PtokaX
Последовательность команд при получении списка пользователей (GetNickList) на хабе PtokaX
Клиент -> Хаб: ---> $GetNickList|
Выполнение скриптовой функции GetNickListArrival
Хаб -> Клиент: ---> $MyINFO $ALL [Бот_хаба] [Описание]$ $ $[EMail]$0$
Хаб -> Клиент: ---> $MyINFO $ALL [Ник1] [Описание]<[Клиент] V:[Версия],M:[Режим],H:[Хабы],S:[Слоты]>$[EMail]$[Соедиение][Магический_байт]$ $[Шара]$|
Хаб -> Клиент: ---> $MyINFO $ALL [Ник2] [Описание]<[Клиент] V:[Версия],M:[Режим],H:[Хабы],S:[Слоты]>$[EMail]$[Соедиение][Магический_байт]$ $[Шара]$|
...
Хаб -> Клиент: ---> $MyINFO $ALL [Мой_ник] [Описание]<[Клиент] V:[Версия],M:[Режим],H:[Хабы],S:[Слоты]>$[EMail]$[Соедиение][Магический_байт]$ $[Шара]$|
Хаб -> Клиент: ---> $OpList [Оператор1]$$[Оператор2]$$[Оператор3]$$ ... $$[ОператорN]$$



Последовательность входа на хаб HeX
(последовательные команды могут отсылаться одной строкой, разделённой символом | )
Последовательность входа на хаб HeX
Хаб -> Клиент: ---> $Lock EXTENDEDPROTOCOL[некий_ключ_хаба] Pk=versiunea5.03
Клиент -> Хаб: ---> $Supports UserCommand NoGetINFO NoHello UserIP2 TTHSearch ZPipe0 |$Key [ключ_сгенерированный_по_полученному_ключу_хаба]|$ValidateNick [Мой_ник]|
Хаб -> Клиент: ---> $HubName [Имя_хаба] - [Топик]|$HubTopic [Топик]|<[Бот_хаба]> HeXHub 5.03a Firewall 1.09 Hex Script 1.1.0.2 ...|
Обработка команды $Supports скриптовой функцией OnCommand
Хаб -> Клиент: ---> $Supports UserCommand NoGetINFO NoHello|
Обработка команды $Key скриптовой функцией OnCommand
Обработка команды $ValidateNick скриптовой функцией OnCommand

Хаб -> Клиент: ---> *** Your nickname is already taken by someone else|*** Current nickname: [Мой_ник]_1|*** This nick is also taken...|*** Current nickname: [Мой_ник]_2|<[Бот_хаба]> Your nickname is registered, please enter a password|$GetPass|
Клиент -> Хаб: ---> $MyPass [Мой_пароль]|
Обработка команды $MyPass скриптовой функцией OnCommand
Хаб -> Клиент: ---> $LogedIn [Мой_ник]|$Hello [Мой_ник]|
Клиент -> Хаб: ---> $Version 1,0091|$GetNickList|$MyINFO $ALL [Мой_ник] [Описание]<[Клиент] V:[Версия],M:[Режим],H:[Хабы],S:[Слоты]>$[EMail]$[Соедиение][Магический_байт]$ $[Шара]$|
Хаб -> Клиент: ---> $Hello [Мой_ник]|
Обработка команды $Version скриптовой функцией OnCommand
Обработка команды $GetNickList скриптовой функцией OnCommand
Обработка команды $MyINFO скриптовой функцией OnCommand
Хаб -> Клиент: ---> $MyINFO $ALL [Бот_хаба] [Описание]$ $ $[EMail]$0$|$MyINFO $ALL [Ник1] [Описание]<[Клиент] V:[Версия],M:[Режим],H:[Хабы],S:[Слоты]>$[EMail]$[Соедиение][Магический_байт]$ $[Шара]$|$MyINFO $ALL [Ник2] [Описание]<[Клиент] V:[Версия],M:[Режим],H:[Хабы],S:[Слоты]>$[EMail]$[Соедиение][Магический_байт]$ $[Шара]$|
...
$MyINFO $ALL [Мой_ник]_2 [Описание]<[Клиент] V:[Версия],M:[Режим],H:[Хабы],S:[Слоты]>$[EMail]$[Соедиение][Магический_байт]$ $[Шара]$|$OpList [Оператор1]$$[Оператор2]$$[Оператор3]$$ ... $$[ОператорN]$$|$UserIP [Ник1] [IP1]$$[Ник2] [IP2]$$ ... $$[НикN] [IPN]$$|
Выполнение скриптовой функции OnUserJoined

Примечание: Данный хаб различает вход и переподключение к хабу! Это достигается с помощью задержки в отправлении команды $Quit.


Материал из этой темы перенесён в вики: http://mydc.ru/r/?http://wiki.mydc.ru/Описание_протокола_NMDC

Автор: Setuper 16.12.2008, 19:19

$BadPass

Синтаксис:

Код
$BadPass|


Направление команды:

Хаб ---> Клиент

Описание:

Эту команду отсылает хаб клиенту, который коннектится. Команда посылается, если клиент отослал хабу неправильный(некорректный) пароль в ответ на посланную хабом команду $GetPass. После отсылки этой команды хаб закрывает соединение с этим клиентом, или даже банит его.

Автор: Setuper 16.12.2008, 19:35

$BotList

Синтаксис:

Код
$BotList [Бот1]$$[Бот2]$$[Бот3]$$ ... $$|


Направление команды:

Хаб ---> Клиент

Описание:

Данная команда используется хабом для передачи клиенту списка ботов. Этот список ограничен и разделён символами "$$". Клиенты BDCH, BlackDC и ZionPlusPlus поддерживают эту команду для того чтобы различать операторов и ботов. Однако данная команда не является распространённой и не поддерживается большинством хабов.

На поддержку данной команды указывает наличие характеристики BotList в команде $Supports.

Автор: Setuper 16.12.2008, 19:50

$Close

Синтаксис:

Код
$Close [Ник]|


Направление команды:

Клиент ---> Хаб

Описание:

Эта команда заставляет хаб закрыть соединение с клиентом, чей ник написан в аргументе этой команды. Только операторы могут (имеют право) отправлять эту команду хабу. Эта команда в простонародье называется ДРОП.

[Ник] - ник пользователя, который подлежит разъединению с хабом.

В отличии от команды $Kick, команда $Close разъединяет пользователя без уведомления о разъединении. (По крайней мере на хабах NMDC первой версии эта команда работает именно так).

Автор: Setuper 16.12.2008, 20:21

$ConnectToMe

Синтаксис:

Для клиентов DC++ и NMDC.

Код
$ConnectToMe [Ник_получателя] [IP_отправителя]:[Порт_отправителя]|


Пример:

Код
$ConnectToMe Вася 10.10.10.10:16437|


Для клиентов NMDC v2.205 и DC:PRO v0.2.3.97A:

Код
$ConnectToMe [Ник_отправителя] [Ник_получателя] [IP_отправителя]:[Порт_отправителя]|


Пример:

Код
$ConnectToMe Петя Вася 10.10.10.10:16437|


Направление команды:

Клиент ---> Хаб
Хаб ---> Клиент
Хаб ---> Хаб

Описание:

Эта команда начинает процесс соединения между клиентами. Команда отправляется на хаб клиентом, находящимся в активном режиме соединения с хабом. Хаб пересылает эту команду целевому клиенту без изменения. Получив эту команду, целевой клиент отвечает, соединяясь напрямую с указанным IP через указанный порт.

[Ник_отправителя] - ник клиента в активном режиме, который хочет соединиться с целевым клиентом [Ник_получателя]. Клиент отправителя, после отправки на хаб запроса на соединение, начинает слушать указанный в запросе TCP порт.

Замечание:

Обратите внимание, что в скриптовую функцию старой версии PtokaX данная команда передаётся без символа вертикальной черты '|' на конце.

Автор: Setuper 16.12.2008, 23:32

$ForceMove

Синтаксис:

Код
$ForceMove [Новый_адрес]


Команда сопровождается отсылкой в личку оповещения о перенаправлении:

Код
$To: [Ник_жертвы] From: [Ник_отправителя] $<[Ник_отправителя]> You are being redirected to [Новый_адрес]: [Причина]|


Команда сопровождается отсылкой в чат оповещения о перенаправлении:

Код
<[Ник_бота]> [Причина]|


Направление команды:

Хаб ---> Клиент

Описание:

Хаб отсылает команду $ForceMove клиенту, чтобы предложить ему переместиться на другой хаб (предлагает клиенту перенаправиться).

[Ник_отправителя] - ник, который отправляет команду $OpForceMove.
[Ник_бота] - ник основного бота на хабе.
[Ник_жертвы] - ник, который должен быть перенаправлен на новый адрес.
[Новый_адрес] - это IP адрес или хост-имя (и опционально, через двоеточие, порт) другого хаба, на который происходит перенаправление.
[Причина] - причина перенаправления.

Комментарии:

Жертва может следовать перенаправлению или не следовать ему, это зависит от настроек клиента. По этой причине разъединение после отсылки клиенту этой команды - это общее, но не обязательное требование для хаба.

Примечание:

Обратите внимание, что если команды чата и лички следуют после команды перенаправления, то в случае автоматического следования перенаправлению пользователь не увидит сообщения о перенаправлении в чате и личке, однако, последовательность отсылаемых команд полностью на совести хаба, который может отослать сообщения как после команды перенаправления, так и до.

Автор: Setuper 17.12.2008, 0:29

$GetNickList

Синтаксис:

Код
$GetNickList|


Направление команды:

Клиент ---> Хаб

Описание:

Эта команда заставляет хаб послать клиенту 2 списка зарегистрированных(вошедших) ников.

Код
$NickList [Ник1]$$[Ник2]$$[Ник3]$$ ... $$|
$OpList [ОПератор1]$$[ОПератор2]$$[ОПератор3]$$ ... $$|


Тут надо отметить, что список $OpList является подмножеством списка $NickList. Если на хабе нет операторов и ботов, то хаб должен послать просто "$OpList $$|".

Однако, только старые версии протокола отправляют данные команды. Новые же версии несколько упрощены и отправляют только команду $OpList, а вместо команды $NickList используется команда $MyINFO.

Замечание:
Клиент не обязан запрашивать у хаба список пользователей, поэтому данная команда по своей сути не является обязательной.

Автор: Setuper 17.12.2008, 0:41

$GetPass

Синтаксис:

Код
$GetPass|


Направление команды:

Хаб ---> Клиент

Описание:

Хаб посылает данную команду клиенту для запроса пароля зарегистрированного пользователя.
Команда посылается соединяющемуся с хабом пользователю только если его ник находится в регистрационном листе хаба (ник зарегистрирован на хабе).

Также см. команду $MyPass

Автор: Setuper 17.12.2008, 0:53

$Hello

Синтаксис:

Код
$Hello [Ник]|


Направление команды:

Хаб ---> Клиент

Описание:

Данная команда является частью рукопожатия между клиентом и хабом. Посылается клиенту для того, чтобы указать ему ник, с которым хаб сопоставляет данный клиент. Хаб как бы даёт согласие на вход пользователя под данным ником. В ответ на эту команду, входящий на хаб клиент, должен отослать команду $Version

Данная команда является командой приветствия пользователя и отправляется хабом не только вошедшему на хаб клиенту, но и всем клиентам, находящимся в данный момент на хабе. Однако, если клиент при входе на хаб в команде $Supports указал характеристику NoHello, то такому клиенту, при входе какого-либо пользователя, хаб не будет отправлять команду $Hello.

Автор: Setuper 17.12.2008, 0:59

$HubIsFull

Синтаксис:

Код
$HubIsFull|


Направление команды:

Хаб ---> Клиент

Описание:
Команда, посылаемая клиенту хабом для того, чтобы сообщить, что хаб полный, то есть на хабе достигнут предел пользователей.

Связанная с данной команда: $ValidateNick

Автор: Setuper 17.12.2008, 1:21

$HubName

Синтаксис:

Код
$HubName [Имя_хаба]|


Направление команды:

Хаб ---> Клиент

Описание:

Данная команда является частью рукопожатия между клиентом и хабом. Команда отправляет клиенту имя хаба.

[Имя_хаба] - это имя, которое использует данный хаб. Имя хаба обычно состоит из самого имени и из топика.

Дополнения:
Эта команда может быть отправлена в любое время, например, когда хаб изменил имя. Данная команда используется только для описания хаба.

Клиент1 и Клиент2 на одном и том же хабе этой командой могут получить разные имена, это может получится только на NMDC хабах, поэтому это имя не может быть использовано для однозначного определения хаба.

В Имени хаба в DC++ вместо символов (&, |, $) ожидаются их HTML эквиваленты.

Автор: Setuper 17.12.2008, 1:33

$HubTopic

Синтаксис:

Код
$HubTopic [Топик]|


Направление команды:

Хаб ---> Клиент

Описание:

Команда $HubTopic отсылает клиенту топик хаба, на подобии IRC.

[Топик] - это строка, содержащая топик.

Доступность команды в клиентах:

Данная команда поддерживается почти всеми современными клиентами.

Данная команда поддерживается следующими хабами: Verlihub, RusHub. Хаб PtokaX не поддерживает данную команду, однако команда может отправляться скриптом. На поддержку данной команды может указывать наличие дополнения HubTopic в команде $Supports, однако, это наличие не обязательно.

Автор: Setuper 17.12.2008, 1:49

$Key

Синтаксис:

Код
$Key [Рассчитанный_ключ]|


Направление команды:

Клиент ---> Хаб
Хаб ---> Хаблист
Клиент ---> Клиент
Пингер ---> Хаб

Описание:

Команда $Key отсылается на хаб в ответ на команду $Lock, которая отсылается хабом перед входом на хаб. Когда соединяются клиент с клиентом, или хаб с клиентом, ключ рассчитывается по определённому алгоритму, исходные коды которого доступны и свободно распространяются на разных языках программирования (см. Lock2Key). Команда $Key также используется, когда хаб регистрируется в хаб-листе, однако, в этом случае ключ вычисляется по иному. Такой обмен ключами является своего рода гарантом того, что соединяемые устройства работают на одном протоколе.

Сторона, которой отсылается ключ, может и не проверять правильность этого ключа, однако, отсылающая сторона всегда обязана отсылать рассчитанный ключ.

Автор: Setuper 17.12.2008, 1:58

$Kick

Синтаксис:

Код
$Kick [Ник_жертвы]|


Направление команды:

Клиент ---> Хаб

Описание:

Данная команда отсылается на хаб клиентом и заставляет хаб закрыть соединение с жертвой. Жертве отсылается оповещение, в отличии от команды $Close. Только ОПераторы могут отсылать команду $Kick. В простонароде данную команду называют КИК.

Замечание:
На самом дела на хаб клиентом отправляется строка, состоящая из 3 команд:
Код
$To: [Ник_жертвы] From: [Ник_оператора] $<[Ник_оператора]> You are being kicked because: [Причина_кика]|<[Ник_оператора]> is kicking [Ник_жертвы] because: [Причина_кика]|$Kick [Ник_жертвы]|

Однако, первые 2 команды, которые представляют из себя, соответственно, сообщение в личку жертве, и сообщение всем в чат, автоматически приписывает клиентом. А непосредственно за кик отвечает только последняя команда: $Kick [Ник_жертвы]|

Автор: Setuper 17.12.2008, 2:20

$Lock

Синтаксис:

Код
$Lock [Код] Pk=[ПК]|


Направление команды:

Хаб ---> Клиент
Клиент ---> Клиент
Хаблист ---> Хаб
Хаб ---> Пингер

Описание:

Данная команда используется для того, чтобы убедиться в том, что с сервером соединяется оригинальный клиент DC (NMDC). Сервер (хаб, клиент, хаблист) может и не проверять отправленный клиентом (клиент, хаб, пингер) ключ, однако ключ должен посылаться клиентом в любом случае.

[Код] - это какая-либо последовательность символов (может даже случайная), исключая пробел, $ и |, максимальная и минимальная длина которой неизвестна.
[ПК] - это идентификатор устройства.

Эта команда является частью рукопожатия между клиентом и хабом, между клиентом и клиентом и в регистрации хаб-листа. Из-за того, что используемый алгоритм легко декодируется (см. Lock2Key), практически каждый может создать свой клиент.

Клиент никогда не должен посылать команду $Lock на хаб. Клиенты должны отсылать команду $Lock, когда два клиента соединяются друг с другом.

Пример для DC++:

Код
$Lock EXTENDEDPROTOCOLABCABCABCABCABCABC Pk=DCPLUSPLUS0.242ABCABC|


Секции "ABCABC" являются наполнителями.

Ключевое слово EXTENDEDPROTOCOL в коде команды даёт право клиенту, кроме прочих команд рукопожатия отправить команду $Supports. Те есть это слово говорит о том, что хаб (клиент) поддерживает систему дополнительных расширений или характеристик.
Хаб(клиент) в ответ на команду $Supports также отправляет эту команду другой стороне уже со своим списком поддерживаемых расширений. Если какой-либо из участников не поддерживает дополнительные расширения, отправки команды $Supports не происходит.

Характеристики команды $Lock в протоколе NMDC:
Экранируемые коды(символы):
0 (\0), 5(\5), 36($), 96(`), 124(|), 126(~)

Автор: Setuper 17.12.2008, 2:32

$LogedIn

Синтаксис:

Код
$LogedIn [Ник]|


Направление команды:

Хаб ---> Клиент

Описание:

Данная команда отсылается хабом клиенту в ответ на успешную последовательность пройденных команд $GetPass / $MyPass. Эта команда отправляется исключительно ОПераторам. Команда как бы контролирует вход операторов.

Замечание:
Обратите внимание на название команды: $LogedIn, а не $LoggedIn, как казалось бы должно быть.

Автор: Setuper 17.12.2008, 3:11

$MyINFO

Синтаксис:

Код
$MyINFO $ALL [Ник] [Описание][Тэг]$ $[Соедиенние][Флаг]$[E-Mail]$[Шара]$|


Направление команды:

Клиент ---> Хаб
Хаб ---> Клиент

Описание:
Данная команда отправляется клиентом на хаб, и хабом всем клиентам и, содержит всю основную информацию о клиенте.

Описание параметров команды:

[Ник] - ник пользователя (без пробелов).

[Описание] - описание пользователя. Поле определяемое самим пользователем. Клиенты автоматически к описанию добавляют в конце тэг. Вообще говоря тэг является не обязательным элементом, однако тэг содержит важные параметры, которые помогают хабу общаться с клиентом. Одним из важнейших параметров является режим. При помощи режима хаб определяет как клиент будет взаимодействовать с ним и с другими клиентами.

[Тэг] - автоматически добавляемый клиентом тэг. Общий вид любого тэга: <[Имя_клиента] V:[Версия_клиента],M:[Режим],H:[Хабы],S:[Слоты],[Ограничители]>
Вообще говоря параметры не обязательно должны быть в тэге именно в такой последовательности. Такая последовательность просто является общепринятой, и некоторые клиенты любую другую последовательность параметров могут воспринимать не правильно.

Несколько примеров различных видов тэгов:

DC++:
<++ V:x,M:x,H:x/y/z,S:x,O:x>

BCDC++:
<++ V:x,M:x,H:x/y/z,S:x,O:x,B:x>

CZDC++:
<++ V:x,M:x,H:x/y/z,S:x,O:x,L:x>

DC:Pro:
<DC:PRO V:x,M:x,H:x/y/z,S:x,O:x,F:x/y>

DC++k CDM:
<++ V:x,M:x,H:x/y/z,S:x,O:x>

DCDM++:
<++ V:x,M:x,H:x/y/z,S:x,O:x,B:x>

DCGUI:
<DCGUI V:x,M:x,H:x,S:x,L:x>

iDC++:
<++ V:x,M:x,H:x/y/z,S:x,O:x>

MS++V:
<++ V:x,M:x,H:x/y/z,S:x,O:x,B:x>

NMDC v2:
<DC V:x,M:x,H:x/y/z,S:x,O:x>

oDC:
<oDC V:x,M:x,H:x/y/z,S:x,O:x>

PhantomDC:
<++ V:x,M:x,H:x/y/z,S:x,O:x,B:x>

PeerWebDC++:
<PWDC++ V:x,M:x,H:x/y/z,S:x>

PeerWebDC++:
<PWSDC++ V:x,M:x,H:x/y/z,S:x>

rmDC++:
<RMDC++ V:y,M:x,H:x/y/z,S:x,O:x,B:x,D:x>

StrongDC++:
<StrgDC++ V:y,M:x,H:x/y/z,S:x,O:x,L:x>

zDC++
<++ V:x,M:x,H:x/y/z,S:x,O:x>

Z++
<Z++ V:x,M:x,H:x/y/z,S:x,L:x>

LDC++
<LDC++ V:x,M:x,H:x/y/z,S:x,L:x>

ApexDC++
<ApexDC++ V:x,M:x,H:x/y/z,S:x,L:x>

AvaDC++
<AvaDC V:x,M:x,H:x/y/z,S:x,L:x>

FlylinkDC++
<FlylinkDC++ V:x,M:x,H:x/y/z,S:x,L:x>

Greylink++
<gl++ V:x,M:x,H:x/y/z,S:x,L:x>

Pelink++
<pl++ V:x,M:x,H:x/y/z,S:x,L:x>

RSX++
<RSX++ V:x,M:x,H:x/y/z,S:x,L:x>

zK++
<zK++ V:x,M:x,H:x/y/z,S:x,L:x>

UKCable++
<UKC++ V:x,M:x,H:x/y/z,S:x,L:x>





[Имя_клиента] - имя, которое определяет тот или иной клиент.

[Версия_клиента] - версия, под которой выпущен клиент.

[Режим] - режим клиента. Может принимать значения: A, P или иное (5). A - активное соединение с хабом, P - пассивное соединение с хабом, 5 - соединение через прокси-сервер SOCKS5.

[Хабы] - хабы на которых находится клиент. Параметр может иметь следующий формат: U/R/O, где U - число хабов, на которых данный пользователь является незарегистрированным, R - число хабов, на которых данный пользователь является зарегистрированным, O - число хабов, на которых пользователь яляется ОПератором.

[Слоты] - число свободных или полное число слотов в клиенте.

[Ограничители] - данный параметр является не обязательным. Он может содержать в себе несколько параметров. Всё зависит от того или иного клиента. Обычно данный параметр показывает ограничение скорости. Конкретные значения данного параметра не привожу, для тех, кто хочет узнать его значения, я привёл примеры тэгов различных клиентов (см. чуть выше).

[Соединение] - тип соединения с хабом (указывается либо тип соединения, либо скорость соединения). Устанавливается непосредственно пользователем клиента.
Типы соединений в клиенте NMDC1: 28.8Kbps, 33.6Kbps, 56Kbps, Satellite, ISDN, DSL, Cable, LAN(T1), LAN(T3).
Типы соединений в клиенте NMDC2: Modem, ISDN, Wireless, DSL, Cable, Satellite, LAN(T1), LAN(T3).
Новые типы (Мбит/c): 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50, 100, 1000

[Флаг] - статус пользоателя (ascii символ). Этот символ ещё называют магическим байтом. При отсутствии принимает значение кода 0.
Типы статусов (коды ascii символов для данного статуса):

Статус server используется, когда клиент пробыл на хабе больше 2 часов, расшарил больше 2 ГБ и имеет отдачу свыше 200 МБ.
Статус fireball используется, когда с клиента скачивают со скоростью, превышающей 100 КБ/с.

[E-Mail] - email адрес пользователя. Может отсутствовать (пустая строка).

[Шара] - количество байт, которые расшарил пользователь. Этот параметр в любом случае должен приводится к числу.



Расшифровка буквенных обозначений тэга (на английском):
V: Client Version.
M: Mode.
H: The number of Hubs the client is connected to.
S: Number of Slots open.
O: Open an extra slot if speed is below.
B: Upload Bandwidth limit in kb/s.
L: Upload bandwidth Limit.
D: Download bandwidth limit in kb/s.
F: Fraction download / upload.



Возможные комбинации ограничителей:Ограничители, ограничивающие скорость скачки:



В параметрах данной команды символы $ и | не допустимы!

Эта команда является частью рукопожатия между клиентом и хабом. Посылается клиентом на хаб после получения команды $Hello. Клиент также отсылает эту команду время от времени, а также когда какой-либо из параметров этой команды изменится. Любая, как правило изменённая, отсылка этой команды транслируется хабом всем клиентам с характеристикой NoHello.

Автор: Setuper 17.12.2008, 16:24

$MyPass

Синтаксис:

Код
$MyPass [Пароль]|


Направление команды:

Клиент ---> Хаб

Описание:

Данная команда посылается клиентом на хаб в ответ на команду $GetPass.
[Пароль] - это обычно не шифрованный текст пароля клиента.
Символ | недопустим в пароле.

Также см. команду $GetPass

Автор: Setuper 17.12.2008, 16:35

$NickList

Синтаксис:

Код
$NickList [Ник1]$$[Ник2]$$[Ник3]$$ ... $$|


Направление команды:

Хаб ---> Клиент

Описание:

Данная команда используется хабом для того, чтобы отправить ники пользователей, которые находятся на хабе в данный момент. Этот список ников оканчивается и разделён символами "$$". Команда используется в старых версиях протокола NMDC.

Смотрите также $OpList, $GetNickList

Автор: Setuper 17.12.2008, 17:19

$OpForceMove

Синтаксис:

Код
$OpForceMove $Who: [Ник_жертвы]$Where: [Новый_адрес]$Msg: [Причина]|


Направление команды:

Клиент ---> Хаб

Описание:

ОПератор может отослать команду $OpForceMove для того, чтобы предложить клиенту переместиться на другой хаб.

[Ник_жертвы] - ник, которому предлагается перенаправиться.
[Новый_адрес] - это IP адрес или хост-имя (и опционально через двоеточие порт) другого хаба, на который происходит перенаправление.
[Причина] - причина перенаправления.

После получения этой команды хаб должен отослать жертве команду $ForceMove.
Сервер разъединяет клиента, однако клиент и сам закрывает соединение с хабом.

Комментарии:

После отправки ОПератором на хаб команды $OpForceMove, хаб отсылает жертве команды
Код
$ForceMove [Новый_адрес]|
$To:[Ник_жертвы] From: [Ник_отправителя] $<[Ник_отправителя]> You are being re-directed to [Новый_адрес] because: [Причина]
и прекращает отсылать клиенту-жертве какие-либо команды.
Если команда $OpForceMove послана на хаб пользователем, не являющемся ОПератором, хаб должен разъединить такого пользователя.

Автор: Setuper 17.12.2008, 17:36

$OpList

Синтаксис:

Код
$OpList [ОПератор1]$$[ОПератор2]$$[ОПератор3]$$ ... $$|


Направление команды:

Хаб ---> Клиент

Описание:

Данная команда используется хабом для отсылки клиентам списка ОПераторов (ники с ключиками). Этот список ограничен и разделён символами "$$".

В старых версиях протокола NMDC команда $OpList является подмножеством команды $NickList.

По протоколу NMDC v1 хаб также включает в команду $OpList всех зарегистрированных на хабе ботов. Современные хабы должны быть наделены способностью как показывать ботов среди ОПераторов, так и не показывать.

Если клиент найдёт в параметрах данной команды свой ник, то он должен включить у себя функции перенаправления и кика пользователей (добавить соответствующие контекстные менюшки).

Автор: Setuper 17.12.2008, 17:47

$Quit

Синтаксис:

Код
$Quit [Ник]|


Направление команды:

Хаб ---> Клиент
возможен случай: Клиент ---> Хаб

Описание:

Данная команда может отсылаться только хабом для того, чтобы клиент удалил разъединившегося пользователя из своего списка пользователей. Если вы решили написать свой клиент, не посылайте на хаб команду $Quit.
Данная команда показывает, что [Ник] отключился от хаба.

Пример:

Код
$Quit Вася|


Известны случаи, когда данная команда использовалась на хабе. Данная команда отсылалась клиентом на хаб и ник являлся ником клиента - хаб закрывал соединение с клиентом. Реализован этот принцип в Verli хабе.

Автор: Setuper 17.12.2008, 18:10

$RevConnectToMe

Синтаксис:

Код
$RevConnectToMe [Ник1] [Ник2]|


Направление команды:

Клиент ---> Хаб
Хаб ---> Клиент

Описание:

Клиент посылает данную команду на хаб для того, чтобы попросить пользователя [Ник2] инициализировать соединение с помощью команды $ConnectToMe. Команда $RevConnectToMe отсылается когда клиент не может сам соединиться (находится в пассивном режиме соединения с хабом).

[Ник1] - ник клиента, который просить соединиться с ним (пассивный).
[Ник2] - ник клиента, с которым нужно соединиться (активный).

Примечание:

Данная команда не применима к пассивному пользователю (к клиенту в пассивном режиме). Соединение пассив-пассив невозможно!

Автор: Setuper 17.12.2008, 19:24

$Search

Синтаксис:

Пользователь в активе:

Код
$Search [IP]:[Порт] [Строка_поиска]


Пользователь в пассиве:

Код
$Search Hub:[Ник] [Строка_поиска]


Направление команды:

Клиент ---> Хаб
Хаб ---> Клиент
Хаб ---> Хаб

Описание:

Данная команда используется для начала поиска файлов на хабе. Формат [Строки_поиска] не зависит от режима подключения клиента (актив, писсив).


[IP] - IP адрес активного пользователя.
[Порт] - UDP порт, который клиент слушает для приёма ответов на запрос от других клиентов.
[Ник] - ник пассивного пользователя.
[Строка_поиска] - строка поиска, которая описывает файл, который ищет клиент. Части этой строки разделяются знаками вопроса ('?'):

[Размер_ограничения]?[Максимальный_размер]?[Размер]?[Тип_данных]?[Поисковый_параметр]

[Размер_ограничения] - принимает значение 'T', если поиск должен быть ограничен максимальным или минимальным размером, иначе 'F'.
[Максимальный_размер] - принимает значение 'F', если [Размер_ограничения] равен 'F' или если размер ограничения устанавливает более низкий предел размера файла, инача 'T'.
[Размер] - минимальный или максимальный размер файла в байтах (в случае если указан [Максимальный_размер]) и если [Размер_ограничения] принимает значение 'T', иначе 0.
[Тип_данных] - ограничение поиска по типу файлов. Данное ограничение принимает одно из следующих целых чисел:

[Поисковый_параметр] - поисковый параметр определяет совпадения в имени файлов
Если тип поиска установлен в 9, то поисковый параметр должен представлять из себя TTH искомого файла.

Как и во всех сообщениях NMDC, в поисковом параметре следует избегать употребления следующих символов: "$", "|" и "&".
Все пробелы в поисковом параметре заменяются на знак '$'.

После отправки на хаб этого сообщения, хаб должен без изменений переслать это сообщение всем пользователям хаба. Каждый пользователь с одним или более совпадениями должен послать UDP пакет на [IP]:[Порт] в случае активного запроса или на хаб в случае пассивного запроса.

Смотрите описание команды $SR для детального разбора.

Примеры:

Код
$Search 10.10.10.10:412 T?T?500000?1?Gentoo$2005
$Search Hub:Вася T?T?500000?1?Gentoo$2005

$Search 10.10.10.10:3746 F?T?0?9?TTH:TO32WPD6AQE7VA7654HEAM5GKFQGIL7F2BEKFNA
$Search Hub:Пётр F?T?0?9?TTH:TO32WPD6AQE7VA7654HEAM5GKFQGIL7F2BEKFNA

Автор: Setuper 19.12.2008, 10:20

$SR

Синтаксис:

Код
$SR [Ник_ответчика] [Результат][0x05][Свободные_слоты]/[Всего_слотов][0x05][Имя_хаба] ([IP_хаба:Порт]){[0x05][Целевой_ник]}|


Направление команды:

Клиент ---> Хаб
Хаб ---> Клиент
Клиент ---> Клиент
Хаб ---> Хаб

Описание:

Данная команда используется для возврата файла или директории, которая соответствует запросу в команде $Search. Все условия, которые находятся в оригинальном запросе, должны находиться в [Результат], и все типы и ограничения, используемые в команде $Search, должны быть выполнены.

[Результат] представляет из себя либо [Имя_файла][0x05][Размер_файла] для поиска по файлам, либо [Директория] для поиска по директориям
[0x05] - это 5-ый ASCII символ (используется в качестве разделителя).

Данная команда посылается клиентом, если у данного клиента нашлось что-то из запроса команды $Search от другого клиента.
Если команда $Search была послана от пассивного пользователя, то команда $SR должна быть возвращена хабу (через TCP). В этом случае, в конец данной команды должно быть дописано [0x05][Целевой_ник]. Перед пересылкой этой команды пользователю, который инициализировал поиск, хаб удаляет данную приписку с разделителем и целевым ником. Если команда $Search была послана от активного пользователя, то команда $SR возвращается на указанный в команде $Search IP адрес и UDP порт.
Параметр [IP_хаба:Порт] нужен только в том случае, если порт хаба не является портом по умолчанию (411).
В UNIX системах в путях к файлу должен встречаться только прямой слеш (/).
DC++ клиент будет отсылать максимум 5 результатов поиска для пассивных пользователей и 10 для активных. Кроме этого, для того, чтобы снизить нагрузку, хаб может сократить количество возвращаемых поисковых запросов.
Для файлов, содержащих TTH, параметр [Имя_хаба] заменяется на TTH:[base32_encoded_tth_hash] (см. TTH)

Примеры:

Ответ на пассивный поиск:

Код
$SR Вася Файл.txt[0x05]437 3/4[0x05]МойХаб (10.10.10.10:411)[0x05]Петя|


Ответ на активный поиск:

Код
$SR Вася Файл.txt[0x05]437 3/4[0x05]МойХаб (10.10.10.10:411)|

Автор: Setuper 19.12.2008, 10:39

$Supports

Синтаксис:

Код
$Supports [Характеристика1] [Характеристика2] [Характеристика3] ... [ХарактеристикаN] |


Характеристики поддерживаются: DC++ 0.17+ (Клиент - Клиент), DC++ 0.300 (Хаб - Клиент)

Направление команды:

Хаб ---> Клиент
Клиент ---> Хаб
Клиент ---> Клиент
Хаблист ---> Хаб
Хаб ---> Хаблист
Пингер ---> Хаб
Хаб ---> Пингер

Описание:

Данная команда используется для определения характеристик. Чтобы указать на то, что сервер имеет хотя бы одну характеристику, он должен отослать в начале команды $Lock следующую фразу EXTENDEDPROTOCOL. Если вторая сторона также поддерживает некоторые характеристики, то она также отсылает $Supports. Эта команда обязательно предшествует команде $Key.

Замечания:

• EXTENDEDPROTOCOL не должна отсылаться, если сервер не поддерживает никакие характеристики
• Пустая команда $Supports не допустима
• Пробелы в именах характеристик также не допустимы
• Для характеристик клиента, имя дополнения должно быть таким же как и имя команды этого дополнения.
• Хабы обычно хотят получить команду $Supports до команд $Key и $ValidateNick. Итак, последовательность должна быть такова:
Код
$Supports ..|$Key ..|$ValidateNick ..|


Характеристики для связи Клиент - Хаб:

BotList
ClientID
Feed
HubTopic
IN
MCTo
NoGetINFO
NoHello
OpPlus
QuickList
TTHSearch
UserCommand
UserIP2
ZLine
ZPipe0


Характеристики для связи Клиент - Клиент:

ADCGet
BZList
CHUNK
ClientID
GetCID
GetTestZBlock
GetZBlock
MiniSlots
TTHL
TTHF
XmlBZList
ZLIG

Автор: Setuper 20.12.2008, 1:50

$UserCommand

Направление команды:

Хаб ---> Клиент

Синтаксис:

Код
$UserCommand [Тип] [Контекст] [Детали]||




[Тип] - положительное, целое число, описывающее тип команды:
0 - разделитель
1 - raw команда
2 - raw команда с ограничением на единственный ник %[nick]
255 - очистка команд
[Контекст] - целое число, регулирующее где показывать контекстные менюшки:
[1] - Контекстное меню хаба (доступно по клику на вкладке хаба). Примеры: просмотр правил, смена пароля. Эта команда может содержать параметр %[nick]. Вместо этого следует использовать переменную %[mynick] или %[line:blah].
[2] - Контекстное меню юзера (доступно по клику на любого юзера). Примеры: показ статистики юзера, проверка бана юзера. Эта команда может содержать переменные: %[nick], %[mynick] и %[line:blah].
[4] - Контекстное меню поиска. Пример: сообщить о битом файле. Эта команда может содержать специфические аргументы ника и файла.
[8] - Конкестное меню файл-листа. Пример: сообщение о найденном итом файле у юзера в списке файлов. Эта команда может содержать специфические аргументы ника и файла.
Замечание: этот контекст является новым в DC++ 0.669

[Детали] - этот параметр зависит от параметра [Тип]
[Тип] = 0 (разделитель) и [Тип] = 255 (очистка) не должны содержать параметра [Детали]
[Тип] = 1 (raw) использует в качестве деталей [Заголовок]$[Команда]
[Заголовок] - это название менюшки. Менюшка может быть составной, то есть содержать подменюшки. Для построения подменюшки используется обратный слеш (\). Например, [Подменю]\[Заголовок]. Степень вложенности подменюшек может быть любой.

Более высокие числа зарезервированы для дальнейшего использования.


Эскейп последовательности:
Если в меню используются знаки $, | и &, то их необходимо заменить на кодовые аналоги (аналоги html). Соответственно $ | и &

Как и все команды NMDC, данная команда разделяется от других знаком |.


Контекст:

Контекстное число - это бинарный флаг, который может быть составлен из других чисел, например, меню юзера и меню поиска вместе дадут (2 | 4 = 6). То есть для того, чтобы менюшка появилась в меню юзера и в меню поиска следует указывать контекст равный шести.


Детали:

Разделитель (вертикальная черта):

Код
$UserCommand 0 [Контекст] |


После [Контекста] и перед символом | может находиться некий текст, который в любом случае будет игнорироваться

Raw команды:

Код
$UserCommand 1 [Контекст] [Заголовок]$[raw]||


Команда добавляет raw пункт меню с заголовком [Заголовок] и raw командой [raw]. Эта команда должна оканчиваться на |, и если этого символа нет, то она отвергается.

Raw команда с ограничением на единственный ник:

Код
$UserCommand 2 [Контекст] [Заголовок]$[raw]||


Тоже самое, что и в предыдущем случае, но эта команда работает одна на один ник. Это должно помешать использованию массовой рассылки.

Очистка меню:

Код
$UserCommand 255 [Контекст] |


Команда стирает все менюшки из указанного контекста и ниже. То есть, например, 7 - сотрёт все менюшки с контекстами 1,2 и 4.

Примеры:

Код
$UserCommand 2 6 Кик$$To: %[nick] From: %[mynick] $<%[mynick]> You are being kicked====|$Kick %[nick]||


Эта команда отсылает в приват сообщение "You are being kicked====" для ника, и отправляет команду $Kick. Менюшки будут в поиске и меню юзера. Raw команда с ограничением на единственный ник не позволит сделать множественный кик.

Код
$UserCommand 255 1 |


Команда удалить все менюшки из контекстного меню хаба (вкладка хаба).

На поддержку данной команды может указывать наличие характеристики UserCommand в команде $Supports. Однако, из-за большой распространённости данной команды наличие этой характеристики в команде $Supports не обязательно.

Автор: Setuper 20.12.2008, 2:10

$UserIP

Направление команды:

Хаб ---> Клиент
Клиент ---> Хаб

Синтаксис:

Запрос со стороны клиента:

Код
$UserIP [Ник1]$$[Ник2]$$[Ник3]$$ ... $$[НикN]$$|


Ответ со стороны сервера:

Код
$UserIP [Ник1] [IP1]$$[Ник2] [IP2]$$[Ник3] [IP3]$$ ... $$[НикN] [IPN]$$|


Описание:

Эта команда посылается клиентом на хаб, для того, чтобы получить ip адрес одного или более пользователей. Все пользователи разделены в команде знаками $$ (также как и в командах $NickList и $OpList). IP адрес, посылаемый хабом, должен быть реальным для хаба удалённым IP адресом, и этот IP адрес может отличаться от IP адреса, посылаемого в команде $ConnectToMe (потому что клиент может быть подключен к хабу напрямую, а между вторым клиентом и данным клиентом может находится маршрутизатор, который и сменит ip адрес в случае использования команды $ConnectToMe). DC++ не просит свой собственный IP адрес. Хабы, поддерживающие расширение протокола UserIP2 (UserIP v2), должны автоматически отсылать собственный IP клиента при входе на хаб.

Автор: Setuper 20.12.2008, 2:23

$Version

Направление команды:

Клиент ---> Хаб

Синтаксис:

Код
$Version [Версия]|


Описание:

Команда, содержащая версию NMDC протокола клиента.
Эта команда должна быть послана клиентом на хаб после того, как хаб пошлёт клиенту команду $Hello.

Последняя 1.x версия NMDC была 1.0091. Используется альтернативный десятичный разделитель (,). Поэтому, DC++ использует номер версии в качестве числа 1,0091 не зависимый от местоположения компьютера.

Автор: Setuper 20.12.2008, 2:31

$ValidateNick

Синтаксис:

Код
$ValidateNick [Ник]|


Направление команды:

Клиент ---> Хаб

Описание:

Эта команда является частью рукопожатия между клиентом и хабом. Она посылается клиентом на хаб после команды $Key. Она определяет ник [Ник], который вы хотите использовать на хабе.

Внимание!
По протоколу ник не должен содержать символы: $ | и пробел.
Клиент, до входа на хаб, может преобразовывать все пробелы на нижние подчёркивания, и, таким образом, продолжать использование данного модифицированного ника.

Смотрите также:

$HubIsFull, когда хаб полон
$ValidateDenide, когда ник уже используется
$GetPass, когда для ника запрашивается пароль
$Hello, когда ник принят

Автор: Setuper 20.12.2008, 2:43

$ValidateDenide

Синтаксис:

Код
$ValidateDenide [Ник]|


Направление команды:

Хаб ---> Клиент

Описание:

Эта команда является частью рукопожатия между клиентом и хабом. Хаб отправит эту команду клиенту в ответ на команду $ValidateNick, если такой ник уже используется на хабе, или ник совпадает с зарезервированным ником (таким как "Hub-Security").

[Ник] - это отвергнутый ник.
После того как эта команда придёт к клиенту клиент сгенерирует сообщение "Your nick was already taken (Ваш ник уже используется)" (содержание этого сообщения, вообще говоря, настраивается в клиенте).

Замечание:
Обратите внимание на название команды: $ValidateDenide, а не $ValidateDenied, как казалось бы должно быть!

Автор: Setuper 20.12.2008, 13:22

$Cancel

Синтаксис:

Код
$Cancel


Направление команды:

Клиент ---> Клиент

Описание:

Скачивающий клиент может отменить скачку с некоторых клиентов (версии NMDC Windows по крайней мере). Это делается с помощью отсылки команды $Cancel (без символа | на конце!).

В свою очередь отдающий клиент при получении этой команды должен закрыть поток и отослать в ответ команду $Canceled (также без символа | на конце). Следующий пример показывает как это работает. D - скачивающий клиент, U - отдающий клиент.

Цитата
D>U: $Send|
U>D: файловый поток (D сохраняет куски файла на диск)
D>U: $Cancel (D прекращает сохранять на диск и ожидает команду $Canceled)
U>D: отдача может продолжаться, однако она уже будет игнорироваться клиентом D
U>D: $Canceled


Данная команда поддерживается только в версиях NMDC 1.x. Mac и Windows NMDC 2.x версии не могут отменить передачу как это делает NMDC 1.x. DC++ никогда не поддерживал команду $Cancel или $Canceled.

Смотрите также описание команды $Canceled

Автор: Setuper 20.12.2008, 13:35

$Canceled

Синтаксис:

Код
$Canceled


Направление команды:

Клиент ---> Клиент

Описание:

Данная команда отсылается клиентом в ответ на команду $Cancel другого клиента. Смотрите описание команды $Cancel для более детального вникания. Следует отметить орфографию написания команды $Canceled, в отличии от хорошо известного слова "Cancelled."

Автор: Setuper 20.12.2008, 14:11

$Direction

Синтаксис:

Код
$Direction [Направление] [Номер]|


Направление команды:

Клиент ---> Клиент

Описание:

Эта команда отсылается в ответ на команду $Key. Команда решает какая сторона будет скачивать.

[Направление] - данный параметр может принимать значения "Upload" или "Download". Параметр принимает значение "Upload" только в случае если ваш клиент ничего не хочет скачать с соединяемого пользователя.
[Номер] - это случайное число. Когда оба клиента хотят скачивать друг у друга, первым начинает скачивать тот, у кого это число выше. Если эти числа равны, то соединение закрывается.

Специфичность:

Максимальное значение параметра [Номер] - 0x7FFF. NMDC должен разорвать соединение, если отсылаемое число вдруг оказалось больше максимального.

DC++ может не посылать эту команду после команды $Lock, если в команде $Lock встретилось значение EXTENDED. Смотрите описание команды $Supports.

У DC++ клиентов есть следующий баг:
У клиента A ноль свободных слотов, у клиента B есть свободные слоты. Клиент B хочет скачать у A файлы, клиент A также хочет скачать у B некоторые файлы.
Если клиент A хочет получить что-то от клиента B и он посылает случайное число, клиент B не может получить слот, потому что их нет у клиента A и тогда в статусной строке появляется надпись "Соединение...". Решение этой проблемы предложено на страницах обсуждения клиента. Выход из этой ситуации осуществляется отправкой всё большего и большего случайного числа, пока не освободится свободный слот и не установится соединение.

Автор: Setuper 20.12.2008, 14:23

$Error

Синтаксис:

Код
$Error [Сообщение]|


Направление команды:

Клиент ---> Клиент

Описание:

Эта команда отсылается когда возникает ошибка.

[Сообщение] - это строка, описывающая ошибку. Наиболее распространённая ошибка "File Not Available" (Файл не доступен), возвращается когда у запрошенного клиента не оказалось нужного файла (хотя он раньше у него был). Если вы пишете своего клиента, то учтите, что реализация этой строки может привести к несовместимости.

Автор: Setuper 20.12.2008, 14:30

$Failed

Синтаксис:

Код
$Failed [Сообщение]|


Направление команды:

Клиент ---> Клиент

Описание:

Эта команда является командой DC++ дополнительных характеристик. Отсылается в ответ на команду $GetZBlock, $UGetBlock, или $UGetZBlock. Одним из значений параметра [Сообщение] может быть значение "File Not Available" (Файл не найден).

Автор: Setuper 20.12.2008, 14:35

$FileLength

Синтаксис:

Код
$FileLength [Размер_файла]|


Направление команды:

Клиент ---> Клиент

Описание:

Данная команда отсылается отдающим клиентом скачивающему клиенту в ответ на команду $Get. Единственным параметром является размер скачиваемого файла в байтах.

Автор: Setuper 20.12.2008, 14:49

$Get

Синтаксис:

Код
$Get [Файл]$[Число]|


Направление команды:

Клиент ---> Клиент

Описание:

Данная команда используется для инициализации загрузки нужного файла. Клиент как бы просит у другого клиента файл.

[Файл] - это полное имя файла и путь к нему в соответствие с указанным в команде $SR или в файл-листе.
[Число] - начальная точка загрузки (начинается с 1, а не с 0)

Команда $Error с параметром "File Not Found" посылается когда файл не доступен. NMDC разъединяет пользователя если в запросе не указана директория. (то есть клиент отсылает команду $Error в ответ на команду "$Get не_существующая_директория\не_существующий_файл$1|" и разъединяет в ответ на команду "$Get не_существующий_файл$1|")

Когда файл доступен, источник файла отсылает команду $FileLength.

Для извлечения файл-листа служит команда:
Код
$Get MyList.DcLst$1|

Автор: Setuper 20.12.2008, 15:01

$GetListLen

Синтаксис:

Код
$GetListLen|


Направление команды:

Клиент ---> Клиент

Описание:

Старая команда.

Данная команда используется для того, чтобы получит размер файл-листа стиля DcLst удалённого пользователя. Удалённый пользователь в ответ отправит команду $ListLen.

Однако эта команда давно исключена из протокола. Начиная с версии 0.69, DC++ больше не генерирует списки стиля DcLst.

Автор: Setuper 20.12.2008, 15:06

$MaxedOut

Синтаксис:

Код
$MaxedOut|


Направление команды:

Клиент ---> Клиент

Описание:

Данная команда отсылается клиентом, когда у него нету свободных слотов.

Автор: Setuper 20.12.2008, 15:20

$MCTo

Синтаксис:

Код
$MCTo: [Ник_принимающего] $[Ник_отсылающего] [Сообщение]|


Направление команды:

Клиент ---> Хаб

Описание:

Данная команда отсылает сообщение пользователю, которое видно в чате только ему.

Автор: Setuper 20.12.2008, 15:27

$MyNick

Синтаксис:

Код
$MyNick [Ник]|


Направление команды:

Клиент ---> Клиент

Описание:

Первая команда, которую нужно послать клиенту при соединении с другим клиентом.
Команда $Lock должна быть послана вслед за данной командой.

Специфичность:

DC++ проверяет, чтобы указанный в этой команде ник был найден хотя бы на одном из хабов, в противном случае соединение закрывается немедленно.

Автор: Setuper 20.12.2008, 15:33

$Send

Синтаксис:

Код
$Send|


Направление команды:

Клиент ---> Клиент

Описание:

Данная команда посылается скачивающим клиентом в ответ на команду $FileLength отдающего клиента.
Команда просит отдающего клиента начать отдачу файла.

Автор: Setuper 20.12.2008, 15:40

$To

Синтаксис:

Код
$To: [Ник_получателя] From: [Ник_отправителя] $<[Ник]> [Сообщение]|


Направление команды:

Клиент ---> Хаб
Хаб ---> Клиент

Описание:

Эта команда используется для отправки личного сообщения.

[Ник] - этот параметр не обязан совпадать с ником отправителя (это может быть, например, бот), НО он не обязан совпадать только в случае поступления этой команды от хаба клиенту, а не от клиента хабу! При поступлении команды от клиента хабу, последний может (обязан) проверять совпадение ника с ником отправителя.
[Ник_получателя] - ник получателя приватного сообщения.

При поступлении данной команды от клиента, хаб просто транслирует эту команду в соответствующее соединение.

Автор: Setuper 28.12.2008, 18:23

$FeaturedNetworks

Синтаксис:

APN мульти-хаб-чат сообщение обычно выглядит следующим образом:

Код
<(YYY)XXX> MMM|


Где YYY - это префикс, XXX - это ник пользователя и MMM - это сообщение.

Код
$FeaturedNetworks YYY$$YYY$YYY$$|


YYY - идентификатор хаба в сети. На настоящее время APN MultiHubChat система может иметь до 5 таких идентификаторов, а в некоторых случаях и больше.

Направление команды:

Хаб ---> Хаб

Описание:

Команда $FeaturedNetworks - это команда дополнения к протоколу Access Point Name (APN) MultiHubChatsystem, для того, чтобы определить другие хабы и другие точки входа (IRC, Telnet) и тд. Первоначально команда была создана для того чтобы помочь разработчикам APN и для того чтобы добиться лучшей интеграции между мульти-хабами.

На мульти-хабах сообщения в чат поступают с уникальными префиксами (идентификаторами), обычно длинной в 3 символа (в нике). Хаб, который получает сообщение от какого-то "своего" пользователя должен разослать его по всем остальным хабам.


Реализация:

Если хаб отсылает данную команду, то на хабе должен быть определён какой-то префикс, который будет применяться к пользователям хаба.

Префикс хаба определяет админ хаба. Однако существуют следующие префиксы:

APx - Хаб x (DC, где x - это ¹, ² или ³).
APt - Telnet доступ (Telnet Чат Плагин)
IRC - IRC доступ (IRC Плагин)
APs - Shoutcast (Shoutcast Announcer Плагин)

Команда $FeaturedNetworks может использоваться практически любым хабом или MHC ботом.

Автор: Setuper 28.12.2008, 18:52

$MultiConnectToMe

ЧАСТИЧНО ПОДДЕРЖИВАЕТСЯ КЛИЕНТОМ DC++

Синтаксис:

Код
$MultiConnectToMe [Удалённый_ник] [IP_отправителя]:[Порт_отправителя]


Направление команды:

Клиент ---> Хаб

Описание:

Эта команда была придумана как команда со стороны клиента, для того чтобы иметь преимущество перед слинкованным хабом. Клиент отсылает команду $MultiConnectToMe на хаб, хаб, в свою очередь, пересылает команду $ConnectToMe по UDP на все связанные с ним хабы, на подобие того, как команда $Search отсылается хабом всем пользователям хаба.

Данная команда используется совместно с командой $MultiSearch. Поддержка этой команды была ограничена в версиях oDC. Было проблематично поддерживать эту команду, потому как NMDC хаб не мог контролировать все свои линкованые части и не мог транслировать соединение с удалёнными пользователями. Таким образом, oDC клиент должен был отсылать команду $MultiConnectToMe даже тогда, когда пользователь находился в оффлайне.

Пример:

Код
$MultiConnectToMe RemoteNick 10.10.10.10:13671

Автор: Setuper 28.12.2008, 19:00

$MultiSearch

ЧАСТИЧНО ПОДДЕРЖИВАЕТСЯ КЛИЕНТОМ DC++

Синтаксис:

Активный пользователь:

Код
$MultiSearch [IP]:[Порт] [Строка_поиска]


Направление команды:

Клиент ---> Хаб

Описание:

Данная команда является командой со стороны клиента для того чтобы иметь преимущество перед линкованым NMDC хабом. Клиент отсылает команду $MultiSearch на хаб, хаб, в свою очередь, пересылает команду $Search по UDP на все связанные с ним хабы, на подобие того, как команда $Search отсылается хабом всем пользователям хаба.

Данная команда используется совместно с командой $MultiConnectToMe. Поддержка этой команды была ограничена в версиях oDC. Её поддержка вызвана некоторыми проблемами. Для детального разбора проблем смотрите описание команды $MultiConnectToMe.

Описание синтаксиса параметров смотрите в команде $Search.

Автор: Setuper 29.12.2008, 12:48

$BotINFO / $HubINFO

Синтаксис:

Запрос клиента на пинг:

Код
$BotINFO [Описание_бота]|


Ответ сервера

Код
$HubINFO [Имя_хаба]$[Адрес_хаба:Порт]$[Описание_хаба]$[Макс_юзеров]$[Мин_шара]$[Мин_слотов]$[Макс_хабов]$[Тип]$[Владелец]|


Направление команд:

Клиент ---> Хаб ($BotINFO)
Хаб ---> Клиент ($HubINFO)

Описание:

Данная команда нужна для получения более полной информации о хабе.

[Описание_бота] - может быть любой строкой, обычно это информация об адресе или хаб-листе.
[Имя_хаба], [Адрес_хаба] и [Описание_хаба] - это пункты, которые будут показаны в хаб-листе (некоторые хабы имеют несколько адресов это помогает определит главный адрес). Описание хабов меняется часто, поэтому требует частого обновления.
[Макс_юзеров], [Мин_шара], [Мин_слотов], [Макс_хабов] - соответственно максимально допустимое число пользователей, минимально допустимая шара на хабе, минимальное число слотов, максимальное число подключенных хабов.
[Тип] - этот параметр даёт информацию о программе, под управлением которой работает хаб.
[Владелец] - владелец хаба или email адрес владельца хаба

Если адрес хаба 127.0.0.1, то Hublist.org удалит информацию об этом хабе из своей базы данных.

Поддержка:

Данные команды поддерживаются следующими программами:

• PtokaX
• Verlihub
• Yhub
• SDCH
• PHPDC-Hub
• DB Hub >= 0.314
• GeneralBot >= 0.24 (NMDCH Script)
• HubRules >= 1.11 (DCH++ Plugin)
• HubList >= 0.1.0 (ODC(#)H Plugin)

На поддержку данных команд указывают характеристики BotInfo/HubInfo в команде $Supports
Различные хабы по разному обрабатывают данные команды, - некоторые отключают пингера после отсылки ему команды, а некоторые продолжают держать пингера на хабе, предполагая, что пингер сам разорвёт соединение с хабом.

Автор: Setuper 29.12.2008, 13:06

$Ping

НЕ ПОДДЕРЖИВЕТСЯ КЛИЕНТОМ DC++

Синтаксис:

Код
$Ping [IP]:[Порт]|


Направление команды:

Клиент ---> Клиент

Описание:

[IP]:[Порт] - это IP и UDP порт, который отправитель пытается прослушать.
Пинг измеряет время ожидания сигнала.
Если вы своим клиентом пытаетесь пинговать, то вы должны быть уверены в том, что данная команда соответствует протоколу NMDC v1.0 beta 9 и поддерживается другим клиентом.

Автор: Setuper 29.12.2008, 13:30

$ADCGET / $ADCSND

Направление команды:

Клиент ---> Клиент

Описание:

Данная команда является дополнительной клиент-клиент командой протокола NMDC, указываемая по средствам характеристики ADCGet в команде $Supports. Эта характеристика указывает на поддержку команды GET нового протокола ADC, и используется для скачивания файлов между клиентами. Команды должны выполняться после того как клиенты уже связались друг с другом и готовы получать или отдавать файлы.

ZLIG, TTHL, и TTHF - это все доступные дополнения команды $ADCGET

запрос:

Код
$ADCGET file TTH/PPUROLR2WSYTGPLCM3KV4V6LJC36SCTFQJFDJKA 0 1154 ZL1|


ответ:

Код
$ADCSND file TTH/PPUROLR2WSYTGPLCM3KV4V6LJC36SCTFQJFDJKA 0 1154 ZL1|[Содержимое_файла]


Файл-лист: запрос

Код
$ADCGET file files.xml.bz2 0 -1 ZL1|


ответ:

Код
$ADCSND file files.xml.bz2 0 8775 ZL1|[Содержимое_файла]


а также запрос по контрольной сумме TTH:

Код
$ADCGET tthl TTH/PPUROLR2WSYTGPLCM3KV4V6LJC36SCTFQJFDJKA 0 -1|


ответ:

Код
$ADCSND tthl TTH/PPUROLR2WSYTGPLCM3KV4V6LJC36SCTFQJFDJKA 0 24|[Interleaves]

Автор: Setuper 29.12.2008, 13:43

$Capabilities

Синтаксис:

Код
$Capabilities [Характеристика1]$[Характеристика2]$ ... $[ХарактеристикаN]|


Характеристики:

Поддерживается: Valknut (Hub to Client)

Направление команды:

Клиент ---> Хаб
Хаб ---> Клиент

Описание:

Команда $Capabilities является расширением протокола (используется в клиенте DCGUI). Цель данной команды такая же как и у более популярной команды $Supports.

Известные Характеристики:

UniSearch
XSearch
MD4x

Автор: Setuper 29.12.2008, 14:22

$GetINFO

Синтаксис:

Код
$GetINFO [Ник_жертвы] [Ник]|


Направление команды:

Клиент ---> Хаб

Описание:

Запрос команды $MyINFO с хаба.

[Ник] - ник отправителя.
[Ник_жертвы] - ник пользователя, о котором нужно узнать информацию. Сервер должен отправить строку MyINFO указанного клиента.

Автор: Setuper 9.1.2009, 20:09

$GetZBlock

Синтаксис:

Код
$GetZBlock [Число] [Число_байт] [Имя_файла]|


Направление команды:

Клиент ---> Клиент

Описание:

Данная команда является дополнением к протоколу. На поддержку данной команды указывает характеристика GetZBlock в команде $Supports.

Вместо команд $Get и $Send используется вышеприведенная команда.
Параметр [Число] начинается с 0 (именно с 0, в отличии от команды $Get, в которой данный параметр начинается с 1) и обозначает начальную точку загрузки файла.
[Число_байт] - это число отправляемых байт (или -1 для неизвестного или целого файла).
[Имя_файла] - очевидно, что это имя файла.

После этого второй клиент отвечает командой "$Sending [Байты]|[Сжатие]", если отправка прошла успешно или командой "$Failed [Описание_ошибки]|" в противном случае.

Если всё в порядке, то данные будут отправляться до тех пор пока не отошлёться вся не сжатая длина файла.
[Байты] - указывает сколько будет извлечено отосланных байт без сжатия, потому как отсылающий клиент не знает на сколько хорошо был сжат файл. Одна отсылка туда и обратно оптимизирует механизм передачи файла.

Сжатие: Для сжатия используется библиотека ZLib (v 1.1.4 в DC++ начиная с версии 0.21), использующая динамическое сжатие. Уровень сжатия может изменяться для того чтобы снизить нагрузку на процессор или в случае если файл не сжимается. Уровень сжатия регулируется с помощью хеш-функции adler32.

Команда $GetZBlock устарела, но согласно DC++ 0.696 её поддержка ещё существует. Новая реализация этой команды используется в команде $ADCGET с параметром ZL1.

Автор: Setuper 9.1.2009, 21:55

$Sending

Синтаксис:

Код
$Sending [Конечный_байт - Начальный_байт]|


Если запрошенные байты равны -1, то:

Код
$Sending|


Направление команды:

Клиент ---> Клиент

Описание:

Данная команда является расширением протокола. Отсылается в ответ на команду $GetZBlock, $UGetBlock, или $UGetZBlock.
Оба параметра [Начальный_байт] и [Конечный_байт] имеют номера, начиная с 0; первый принятый байт будет байт с номером 0.
Сначала, во время тестирования этой команды (GetTestZBlock), не было никаких параметров.

Автор: Setuper 1.2.2009, 16:11

$UGetBlock

Синтаксис:

Код
$UGetBlock [старт] [число_байт] [имя_файла]|


Пример

Код
$UGetBlock 0 -1 files.xml.bz2|


Направление команды:

Клиент ---> Клиент

Описание:

Это дополнение к протоколу DC++, используется вместо команд $Get и $Send. На поддержку этого дополнения указывает параметр XmlBZList в команде $Supports.

• [старт] - начальный индекс файла
• [число_байт] - число байт для получения или -1, если число байт неизвестно (когда файл целый)
• [имя_файла] - имя получаемого файла (utf8)

Отметим, что начальный индекс 0 для команды $UGetBlock подобен начальному индексу 1 для команды $Get. Другой клиент затем отсылает команду "$Sending [байты]|[данные]", если всё в порядке, иначе он отправляет команду "$Failed [описание_ошибки]|".

Имя файла [имя_файла] в кодировке UTF-8 для того, чтобы допустить символы, которые отсутствуют в обычной кодировке DC (cp1252).

Существует другая версия этой команды $UGetZBlock, которая поддерживает сжатие данных.

Автор: Setuper 1.2.2009, 16:35

$UGetZBlock

Синтаксис:

Код
$UGetZBlock [старт] [число_байт] [имя_файла]|


Направление команды:

Клиент ---> Клиент

Описание:

Это дополнение к протоколу DC++. На поддержку этого дополнения указывает параметр XmlBZList в команде $Supports.

Другой клиент отсылает команду "$Sending [байты]|[данные]", если всё в порядке, иначе он отправляет команду "$Failed [описание_ошибки]|". Где [байты] - это несжатое число байт (клиент не знает до какой степени сжат файл).
Более детальное описание параметров смотрите в команде $UGetBlock

Сжатие:

Сжатие выполняется библиотекой zlib, использующей динамический уровень сжатия. Уровень сжатия может изменяться для того чтобы снизить нагрузку на процессор или в случае если файл не сжимается. Уровень сжатия регулируется с помощью хеш-функции adler32.

Автор: Setuper 9.8.2009, 14:15

$Z / ZLine

Синтаксис:

Код
$Z [Блок]|


Направление команды:

Хаб -> Клиент

Описание:

Команда $Z используется расширением ZLine протокола NMDC.

Данная команда была предложена Jove и обсуждается в основном на DCDev хабе.
Команда предназначена для сжатия блоков команд.

Команда $Z [Блок]| будет развёрнута в строку: $Search ... |$MyINFO...|...

Используется простое zlib сжатие и дополнительное экранирование. Символ "\" экранируется так: "\\", а символ "|" так: "\P". Этого достаточно чтобы использовать взамен bzip.

Данную команду следует использовать только в одном направлении хаб -> клиент. В любом другом направлении она только создаст лишнюю нагрузку.

Клиент должен поддерживать эту команду. Он сообщает об этом хабу путём отсылки в команде $Supports флага ZLine

Оценка:
Проводились тесты для оценки эффективности данного дополнения.

Программа тестирования работала следующим образом: сначала пользователи соединялись, потом пользователи генерировали события:



Задержки между соединениями и событиями могут варьироваться. Настройки по умолчанию были выбраны следующими:
100 мсек между входами (10 соединений/сек) и 50 мсек между событиями (20 событий/сек).



Короткий тест (приблизительно 700 сек) со 100 пользователями.

Без ZLine
Общий трафик: Входящий 1986998, Исходящий 58506319
Среднее за 718 секунд: Входящий 16.140272 кб/с, Исходящий 475.764798 кб/с


С ZLine
Общий трафик: Входящий 1549938, Исходящий 15913487
Среднее за 719 секунд: Входящий 16.159448 кб/с, Исходящий 165.737719 кб/с




Тест с 1000 пользователями на хабе. Продолжительность теста примерно 22000 секунд (чуть больше 6 часов) в обоих случаях.

Без ZLine
Общий трафик: Входящий 58562006, Исходящий 18932614671
Среднее за 28078 секунд: Входящий 16.682808 кб/с, Исходящий 5393.331647 кб/с


С ZLine
Общий трафик: Входящий 48040395, Исходящий 3987767021
Среднее за 22318 секунд: Входящий 16.989433 кб/с, Исходящий 1410.093335 кб/с



Тест с 4000 пользователями на хабе. Продолжительность теста примерно 5000 секунд в обоих случаях.

Без ZLine
Общий трафик: Входящий 11675512, Исходящий 14732322239
Среднее за 5472 секунд: Входящий 16.910506 кб/с, Исходящий 21337.779879 кб/с


С ZLine
Общий трафик: Входящий 11102441, Исходящий 2805387234
Среднее за 5042 секунд: Входящий 17.197069 кб/с, Исходящий 4343.892306 кб/с



Ниже приведены немного другие тесты. Тесты с другими сообщениями. Основные сообщения те же самые, но кроме этого есть сообщения с произвольным числом символов. На результат влияют большие сообщения, которые труднее сжать.

1000 пользователей:


Без ZLine
Общий трафик: Входящий 26426307, Исходящий 8802244496
Среднее за 9358 секунд: Входящий 22.585492 кб/с, Исходящий 7522.500261 кб/с


С ZLine
Общий трафик: Входящий 27070505, Исходящий 4003114560
Среднее за 9359 секунд: Входящий 22.837603 кб/с, Исходящий 3376.263386 кб/с




Выводы:
Эффективность сжатия варьируется от 50% до 80% и зависит от количества пользователей и типа трафика. Данную команду нельзя применять для того, чтобы сжимать всё подряд. Хаб должен находить баланс между шириной полосы пропускания и ресурсностью процессора и памяти. В сущности, сжимаются только блоки команд, посылаемые клиентам. Поэтому нагрузка на процессор и память почти незаметна.


Хабы, поддерживающие данное дополнение:

Aquila
BDCH (планируется)
DDCH
tkhub
YnHub (планируется)
NitroHub (> 0.7)

Клиенты, поддерживающие данное дополнение:

DCDM++
iDC++
McDC++
Z++

Автор: Setuper 10.8.2009, 23:04

$ZOn

Синтаксис:

Код
$ZOn|[Блок_данных]


Направление команды:

Хаб -> Клиент

Описание:

Команда сжатия данных с использованием библиотеки zlib. Используется в хабе PtokaX.
Данная команда указывает на то, что после неё идёт блок данных, который сжат при помощи библиотеки zlib. Сжатый блок распаковывается на стороне клиента, после получения. Библиотека сжатия zlib использует алгоритм сжатия LZ77.

Для использования данной команды необходимо, чтобы в команде $Supports присутствовала характеристика ZPipe0.
Нолик на конце характеристики указывает на тестирование данной характеристики. В конечной реализации (не тестовой) данная характеристика имеет вид: ZPipe. Окончание блока сжатых данных трактуется символом EOF (End-Of-File).

См. также команду $Z

Автор: Setuper 10.8.2009, 23:52

TTH (Tiger Tree Hashing)

Описание:

Тип хэш-кода. Служит для однозначной идентификации файлов в p2p сетях. Впервые появился в клиенте DC++ 0.400.

Пример TTH для 0б:

Код
LWPNACQDBZRYXW3VHJVCJ64QBZNGHOHHHZWCLNQ



Вычисления TTH:

Сначала данные делим на блоки не более 1024 байта на блок. Далее к каждому получившемуся блоку спереди добавляется байт 00 - эта какт называемый Leaf Tiger Hash. Затем для каждой пары хешей вычисляется так называемый Internal Tiger Hash - это хеш от пары хешей Internal Tiger Hash или Leaf Tiger Hash с добавлением в начале байта 01. После хеширования всех пар получается один хеш, который называется Tiger Tree Root, и который является хешем всего дерева. Именно его используют для однозначной идентификации файла и указывают в различных P2P ссылках.

Схема хеширования:




Вычисление количества хешей на уровне:

Количество хешей на уровне можно посчитать циклически от нижнего до верхнего уровня следующим образом:

  1. Округлённое до большего целого количество хешей самого нижнего уровня (Количество байт данных \ 1024);
  2. Округлённое до большего целого количество хешей выше (Количество хешей ниже \ 2);
  3. Повторяем пункт 2 для нового уровня, пока не будет найдено количество хешей нужного уровня.



Поиск ($Search):

На данный момент в DC клиентах за поиск по TTH отвечает девятый тип поиска. Строка поиска девятого типа обязательно должна содержать TTH:[base32_encoded_tth_hash]


Результаты поиска ($SR):

Когда клиенту известен корневой хеш файла, клиент в команде $SR не должен отсылать имя хаба. Вместо имени хаба должен стоять TTH:[base32_encoded_tth_hash]. См. описание команды $SR.

Автор: Setuper 11.8.2009, 0:08

Lock2Key

Описание:

Реализация в различных языках функции lock2key для нахождения ключа по параметру команды $Lock.


Язык С/C++:

CODE
char *lock2key(char *lock)
{
int len = strlen(lock);
char *key = (char *)calloc(1, len + 1);

int i;
for(i = 1; i < len; ++i)
key[i] = lock[i] ^ lock[i-1];
key[0] = lock[0] ^ lock[len-1] ^ lock[len-2] ^ 5;

for(i = 0; i < len; ++i)
key[i] = ((key[i]<<4) & 0xF0) | ((key[i]>>4) & 0x0F);

char *newkey = (char *)calloc(1, len + 100);
char *newkey_p = newkey;
for(i = 0; i < len; ++i)
{
switch(key[i])
{
case 0:
case 5:
case 36:
case 96:
case 124:
case 126:
sprintf(newkey_p, "/%%DCN%03d%%/", key[i]);
newkey_p += 10;
break;
default:
*newkey_p = key[i];
++newkey_p;
}
}
*newkey_p = '\0';
return newkey;
}



Язык C++:

CODE
/// DCN экранирование
void DCN_Escape(const char *sBuf, int iLen, string &sDest)
{
sDest.clear();
unsigned char c;
char buf[11];
while(iLen-- > 0) {
c = *(sBuf++);
switch© {
case 0:
case 5:
case 36:
case 96:
case 124:
case 126:
sprintf(buf, "/%%DCN%03d%%/", c);
sDest += buf;
break;
default:
sDest += c;
break;
}
}
}

/// DCN разэкранирование
void DCN_UnEscape(const string &sSrc, char *sDest, int &iLen)
{
string sStart = "/%DCN", sEnd = "%/";
unsigned char c;
size_t iPos = sSrc.find(sStart), iPos2 = 0;
iLen = 0;
while((iPos != sSrc.npos) && (iLen < sSrc.size())) {
if(iPos > iPos2) {
memcpy(sDest + iLen, sSrc.c_str() + iPos2, iPos - iPos2);
iLen += iPos - iPos2;
}
iPos2 = sSrc.find(sEnd, iPos);
if((iPos2 != sSrc.npos) &&
(iPos2 - iPos <= sStart.size() + 3)) {
c = atoi(sSrc.substr(iPos + sStart.size(), 3).c_str());
sDest[iLen++] = c;
iPos2 += sEnd.size();
}
iPos = sSrc.find(sStart, iPos + 1);
}
if (iPos2 < sSrc.size()) {
memcpy(sDest + iLen, sSrc.c_str() + iPos2, sSrc.size() - iPos2 + 1);
iLen += sSrc.size() - iPos2;
}
}

/// Функция кодирования
void lock2key(const string &sLock, string &sKey)
{
int iCount = 0, iLen = sLock.size();
char *key = 0, *lock = new char[iLen + 1];
DCN_UnEscape(sLock, lock, iLen);

key = new char[iLen + 1];

key[0] = lock[0] ^ lock[iLen - 1] ^ lock[iLen - 2] ^ 5;
while(++iCount < iLen) key[iCount] = lock[iCount] ^ lock[iCount - 1];
key[iLen] = 0;

iCount = -1;
while(++iCount < iLen) key[iCount] = ((key[iCount] << 4)) | ((key[iCount] >> 4));

DCN_Escape(key, iLen, sKey);
delete [] key;
delete [] lock;
}



Язык C#:

CODE
private static string lock2key(string Lock)
{
int i, len = Lock.Length;
byte[] key = new byte[len];
for(i = 1; i < len; ++i)
key[i] = (byte)(Lock[i] ^ Lock[i - 1]);
key[0] = (byte)(Lock[0] ^ Lock[len - 1] ^ Lock[len - 2] ^ 5);

for(i = 0; i < len; ++i)
key[i] = (byte)(((key[i] << 4) & 0xF0) | ((key[i] >> 4) & 0x0F));

string Buf = "", Key = Encoding.Default.GetString(key);
for(i = 0; i < len; ++i)
switch((int)Key[i]) {
case 0:
case 5:
case 36:
case 96:
case 124:
case 126:
Buf += String.Format("/%DCN{0:000}%/", (int)Key[i]);
break;
default:
Buf += Key[i];
break;
}
return Buf;
}



Язык Lua (5.1):

CODE
function lock2key(lock)
local function bitwise(x, y, bw)
local c, p = 0, 1
local function bODD(x)
return x ~= math.floor(x / 2) * 2
end
while x > 0 or y > 0 do
if bw == "xor" then
if (bODD(x) and not bODD(y)) or
(bODD(y) and not bODD(x)) then
c = c + p
end
elseif bw == "and" then
if bODD(x) and bODD(y) then
c = c + p
end
elseif bw == "or" then
if bODD(x) or bODD(y) then
c = c + p
end
end
x = math.floor(x / 2)
y = math.floor(y / 2)
p = p * 2
end
return c
end

local key = {}
table.insert(key,
bitwise(bitwise(bitwise(string.byte(lock, 1),
string.byte(lock, -1),
"xor"),
string.byte(lock, -2),
"xor"),
5,
"xor"))
for i=2, string.len(lock),1 do
table.insert(key, bitwise(string.byte(lock, i), string.byte(lock, i - 1), "xor"))
end

local function nibbleswap(bits)
return bitwise(bitwise(bits * (2 ^ 4), 240, "and"),
bitwise(math.floor(bits / (2 ^ 4)), 15, "and"), "or")
end

local g = {["5"] = 1, ["0"] = 1, ["36"] = 1, ["96"] = 1, ["124"] = 1, ["126"] = 1}
for i=1, #key do
local b = nibbleswap(rawget(key, i))
rawset(key, i, (g[tostring(b)] and
string.format("/%%DCN%03d%%/", b) or string.char(b)))
end

return table.concat(key)
end



Язык PHP:

CODE
function lock2key($_LOCK, $port) {
$lockLength = strlen($_LOCK);
$LockToKey = '';

for ($j = 0; $j < strlen($_LOCK); $j++) {
if($j == 0) {
$h = ord($_LOCK{0}) ^ ord( $_LOCK{ $lockLength - 1} ) ^ ord( $_LOCK{ $lockLength - 2} ) ^ 5;
} else {
$h = ord($_LOCK{$j}) ^ ord($_LOCK{$j-1});
}

$h = $h % 256;
$a = (($h<<4) & 240) | (($h>>4) & 15);

if($a == '126' or $a == '124' or $a == '96' or $a == '36' or $a == '5' or $a == '0') {
$LockToKey .= "/%DCN";

if ($a < 100) $LockToKey .= "0";
if ($a < 10) $LockToKey .= "0";

$LockToKey .= $a;
$LockToKey .= "%/";
} else {
$LockToKey .= chr($a);
}
}
return $LockToKey;
}



Язык Perl:

CODE
sub lock2key($)
{
my @lock = split(//, shift);
my $i;
my @key = ();
# convert to ordinal
map {$_=ord} @lock;
# calc key[0] with some xor-ing magic
push(@key,$lock[0]^5);
# calc rest of key with some other xor-ing magic
for ($i=1;$i<@lock;$i++)
{
push(@key, ($lock[$i]^$lock[$i-1]));
}
# nibble swapping
for ($i=0;$i<@key;$i++)
{
$key[$i] = ((($key[$i] << 4) & 240) | (($key[$i] >> 4) & 15)) & 0xff;
}
$key[0] = $key[0] ^ $key[ @key - 1 ];
# escape some
foreach (@key)
{
$_ = ( $_ == 0 || $_ == 5 || $_ == 36 ||
$_ == 96 || $_ == 124 || $_ ==
126 ) ? sprintf('/%%DCN%03i%%/', $_) : chr;
}
# done
return join('', @key);
}



Язык Delphi / Pascal:

CODE
function lock2key(StrLock : string) : string;

// The follow function converts "1" (byte) to "001" (string), "10" to "010" and so on
function ByteToThreeCharStr (Value : byte) : string;
begin
if value < 10 then
result := '00'+inttostr(value)
else
if value < 100 then
result := '0'+inttostr(value)
else
result := inttostr(value);
end;

var i : byte;
Temp : string;
TempChar : byte;

begin
result := '';
if length (StrLock) < 3 then
begin
result := 'BROKENCLIENT';
setlength (result,length(strlock));
exit;
end;

// First char
temp := chr (ord (StrLock[1]) xor ord (StrLock[length(StrLock)])
xor ord (StrLock[length(strLock)-1]) xor 5);

for i := 2 to length (StrLock) do
temp := temp + chr (ord(StrLock[i]) xor ord (StrLock[i-1]));

for i := 1 to length (temp) do
begin
TempChar := ord (temp[i]);

// I now used assembler. In the visual basic code the same was done with ugly math
asm // <- Nibble swap! We swap the last four
// bits with the first four: 00101111 -> 11110010
ror TempChar, 4
end;

// Some chars need to be replaced with a string like "/%DCN005%/"
If (TempChar = 0) or (TempChar = 5) or (TempChar = 36) or (TempChar = 96)
or (TempChar = 124) or (TempChar = 126)
then
result := result + '/%DCN' + ByteToThreeCharStr(TempChar) + '%/'
else
result := result + chr (TempChar);
end;
end;



Язык Java:

CODE
private static final String CHARENCODING = "windows-1252";

public static String generateKey(String lockstr) throws UnsupportedEncodingException {
byte[] lock = lockstr.split(" ", 3)[1].getBytes(CHARENCODING);
byte[] key = new byte[lock.length];
for (int i = 1; i < lock.length; i++) {
key[i] = (byte) ((lock[i] ^ lock[i - 1]) & 0xFF);
}
key[0] = (byte) ((((lock[0] ^ lock[lock.length - 1]) ^ lock[lock.length - 2]) ^ 5) & 0xFF);
for (int i = 0; i < key.length; i++) {
key[i] = (byte) ((((key[i] << 4) & 0xF0) | ((key[i] >> 4) & 0x0F)) & 0xFF);
}
String modifiedLock = new String(key,CHARENCODING);
return dcnEncode(modifiedLock);
}

private static String dcnEncode(String lockstring) {
for (int i: new int[]{0,5,36,96,124,126}) {
String paddedDecimal = String.format("%03d", i);
String paddedHex = String.format("%02x", i);
lockstring = lockstring.replaceAll("\\x"+paddedHex, "/%DCN"+paddedDecimal+"%/");
}
return "$Key "+lockstring+"|";
}



Язык Visual Basic:

CODE
Public Function Lock2Key(StrLock As String) As String
Dim TLock2Key As String, TChar As Integer
If Len(StrLock) < 3 Then
Lock2Key = Left$("BROKENCLIENT", Len(StrLock))
Exit Function
End If
TLock2Key = Chr$(Asc(Left$(StrLock, 1)) Xor
Asc(Right$(StrLock, 1)) Xor
Asc(Mid$(StrLock, Len(StrLock) - 1, 1)) Xor 5)
For i = 2 To Len(StrLock)
TLock2Key = TLock2Key &
Chr$(Asc(Mid$(StrLock, i, 1)) Xor
Asc(Mid$(StrLock, i - 1, 1)))
Next i
For i = 1 To Len(TLock2Key)
TChar = Asc(Mid$(TLock2Key, i, 1))
TChar = TChar * 16 + TChar \ 16 'Swap bits 11110000 -> 00001111
TChar = TChar Mod 256
If TChar = 0 Or TChar = 5 Or TChar = 36 Or
TChar = 96 Or TChar = 124 Or TChar = 126 Then
Lock2Key = Lock2Key & "/%DCN" & Right$("000" & TChar, 3) & "%/"
Else
Lock2Key = Lock2Key & Chr$(TChar)
End If
Next i
End Function

Case "$LOCK"
'You've recived $LOCK, convert it to $KEY
Dim sLock2 As String
sLock2 = Split(Mid(sData2, 7), " Pk=")(0)
sLock2 = Lock2Key(sLock2)



Язык Python:

CODE
lock = self.sock.recv(1024)
lock = re.findall('\$Lock[\s](.*?)[\s]', lock)[0]

key = {}

for i in xrange(1, len(lock)):
key[i] = ord(lock[i]) ^ ord(lock[i-1])

key[0] = ord(lock[0]) ^ ord(lock[len(lock)-1]) ^ ord(lock[len(lock)-2]) ^ 5
for i in xrange(0, len(lock)):
key[i] = ((key[i]<<4) & 240) | ((key[i]>>4) & 15)

out = ""
for i in xrange(0, len(lock)):
out += unichr(key[i])

out = out.replace(u'\0', u'/%DCN000%/').replace(u'\5',
u'/%DCN005%/').replace(u'\44', u'/%DCN036%/')
out = out.replace(u'\140', u'/%DCN096%/').replace(u'\174',
u'/%DCN124%/').replace(u'\176', u'/%DCN126%/')



Язык Python 2.5.2 (Ubuntu 8.10):

CODE
# "lock" must be the exact lock character sequence, not the whole command.
# i.e. if the command is $Lock blah pk=bleh|, lock should be "blah"
def lock_to_key(lock):
"Decrypts lock to key."
key = {}
for i in xrange(1, len(lock)):
key[i] = ord(lock[i]) ^ ord(lock[i-1])
key[0] = ord(lock[0]) ^ ord(lock[len(lock)-1]) ^ ord(lock[len(lock)-2]) ^ 5
for i in xrange(0, len(lock)):
key[i] = ((key[i]<<4) & 240) | ((key[i]>>4) & 15)
out = ""
for i in xrange(0, len(key)):
if key[i] in (0, 5, 36, 96, 124, 126):
out += "/%%DCN%03d%%/" % (key[i],)
else:
out += chr(key[i])
return out

Автор: Setuper 14.8.2009, 14:13

BotList

Описание:

Характеристика хаба/клиента. Данная характеристика указывает на поддержку команды $BotList.

Для полного понимания, данная характеристика должна присутствовать в команде $Supports как хаба, так и клиента.

Автор: Setuper 14.8.2009, 14:27

ClientID

Описание:

Характеристика клиента. Данная характеристика указывает на поддержку команды $ClientID.
Характеристику поддерживают следующие клиенты: BlackDC, iDC++, dDC++, Zion++

Автор: Setuper 14.8.2009, 14:37

Feed

Описание:

Характеристика хаба.
Данная характеристика позволяет использовать дополнительные протокольные команды уведомления. Характеристика позволяет отслеживать все действия отдельных или всех пользователей, логировать эти действия, а также оповещать операторов хаба о совершённых действиях через отдельно созданную чат-комнату.

На данный момент характеристику Feed поддерживает YnHub.

Автор: Setuper 14.8.2009, 14:57

HubTopic

Описание:

Характеристика хаба. Указывает на поддержку команды $HubTopic. Данная характеристика является не обязательной, то есть хаб может поддерживать данную команду и без указания данной характеристики.

Автор: Setuper 14.8.2009, 15:05

IN

Описание:

Пока неизвестная характеристика.

Автор: Setuper 14.8.2009, 15:06

MCTo

Описание:

Характеристика хаба.
Данная характеристика указывает на поддержку команды $MCTo.
На данный момент характеристику поддерживает хаб YnHub.

Автор: Setuper 14.8.2009, 15:13

NoGetINFO

Описание:

Характеристика хаба/клиента.
Характеристика указывает на то, что хабу не нужно получать от клиента команды $GetINFO для того, чтобы отсылать ему команды $MyINFO и $NickList. Это некое подобие характеристики QuickList, которая позволяет осуществлять быстрые получения списков пользователей.

Важное замечание!
При отсутствии у клиента характеристики NoHello и при наличии характеристики NoGetINFO хаб должен отсылать клиенту список пользователей при помощи команд $MyINFO и $NickList одновременно. При отсутствии обеих характеристик список пользователей отсылается по средствам команды $NickList, а список пользователей с участием команд $MyINFO можно будет получить только после отсылки на хаб команды $GetINFO.

Характеристика поддерживается клиентами DC++, начиная с версии 0.302.

Автор: Setuper 14.8.2009, 15:35

NoHello

Описание:

Характеристика хаба/клиента.
Характеристика говорит о том, что при входе нового юзера на хаб, клиенту, уже находящемуся на хабе, не нужно отсылать оповещение о входе юзера в виде команды $Hello. Кроме этого, данная характеристика указывает на то, что хаб не должен отсылать клиенту при коннекте команду $NickList, которая отвечает за получение клиентом ников всех пользователей хаба, а клиент не должен отсылать на хаб команду $GetINFO для получения списка пользователей хаба. Для заполнения списка пользователей хаб должен отослать команду $MyINFO. Клиент отсылает команду $GetNickList для указания того, что он заинтересован в получении списка пользователей, однако, хаб не обязан ждать эту команду и должен отослать список пользователей в любом случае.

Важное замечание!
При наличии у клиента этой характеристики хаб при входе этого клиента будет отсылать клиенту список пользователей командами $MyINFO. Так как команда $MyINFO содержит ники пользователей, то получение ников командой $NickList является лишним действием. Поэтому данная характеристика является самым информативным и оптимальным вариантом.

Характеристика поддерживается клиентами DC++, начиная с версии 0.305.

Автор: Setuper 14.8.2009, 15:47

OpPlus

Описание:

Характеристика хаба. Указывает на то, что на хабе используются дополнительные команды для операторов. Например: $Ban, $TempBan, $UnBan, $GetBanList, $WhoIP, $Banned, $GetTopic, $SetTopic и тд.

На данный момент команду поддерживает хаб VerliHub.

Автор: Setuper 14.8.2009, 16:06

QuickList

Описание:

Характеристика хаба/клиента.
Позволяет быстро входить на хаб, экономя трафик и снижая нагрузку на сервер при входе.


Сравнение последовательностей входов с и без характеристики QuickList:

Обозначения:
H - хаб
C - клиент

С характеристикой QuickList

Код
H: $Lock EXTENDEDPROTOCOL[Код] Pk=[PrimaryKey]|
C: $Supports NoHello QuickList|
C: $Key [Рассчитанный_ключ]|
H: $Supports NoHello QuickList|
C: $MyINFO [Строка]|
C: $GetNickList|
H: Отсылает список пользователей.


Без характеристики QuickList
Код
H: $Lock EXTENDEDPROTOCOL[Код] Pk=[PrimaryKey]|
C: $Supports NoHello|
C: $Key [Рассчитанный_ключ]|
H: $Supports NoHello|
C: $ValidateNick [Ник]|
H: $Hello [Ник]|
C: $Version [Версия]|
C: $GetNickList|
C: $MyINFO [Строка]|
H: Отсылает список пользователей.


Поддержка характеристики:

Полноценно данную характеристику поддерживает хаб PtokaX.
Со стороны клиентов, данную характеристику поддерживают следующие клиенты: CZDC, BCDC

Внимание! Так как в данной характеристике отсутствуют шаги валидации ника и проверки версии, то при поддержке со стороны клиента данной характеристики на хабе PtokaX скриптовые функции ValidateNickArrival и VersionArrival для этого клиента выполняться не будут!

Автор: Setuper 14.8.2009, 16:09

TTHSearch

Описание:

Характеристика клиента.
Эта характеристика указывает на то, что клиент поддерживает поиск файлов по уникальному идентификатору TTH. Поиск по TTH является наиболее эффективным. Для получения большей информации по поиску смотрите описание команды $Search.

Характеристика поддерживается клиентами DC++, начиная с версии 0.307.

Автор: Setuper 14.8.2009, 16:21

UserCommand

Описание:

Характеристика хаба/клиента.
Данная характеристика указывает на поддержку со стороны хаба или клиента команды $UserCommand, которая позволяет клиенту создавать контекстные менюшки. Наличие этой характеристики в команде $Supports является не обязательным из-за большой распространённости команды.

Характеристика поддерживается клиентами DC++, начиная с версии 0.300.

Автор: Setuper 14.8.2009, 16:37

UserIP2

Описание:

Характеристика хаба/клиента.
Указывает на то, что хабом (клиентом) поддерживается вторая версия команды $UserIP.
Вторая версия отличается от первой тем, что входящему на хаб пользователю всегда отсылается команда $UserIP с его ником и ip адресом. Ip адреса остальных же пользователей отсылаются в зависимости от статуса пользователя на хабе.

Характеристика поддерживается DC++ клиентами, начиная с версии 0.305.

Автор: Setuper 14.8.2009, 16:45

ZLine

Описание:

Характеристика хаба/клиента.
Характеристика указывает на поддержку команды сжатия $Z.