Isotoxin: свободный мультипротокольный мессенджер с поддержкой Tox
Вы наверняка слышали о Tox. Напомню: это свободный защищенный p2p протокол для передачи сообщений, аудио и видео потоков между участниками Tox-сети. По сути — это альтернатива скайпу. Когда я впервые услышал о Tox, мой градус неприязни к скайпу был еще не слишком высок, но я уже начал поиск альтернатив. Мне очень понравилась идея, лежащая в основе Tox: мы пишем протокол со всеми нужными плюшками, а вы пишете к нему клиенты. Когда появились первые клиенты для сети Tox, я подумал: «черт возьми, я смогу сделать это не хуже!». Вобщем, подталкиваемый неприязнью к скайпу, я взялся за проект мессенджера своей мечты. Сейчас, когда в моем локальном hg-репозитории первому комиту исполнилось 19 месяцев и был сделан 414-й комит, я наконец то созрел до того, чтобы рассказать об этом клиенте широкой аудитории Хабра.
Что сделано
- Полная поддержка всех текущих возможностей протокола tox, включая видеозвонки (исключая смену nospam, но я сильно сомневаюсь, что существует на свете человек, которому реально потребовалось этой возможностью воспользоваться)
- Собственный протокол для общения внутри локальной сети (создавался в основном для отладки системы плагинов, но вполне работоспособен: имеется все тоже самое, что в tox, кроме видео)
- Поддержка одновременной работы нескольких протоколов (можно, например, иметь сразу два подключения к tox с разных ID)
- Стандартные возможности сферического мессенджера, такие как сохранение истории, аватары, смайлы, нотификация о приходе сообщения и др.
- Продвинутые возможности, такие как метаконтакты, аудио/видео звонки, расшаривание десктопа, групповые чаты, поиск по сообщениям, передача файлов
- Шифрование профиля паролем. Профиль — это файл, sqlite база, со всеми настройками и историей сообщений.
- Поддержка «скинов» в интерфейсе
- Автоматические обновления
- Поиск контактов в контакт листе
- «Живой» поиск по сообщениям
- Возможность НЕ хранить историю сообщений
- Тэги контактов и фильтрация по тэгам (сделано в последней версии)
- Можно посмотреть данные контакта, в том числе версию клиента (если это Isotoxin) и его Tox ID (nospam будет показан только в случае, если вы отправляли запрос на добавление)
- Можно написать комментарий к контакту (просто описание, никуда не отправляется)
- Аватарку и имя можно указывать для отдельных соединений
- Можно сделать аватарку с web-камеры
- Звуковые оповещения. Возможность выбирать звуки для оповещений
- Поддержка наборов смайлов. Поддержка анимированных gif-смайлов
- Передается время создания сообщения (надстройка над tox протоколом)
- Поддержка bb-кодов в сообщения и имени. Если клиент на другой стороне не поддерживает bb-коды, имя ему присылается чистым
- Мультиязычность. Язык можно переключать без перезагрузки
- Автоматически включается статус «Отошел» (настраиваемо)
- Разные способы отправки сообщений: Enter/Ctrl+Enter/Shift+Enter/Double Enter
- Кастомизируемый формат отображения даты и времени сообщений
- Возможность экспорта истории сообщений в txt или html файл (при желании, формат файла для экспорта можно настроить любой)
- Показ и отправка нотификации о наборе текста
- Автоматический прием файлов в зависимости от расширения файла
- Показ картинок в списке сообщений, в том числе анимированных
- Можно обрезать картинку перед отправкой. Саму картинку можно получить из файла, из буфера обмена, с web-камеры или сграбить рабочий стол. После обрезки автоматически выбирается формат jpg или png, в зависимости от итогового размера
- Автообновления можно пустить через прокси
- Настройка автозапуска
- Сворачивание в «трей»
- Для отдельных контактов можно включить автоматический прием голосового вызова с отключением микрофона
- При передаче видео, изображение масштабируется на источнике под размеры приемника, т.о. экономится полоса
- Генерация QR кода из текста сообщения, линка, или ID контакта или текущего Tox ID
Конечно, еще многое предстоит сделать, но того что сделано, вполне достаточно для комфортного использования.
Разработка
У меня довольно большой опыт в C++ и программировании под Windows. Глупо пренебрегать этим опытом, поэтому разработка была начата на C++ и под Windows. Однако, понимая всю важность поддержки разных платформ, я сразу решил минимизировать зависимость от winapi и других windows-only возможностей. У меня даже рендеринг текста не использует GDI, а написан свой. Для чтения шрифтов используется библиотека FreeType. Весь GUI, все контролы — всё написано с нуля и не привязано к системе. Вся работа с окнами winapi вынесена в отдельное место и максимально абстрагирована от логики интерфейса. Проблема за малым — научиться писать под линуксом. Пока что у меня на это нет времени. Может быть найдутся желающие портировать?
С самого начала я задумал модульную архитектуру. Исполняемый файл должен был уметь только GUI и ничего более. Все сетевые дела поручались модулям. Проще говоря — обычная система плагинов.
Одна из трудностей, с которой пришлось столкнуться в процессе разработки — полное нежелание ядра tox собираться под Visual Studio. Все дело оказалось в динамических массивах стандарта C99. irungentoo, главный разработчик ядра, отвергает любые просьбы убрать эти массивы из кода, говоря: «C99 — стандарт. Если msvc его не поддерживает, то это его проблемы». Если вам интересно мое личное мнение, то я считаю динамические массивы злом, т.к. они убивают константность оператора sizeof. Так что я вполне понимаю разработчиков компилятора msvc и их нежелание связываться с динамическими массивами. Итак, у меня было два пути: собирать toxcore отдельно через cygwin (как это делают остальные разработчики клиентов Tox под windows) или самому убрать динамические массивы из кода. Я выбрал второй путь и в результате на свет появился вот этот репозиторй. Это не прямой форк toxcore, а некая сборка из необходимых библиотек (libsodium, opus, vpx), которая легко и безграбельно собирается msvc компилятором (поддерживаются 2013 и 2015).
Почти весь код Isotoxin’а написан мной в одиночку, исключая несколько моментов, написанных моими друзьями, а также сторонних библиотек. Активно используются возможности C++11. В связи с выходом апдейта к 2015-й студии и исправления некоторых, критичных для меня, багов, планирую полностью перейти на этот компилятор, чтобы задействовать constexpr и C++14 по полной.
Архитектура
Когда я только начал писать первые строчки кода Isotoxin’а, в моих планах совершенно отсутствовало желание открывать исходники. Однако, имелось противоречие с лицензией GPL3, под которой предлагалось ядро tox. В чем противоречие? Если коротко, то эта лицензия требует открывать исходный текст программы, которая использует библиотеку под этой лицензией. Очевидное решение этой дилеммы — вынести реализацию протокола в отдельную динамическую библиотеку (dll) и открыть исходники этой dll.
Но я решил пойти немного дальше и не ограничился лишь только dll-кой. В итоге родилась следующая архитектура.
1. isotoxin.exe — чистый GUI. По началу я не хотел открывать его исходники. Чтобы повысить степень доверия к этому файлу, я даже решил полностью лишить его возможности работать с сетью. Позже, когда я все же отказался от закрытости, работа с сетью была возвращена, но только для одной цели — проверка и скачивание обновлений.
2. plghost.exe — Небольшой exe’шник, который загружает dll-ки протоколов. Точнее — только одну dll’ку. Запускается непосредственно из isotoxin.exe и общается с последним средствами межпроцессного взаимодействия, транслируя его команды в dll протокола и отправляя обратно результат.
3. proto.*.dll — Собственно dll’ки протоколов. Реализуют единый интерфейс.
У этой архитектуры есть достоинства и недостатки.
Достоинства.
- Разграничение обязанностей кода. Нельзя просто взять, и вызвать какую угодно функцию протокола из GUI и наоборот. Это дисциплинирует и помогает писать четкий и безопасный код с минимумом ошибок.
- Надежность. Ошибки протокола, приводящие к падению, не уронят GUI. В случае падения plghost.exe, последний просто загружается заново. Пользователь может даже не заметить проблемы.
- Защищенность. Пользователь — параноик — может обложить plghost.exe разными правилами работы с диском, например, полностью ограничить запись и чтение. Все будет работать, как ни в чем не бывало, и даже, если злоумышленник сможет использовать уязвимость реализации протокола для доступа к коду, он не сможет покинуть песочницу.
- На будущее — поддержка одновременной работы как 32-битных, так и 64-битных реализаций протоколов. Достаточно собрать 64-битную версию plghost.exe. Т.о. выпуск 64-битной версии Isotoxin’а (а я не исключаю, что это произойдет), не повлечет за собой необходимость срочного выпуска 64-битных же версий сторонних протоколов, если таковые появятся.
Недостатки. А как же без них.
- Значительное усложнение кода и его отладки. Одновременный дебаг нескольких exe-шников — это не сахар.
- «лишний» файл (plghost.exe)
- Требования к ресурсам системы немного выше. Все же запуск дополнительного exe’шника на каждый работающий протокол не бесплатно.
Список недостатков получился каким-то маленьким и несерьезным. Ничего сверх этого я придумать не смог. А, следовательно, выбор архитектуры считаю правильным.
Внешний вид
Признаю, дизайнер из меня аховый, поэтому я сразу заложил в программу возможность смены внешнего вида. Проще говоря, поддерживаются «скины». Пока что доступна только одна тема. Увы, моего времени на всё и сразу не хватает. В ближайшее время я планирую сделать поддержку раскрашивания темы. Под спойлером несколько скриншотов Isotoxin’а.
Установка пароля в окне настроек
Подготовка изображения к отправке — можно обрезать лишнее
Преимущества
Понятно, что каждый разработчик старается хвалить свой продукт. Постараюсь быть максимально объективным. В настоящее время наиболее популярным и богатым на возможности среди всех клиентов, поддерживающих сеть tox, следует признать qTox. Однако Isotoxin обходит qTox почти по всем пунктам (исключая, разумеется, поддержку не-windows).
- Портабельность. В какой то момент qTox перестал быть портабельным. Возможно, портабельность ему снова вернули, я не знаю, не проверял.
- Поддержка XP. qTox больше нельзя запустить под Windows XP. Для кого-то это может быть проблемой. Isotoxin работает под XP без проблем
- Стабильность. Isotoxin уже практически не падает. Каждое падение — это моя личная трагедия. Пока не докопаюсь до причины падения, не успокаиваюсь. qTox у меня падал, даже без активного использования
- Дополнительные возможности, которых нет в протоколе. В своем форке toxcore я ввожу новые возможности, разумеется, с обратной совместимостью. Когда Isotoxin обнаруживает на другом конце провода тоже Isotoxin, то эти возможности включаются. Одна из таких возможностей — неограниченная длинна сообщений (другие клиенты следуют рекомендации создателей ядра и режут длинные сообщения по пробелу)
Есть еще много чего, но я не буду всё описывать, чтобы не захламлять статью и не превращать ее в рекламу.
Планы
Планов на будущее много. Помимо добавления протоколов (очень хочется добавить Telegram и джаббер), есть большое желание портировать под линукс. Для знающего человека это не должно составить проблемы. Как я уже писал выше, никаких особых возможностей «винды» я не использую. Вобщем, идея в том, чтобы сделать полноценную замену скайпу.
Ссылки
Сайт проекта: isotoxin.im
Форум проекта: isotoxin.im/forum
Сайт проекта в сети i2p: isotoxin.i2p (тут, бывает, появляются промежуточные версии)
Исходный код: github.com/Rotkaermota/Isotoxin
Блог, посвященный проекту: isotoxin-dev.livejournal.com