Небольшая заметка о том, что делал в последнее время по RSS-транспорту.
Во-первых (v 1.4.2), добавил адаптивный режим обновления лент. То, что меня поначалу смущало в JabRSS, сделал и у себя. Правда, тут я знаю, как оно работает, поэтому как-то проще :). В общем, так как у меня уже есть статистика по числу сообщений за последний час – почему бы не найти ей более полезное применение, чем просто отображение в статусе? Теперь можно не дергать активную ленту каждую минуту, просто надо поставить какой-то более-менее вменяемый интервал обновления (например, 10 минут – да, в случае чего первые сообщения придется подождать эти 10 минут), если там начали более-менее часто появляться сообщения – то начнет активно расти счетчик сообщений за последний час и период обновления подстроится, исходя из этого значения. Была мысль сделать период, например, в 2 раза меньше расчетного значения (чтобы уж совсем точно), но и так вполне хорошо. Ну и справедливо обратная ситуация – если сообщения начали приходить реже, то счетчик начинает уменьшаться и увеличивается период. Установил лимиты – лента не проверяется чаще раза в минуту и проверяется не реже, чем установленный при регистрации лимит.
Во-вторых (v 1.4.3), упомянутая уже ранее работа по использованию юникода. Незаметное снаружи, но довольно масштабное изменение по коду. Постарался пройтись по всем функциям, вроде нигде косяков не возникло и все продолжает работать корректно. В целом, вроде уменьшилось число всяких там unicode()/encode(), стало чуть проще. Но не все моменты сходу очевидны: например, в vCard в качестве опции должен передаваться исключительно обычный string, хотя в других местах (JID’ы и тому подобное) используется unicode. В общем, надо активно читать опции и типы данных для используемой библиотеки – и хорошо, когда оно все расписано и есть, где это читать.
В-третьих (v 1.4.4), чуть упростил код для работы с подписками. Раньше иногда возникала проблема, когда на одну ленту в базу заносились 2 подписки на один JID и сообщения от ленты начинали дублироваться. Исследовал поближе код – были 2 запроса в базу, которые, фактически, дублировали друг друга (и, возможно, в каких-то случаях шли параллельно): один в треде регистрации лент (если стоит галочка – пишем в таблицу подписок данные и – ключевой момент! – отправляем запрос подписки), второй – в функции работы с подписками (проверяем, есть ли подписка, если нет – подписываемся). В итоге первый просто выкинул, оставил только запрос, а дальше уже разбор идет в функции подписок. Ну и в упомянутой функции, пока разбирался, что и как работает, понял, что 2 запроса в базу (по выборке подписчиков по ленте) просто дублируют друг друга. Один убрал.
Ну и в-четвертых (v 1.4.5), пусть и малозаметное внешне изменение – добавил больше информации о ленте исходя из данных в адаптивном режиме. В vCard в описание добавлено реальное значение времени обновления (если оно отличается от установленного при регистрации), а в статусе бота теперь пишется время следующего обновления ленты.