Как фильтровать сообщения в Ejabberd - PullRequest
13 голосов
/ 21 декабря 2009

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

  1. перехватывать "сообщения"
  2. отправить их в php файл
  3. получить результат из того же php-файла (немедленно)
  4. Измените раздел сообщения и отправьте его получателю

Документация ejabberd слаба, а учебники отсутствуют. Можете ли вы дать мне пример кода, который делает это? Затем я могу понять, как настроить его для своих нужд.

Спасибо за связку!

Адиль

Ответы [ 4 ]

14 голосов
/ 21 декабря 2009

Вот базовый пример такого модуля:

-module(packet_interceptor).
-behaviour(gen_mod).

-export([start/2,
         stop/1]).

-export([on_filter_packet/1]).


start(Host, _Opts) ->
    ejabberd_hooks:add(filter_packet, global, ?MODULE, on_filter_packet, 0).

on_filter_packet({From, To, XML} = Packet) ->
    %% does something with a packet
    %% should return modified Packet or atom `drop` to drop the packet
    Packet.

И обязательно добавьте этот модуль в конфигурацию ejabberd в раздел module:

{modules,
 [...
  ...
  ...
  {packet_interceptor, []}
 ]}.

Просто расширьте on_filter_packet/1 так, как вы хотите, и верните соответствующим образом измененный пакет.

1 голос
/ 22 декабря 2009

Глебер пример отличный. Я также написал более сложный пример манипулирования пакетами, который я создал для Chesspark, под названием mod_sunshine .

Как можно отправить эти данные XML на php (через? Xml =), получить полученный XML-файл и затем передать его получателю?

Если у вас есть последняя версия ejabberd, использующая exmpp, вы можете использовать exmpp_xml: node_to_binary / 1 или exmpp_xml: node_to_list / 1, чтобы преобразовать внутреннее представление XML в двоичный файл или строку соответственно.

В более старом ejabberd были функции с аналогичными именами, но внутри модуля xml.

0 голосов
/ 21 декабря 2009

Есть интерфейс:

ejabberd_router:register_route(MyHost)

, который я использовал в прошлом и хорошо работает. После регистрации MyHost в ejabberd модуль получит сообщения, предназначенные для сообщений MyHost через info (при условии gen_server).

Как отмечает @gleber, не забудьте добавить свой модуль в файл конфигурации.

0 голосов
/ 21 декабря 2009

Похоже, что вы хотите создать серверный компонент XMPP. На этом посту уже было сказано много вещей Какой XMPP-сервер должен экспериментировать при разработке серверного компонента .

Я могу дать вам несколько полезных ссылок:

Решение Gleber действительно ориентировано на ejabberd (безусловно, самое простое в вашем случае), тогда как это решение может масштабироваться с другими серверами XMPP.

...