вторник, 19 января 2010 г.

Немного подробнее о проекте CaffeineIM и ICQLib


Здравствуйте, уважаемые читатели. Сегодня немного необычный пост: Суровый программист будет рассказывать не о том, что сделано другими, а о том, чем иногда занимается он сам. Конкретнее - речь пойдет о написанной исключительно Just for fun Java-библиотеке, предназначенной для создания ICQ-клиентов.

Библиотека называется ICQLib и ее исходники можно невозбранно взять на Google Code. В 2007-м году был сделан форк мертвой на тот момент JOscarLib, возможности которого были существенно расширены и добавлена работа с русским языком (в кодировках UTF-8/cp1251). Кстати, злая ирония судьбы: примерно год назад JOscarLib начал развиваться, а работа над нашей библиотекой заглохла (энтузиазм иссяк), но сейчас я решил возродить проект и продолжить работу над ним.

На текущий момент ICQLib обладает следующими возможностями:

- Дополнительные статусы QIP (депрессия, на работе, дома и т.д.)

- X-статусы. Полная реализация, аналогичная возможностям QIP.

- Корректная поддержка русского языка. Подразумевается: отправка-прием сообщений, содержащих кирилицу, информация о себе на русском, информация о контактах, запрос авторизации, x-статусы.

- Работа с контакт-листом (правда, данная функциональность будет переделываться). Можно добавлять и удалять пользователей и группы. Перемещать пользователей межу группами. Реализованы такие действия, как удаление себя из контакт-листа пользователя, запрос авторизации, ответ на запрос авторизации, разрешение добавить себя без запроса авторизации. Полностью поддерживается русский язык.

- Работа с мета-информацией. Реализованы все запросы метаинформации о контакте (About user).


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

- Поиск пользователей
- Передачу/прием файлов
- Хранимые на сервере иконки-аватары
- Регистрацию нового ICQ-аккаунта
- Возможность настраивать название клиента

Список актуальных задач хранится в треккере проекта. Я, собственно, к чему данный пост и пишу: если вы разработчик и хотите поучаствовать в актуальном российском OpenSource проекте (например, с целью обучения, наработки опыта/портфолио), то милости просим. Чтобы присоединиться к проекту достаточно написать письмо с краткой иформацией/резюме о себе в список рассылки caffeineim-dev@googlegroups.com. Обещаю, ваше письмо не останется без ответа.

Еще пару слов о библиотеке и процессе разработки. Построена она на основе событийной модели. С того момента, как пользователь отправляет на ICQ-сервер запрос авторизации, ему начинают приходить ICQ-пакеты, которые складываются в очередь сообщений. Другой поток извлекает пакеты из очереди и парсит их. Для облегчения процесса разработки, каждому типу пакета соответствует свой класс, а логика разбора пакета вынесена в его конструктор, который вызывается с помощью рефлексии. После разбора пакета выполняются два метода:

- execute, который выполняет какие-то действия в рамках протокола, например отправляет Ack на сервер.

- notifyEvent, который генерирует событие и уведомляет о нем все заинтересованые слушатели.

Интерфейсы слушателей описаны в пакете r.c.p.i.integration.listeners, а классы событий - r.c.p.i.integration.events. Класс r.c.p.i.integration.OscarInterface служит для отправки запросов к ICQ-серверу.

UPD от 29.01.10: Библиотека собирается с помощью maven, подробно процесс сборки описан в Wiki проекта. В trunk содержится два модуля: icqlib - собственно библиотека, здесь же будут находится unit-тесты, и icqlib-examples, здесь находится набор небольших консольных приложений, демонстрирующих использование библиотеки.

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

Ну и напоследок расскажу о том, кто использует ICQLib:

- Дмитрий Пролубников создал на основе библиотеки Jimbot. Подробности проекта можно прочитать на соответствующей странице.

- Ваш покорный слуга разрабатывает AOL/ICQ/OSCAR провайдер для Eclipse Communication Framework. Уже реализована отправка/получение сообщений в чате, DataShare API, SharedObject API, RemoteServices API. Вообще дергать удаленные сервисы черз ICQ как минимум интересно.

Буду рад любым высказанным мнениям, вопросам, пожеланиям присоединиться к разработке/использованию проекта.

UPD: 03.06.2011 Я уже не имею желания заниматься данным проектом, да и вообще рассматриваю перспективы ICQ как очень сомнительные. Лично я уже не пользуюсь ни ICQ, ни Jabber, найти меня можно исключительно в Skype. Но я знаю, что есть энтузиасты, разрабатывающие в частности ICQ клиент под Android и вносящие изменения в код библиотеки.

Напоминаю, что ICQLib распространяется под лицензией LGPL, поэтому все изменения, внесенные в исходный код библиотеки, должны быть доступны для скачивания.

Понравилось сообщение - подпишитесь на блог или читайте меня в twitter

18 комментариев:

yaroslav matveychuk комментирует...

Попытался собрать caffeineim антом - он выдал:
java.io.FileNotFoundException: X:\XXX\icqlib\build.xml и указывал на 312ю строчку в build.xml:



В icqlib build file называется ant_build.xml.

После переименования запустился билд, но потом свалился с 73 error'ами - package does not exist и cannot find symbol. Наверное я что-то делаю не так. Судя по всему проект создавался в netbeans. Я его пытался импортить в eclipse.

Pavel Samolisov комментирует...

Файлы проекта сознательно не закомичены, чтобы не привязываться к какой-либо IDE. Так то я сам тоже разрабатываю в Eclipse.

Только что проверил ant -f ant_build.xml, у меня собрался без проблем. Я буду очень благодарен, если вы вышлите мне на samolisov AT gмыло.com лог сборки.

yaroslav matveychuk комментирует...

Запускал build file через eclipse, теперь попробовал из консоли:
..\Projects\caffeineim>ant -f build.xml
Buildfile: build.xml

-pre-init:

-init-private:

-init-user:

-init-project:

-init-macrodef-property:

-do-init:

BUILD FAILED
..\Projects\caffeineim\nbproject\build-impl.xml:115: Class org.apache.tools.ant.taskdefs.ConditionTask doesn't
support the "else" attribute.

Pavel Samolisov комментирует...

Я занимаюсь только библиотекой, если ее зачекаутить отдельно и собирать - она собирается.

К сожалению, за самим CaffeineIM давно не следил, там и правда парни делали в netbeans.

yaroslav matveychuk комментирует...

icqlib собирается, правда есть пара варнингов с непонятными символами:
http://img189.imageshack.us/i/clipboardq.png/

yaroslav matveychuk комментирует...

>>Файлы проекта сознательно не закомичены, чтобы не привязываться к какой-либо IDE.

Да, знаком с такой идеалогией. Правда, имея build-файл мы уже абстрагируемся от какой-либо ide и непонятно, почему все таки не стоит коммитить проекты ide хотя бы просто для удобства новых людей в проекте. Если бы проект был построен на maven - все решалось бы очень просто - все ide умеют создавать проект из pom.xml.

Pavel Samolisov комментирует...

Вы правы, я закоммитил .project и .classpath в отдельный каталог ide/eclipse Достаточно скопировать их в корень проекта и Eclipse должен понять, что перед ним java-проект с указанным classpath. Единственное, возможно придется поправить используемый JDK

Dieu комментирует...

1. Можно перевести проект под mercurial, не очень хочется получать доступ до репозитория, но по коммитеть было бы желание, а бандлами все решилось бы очень удобно.

2. на мавен не планируется переход? проблема с иде актуально в большинстве.

yaroslav matveychuk комментирует...

Проблема с ConditionTask решилась обновлением анта. Данная проблема возникает если версия анта меньше 1.65. Но теперь возникает другая ошибка: ..\Projects\icqlib\build.xml:50: A zip file cannot include itself
Пока не знаю что это означает.

Pavel Samolisov комментирует...

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

По поводу ошибки анта - это значит, что в каталоге dist уже есть icqlib.jar. Я поправлю этот баг, пока же - надо сделать clean перед jar.

Pavel Samolisov комментирует...

Павел Виноградов обещал помочь нам с переходом на maven, поэтому скоро сборка проекта значительно упростится.

Alexander комментирует...

Как перейдете на Maven - сообщите, плз.

Pavel Samolisov комментирует...

Библиотека переведена на систему сборки maven.

solo комментирует...

Отличный проект! Спасибо. Провел пару дней в поисках и не нашел ни одной библиотеки, которая бы просто могла бы отправить сообщение на ICQ! Ваша библиотека работает, как часы!

Dmitry комментирует...

можете подсказать какое-то внятное руководство по JOscarLib?
а то вожусь с ней и никак въехать не могу как у них там все работает :)

onemorealexey комментирует...

Спасибо! Замечательная библиотека

std.denis комментирует...

Скажите, а зачем для разбора входящих пакетов используется такая сложная конструкция как класс RawData?
Например, "setSequenceNumber(new RawData(array, 2, 2).getValue())".
При этом создается экземпляр класса RawData, который внутри себя делает копию куска массива длиной 2 байта, и затем, после обработки (getValue), они все радостно отправляются в объятия сборщика мусора. Никак не пойму, в чем преимущество по сравнению со статическим методом типа "static int parseIntValue(byte[] array, int start, int len)"

Pavel Samolisov комментирует...

Библиотеку начинал писать не я и ее основы были заложены еще во времена Java 1.4.2, если не раньше. Возможно были какие-то проблемы со статическими методами, а возможно RawData используется как некий общий класс для представления бинарных данных и при парсинге и при формировании сообщений.

Отправить комментарий

Любой Ваш комментарий важен для меня, однако, помните, что действует предмодерация. Давайте уважать друг друга!