asdcbot. Бот для DC++ хаба. Этап 1. Проба пера
Хочется отписаться о первых успехах в реализации идеи разработки DC++ бота.
Задачами первого этапа я выделил:
- Изучить (хотя бы в общих чертах) протокол NMDC (по которому работают большинство современных хабов)
- Изучить и смоделировать процесс входа на хаб, получения общей информации о хабе и о его пользователях
- Попробовать выполнить несколько команд и изучить результат их выполнения
На русскоязычной страничке документации (http://mydc.ru/topic915.html) все хорошо расписано, но на всякий случай поясню вкратце.
О структуре команд в документации все ясно написано: $КОМАНДА|
. Экранирование символов не поддерживается, поэтому для отправки символов $
и |
следует использовать их коды ($
и |
соответственно).
Теперь непосредственно об общении с хабом. Здесь реализована такая схема: соединяемся с хабом. хаб отвечает командой $Lock
, сообщая клиенту свой идентефикатор. В ответ на это клиент рассчитывает с помощью специальной функции ключ, который подтверждает то, что пытается подключиться оригинальный клиент (странное решение, если учесть, что эта функция располагается в свободном доступе на разных языках программирования) и отправляет его хабу командой $Key. Вместе с тем, клиент должен отправить команду проверки на доступность предполагаемого ника (нет ли в сети пользователя с таким ником) - $ValidateNick. В случаи успеха хаб приветствует нового пользователя командой $Hello, а пользователь в ответ на это обязан сообщить информацию о себе и о используемой версии протокола (команды $Version и $MyINFO). После представления хаб начинает бесконечно сыпать в сокет события, которые инициируют другие пользователи (подключение и отключение пользователей, поисковые запросы, etc.) Пример “рукопожатия” расписан на странице документации (http://mydc.ru/topic915.html - в самом низу первого сообщения).
При реализации тестового подключения особых граблей не возникло, реализовано было на php в течение получаса. Если у читателей этой статьи возникнут вопросы по реализации - пишите в комментариях, с радостью отвечу :)