Как отфильтровать сообщения в Ejabberd

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

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

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

Благодарит пакет!

Adil

13
задан Adil 22 December 2009 в 06:43
поделиться

4 ответа

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

-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 нужным вам способом и вернуть соответствующим образом измененный пакет.

14
ответ дан 2 December 2019 в 00:18
поделиться

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

ejabberd_router: register_route (MyHost)

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

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

0
ответ дан 2 December 2019 в 00:18
поделиться

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

Я могу связать вас с некоторыми полезными ссылками:

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

0
ответ дан 2 December 2019 в 00:18
поделиться

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

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

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

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

.
1
ответ дан 2 December 2019 в 00:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: