Pull to refresh

Как сайт может отправлять события…

Reading time6 min
Views1.5K
Давным-давно (я уже не помню когда, но давно) я собрался и запустил для себя сайт. Сначала он использовался просто как склад того, что нужно кому-то передать. Потом совершенно случайно образовалось свободное время и получилось заполнить сайт чем-то осмысленным и (надеюсь) полезным. И очень захотелось быть в курсе событий, происходящих на сайте. Самое простое решение — отсылать письма, что и было сделано. Однако через некоторое время появилось желание избавиться от писем с сайта так как поток служебной почты в течении дня превышает разумные пределы.

И тут пришла в голову мысль, что использование почты как транспорта для доставки событий сайта является просто одним из распространенных подходов, однако есть еще транспорты, который позволяют не только практически мгновенно передавать сообщения, но еще отслеживать состояние получателя и гарантировать доставку события. Одним из таких транспортов является jabber.

Немного рассуждений перед тем, как бросаться в реализацию.


Итак, на данный момент сервер мне отсылал письма, в любое время:
  1. Предложения/замечания, которые можно отправить с сайта
  2. Информацию о скачивании файлов с сайта
  3. Регулярно небольшую статистику

Не все из этих событий мне нужно было доставлять в любое время: информация о скачивании файлов с сайта мне нужна как факт того, что «вот прям сейчас кто-то берет файл с сайта», а не выгребать утром несколько писем после получения почты. Статистику вообще было бы интереснее получать по запросу (да, можно просто сделать страницу, однако такие страницы обычно превращаются в монстриков, а нужно видеть нечто типа summary). Таким образом отправка событий должна получиться такой:
  1. Предложения/замечания, которые можно отправить с сайтаотправляется всегда
  2. Информацию о скачивании файлов с сайта - отправляется только тогда, когда я в режиме on-line
  3. Регулярно небольшую статистикутогда, когда мне захотелось на нее взглянуть

Кстати, IM клиент у меня запускается автоматом и намного раньше, чем почтовый клиент т.е. события сайта я увижу быстрее.

Подготовительная работа.


Для начала я завел jabber ID, под которым будет работать мой сайт. Я не стал возиться с поддержкой сайтом запросов авторизации, все необходимые действия по добавлению контактов и авторизации я проделал вручную т.к. это всего лишь эксперимент. В дальнейшем нужно привязать зарегистрированных пользователей к контакт-листу сервера.
Вторым по важности делом был выбор библиотеки для работы с jabber протоколом. В сети нашлось достаточное количество проектов для .NET, но окончательный выбор какой-то конкретной библиотеки я еще не сделал т.к. еще продолжаю их сравнение.

Делаем из сайта jabber клиента.


Все готово к реализации и первый код, который был написан, всего лишь выполнял вход на jabber сервер и появлялся у меня в online контактах при старте сайта. Первая проблема, которая грозила остановить эксперимент: некоторые библиотеки почему-то считают, что они просто обязаны спрашивать подтверждения у пользователя. Естественно, что сайт им ничего ответить не мог, да и простого окна создавать не давал. После простой замены библиотеки для работы с протоколом я наконец-то увидел долгожданную надпись "[Server] On-Line" Тут я погорячился — эта проблема встретилась мне совершенно в другой библиотеке — библиотеке для работы с SVN, которую я тоже пристраивал к сайту.

Начинаем слать события.


Собственно вся разработка заключалась в написании метода void SendMessage(Jid to, bool alwayssend, string format, params object[] args) и расстановкой вызовов этого метода. Так же написал небольшой метод для автоответа:
  1.     protected void processMessage(Jid jid, string text)
  2.     {
  3.       string cmd      = new Regex("\\s+", RegexOptions.ECMAScript).Replace(text, " ").ToLower();
  4.       switch (cmd)
  5.       {
  6.         case "?":
  7.           SendMessage(jid, false, "Команды:\n"+
  8.                       "как дела? - текущая статистика\n"+
  9.                       "посетители? - список IP посетителей\n"+
  10.                       "страницы? - список страниц\n"+
  11.                       "откуда приходили? - список ссылающихся серверов.");
  12.           break;
  13.         case "как дела?":
  14.           SendMessage(jid, false, Collector.GetSummary());
  15.           break;
  16.         case "посетители?":
  17.           SendMessage(jid, false, Collector.GetIPs());
  18.           break;
  19.         case "страницы?":
  20.           SendMessage(jid, false, Collector.GetPages());
  21.           break;
  22.         case "откуда приходили?":
  23.           SendMessage(jid, false, Collector.GetServers());
  24.           break;
  25.       }
  26.     }
* This source code was highlighted with Source Code Highlighter.

Все, теперь я вижу, когда мой сайт работает, посылает мне нужные события и отвечает на вопросы. Вот так выглядит окно чата с моим сайтом:
image
Собственно написать автоответчик не составляет труда.

Итоги.


Использовать протокол jabber как транспорт для доставки событий сайта удобно и несложно. Сразу видно преимущество — все события можно разделить на несколько типов и привязать к наличию пользователя (в данном случае меня) на связи и (если нужно) к моему статусу (не беспокоить, занят и т.п.):
  • Важные сообщения — то, что я обязательно должен увидеть
  • События, которые представляют интерес, но когда я в off-line или мой статус говорит о моей загруженности, то их можно и не отсылать
  • Информация, отсылаемая по запросу — только тогда, когда я захотел на нее посмотреть, т.е. это вообще выглядит как командная строка :)

Сократилось число «как бы» нужных писем, которые в 99% случаев удаляются без прочтения.
Вообще оказалось, что потенциал такого решения достаточно высок. Например можно пойти дальше — кардинально изменить процесс регистрации: спрашивать только jabber ID, посылать запрос авторизации, вытаскивать начальные данные и отсылать пароль, но пока останавливает низкая распространенность использования протокола.
Реализация тестового механизма на сервере уместилась в 134 строк кода, если кому интересно — могу выложить, но этот код практически полностью взят из примеров, которые шли с библиотекой. Пока мне результаты нравятся, эксперимент продолжается. Впереди — тестирование нагрузки, плотная работа со списком контактов через сайт и еще куча идей.

Дополнение: о компонентах для работы с jabber

Первый достойный проект — Jabber .NET: так как почта и jabber для моего домена работает через Google Apps, то главный критерий — нормальная работа именно с google, подключение работа прошли без проблем. Есть некоторые недоработки, но основные функции обеспечиваются достаточно хорошо. Что меня не устроило:
  1. Наследование объектов от System.ComponentModel.Component
  2. Несколько DLL
  3. Структура проекта мне совершенно непонятна, слишком перемешаны проекты


Второй проект — agsxmpp: на данный момент использую его, но скорее всего придется отказаться из-за лицензии. Опять же с google работает нормально, библиотека посерьезней, чем первая.

Обе рассмотренные библиотеки содержат компоненты для Windows.Forms, но во-первых на них без содрагания смотреть нельзя, а во-вторых они мне на сервере ненужны.

Все остальное, что я смог найти отметалось уже на этапе изучения сайтов. Однако есть неплохие JScript проекты, может какой-нибудь из них просто-напросто портировать на C#.
Tags:
Hubs:
+87
Comments43

Articles

Change theme settings