to post messages and comments.

← All posts tagged XMPP

Модные современные мессенджеры умеют получать push-уведомления на Android/iOS-устройства о новых сообщениях, а XMPP разработчики этих убийц Whatsapp-а считают "устаревшим" и "не умеющим" реализовывать подобные фичи. На самом деле все очень просто и нужно совсем немного кода:
1) берем xmpp-сервер prosody и модуль mod_smacks из prosody-modules, реализующий XEP-0198: Stream Management
2) настраиваем ему параметр smacks_hibernation_time = 86400 — столько секунд он будет держать сессию клиента подключенной, если он(клиент) отключился.
3) немножко патчим его(модуль), добавляя туда один единственный вызов события получения сообщения — paste.org.ru
4) теперь пишем дополнительный модуль, назовем его mod_smacks_notifications, который будет слать принятые во время отсутствия клиента сообщения через Google Cloud Messaging (аналогичным образом можно работать и с Apple и Microsoft, coming soon)
paste.org.ru
5) далее нужно добавить поддержку в клиент, мной взят Android-клиент SawIM:
а) быстренько дописываем поддержку XEP-0198, очень простой XEP, нам достаточно считать полученные пакеты и по запросу сервера высылать это число, ну и естественно включать управление сессиями и продолжать разорванную сессию.
б) при получении от GCM регистрационного кода устройства, шлем нашему серверу запрос типа:
<iq type=set"><register xmlns="..." regid="[полученный-regid-от-гугла]" /></iq>
в) Создаем в Google API Console проект для нашего мессенджера, в консоли разработчика Google Play связываемся с приложением через Server API Key, в конфигурации нашего написанного модуля указываем gcm_api_key.
На все про всё ушло пара дней неспешной работы в свободное время, lua видел второй раз в жизни, ну java видел чуть побольше :) — github.com

Сборочка Spectrum2 под Шиндошс — dropbox.com
Отладочные символы + все необходимое для того чтоб написать свой плагин, например транспорт вконтактика — dropbox.com
Дополнительно требуется Шиндошс Vista/Server 2008 и выше (на икспи/2003 работать не будет) и MSVC 2012 Redist X86 — microsoft.com

Идем на swift.im и читаем там:

Why Choose Swiften?
You don’t have to spend time reading specs and determining correct behaviour – we’ve been doing that for over a decade, and even wrote the book on it.
Окей. Берем Swiften и пишем такой крошечный тест:

void createWithInvalidName() {
Swift::JID jid("romeo", "example.net", "");
CPPUNIT_ASSERT_EQUAL(std::string("[email protected]"), jid.toString());
}

Что мы получаем на выходе? Правильно:

Test name: LocalBuddyTest::createWithInvalidName
equality assertion failed
— Expected: [email protected]
— Actual : [email protected]/

Сказать ФЕЙСПАЛМ это просто ничего не сказать. Пишут они жаббер десятилетиями, ага.