Как фильтровать сообщения в Ejabberd
У меня есть Ejabberd и работает с тестовыми пользователями, и он работает нормально. Я хочу написать модуль, который может перехватывать сообщения и изменять их следующим образом:
- перехватить сообщения "
- отправить их в php файл
- получить результат из одного и того же файла php (немедленный)
- Измените строфу сообщения и отправьте его по проводнику получателю
Документация ejabberd слаба, а учебники отсутствуют. Можете ли вы дать мне пример кода, который делает это. Затем я могу понять, как настроить его для моих нужд.
Спасибо за комплект!
Адиль
Ответы
Ответ 1
Вот базовый пример такого модуля:
-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
так, как вы хотите, и верните соответствующим образом модифицированный пакет.
Ответ 2
Пример gleber отличный. Я также написал более сложный пример обработки пакетов, который я построил для Chesspark, называемого
mod_sunshine.
Как отправить эти XML-данные в php (через? xml =) и получить полученный XML файл, а затем передать его получателю?
Если у вас есть последняя версия ejabberd, которая использует exmpp, вы можете использовать exmpp_xml: node_to_binary/1 или exmpp_xml: node_to_list/1, чтобы включить внутреннее представление XML в двоичный файл или строку соответственно.
В старшем ejabberd были аналогично названные функции, но внутри xml-модуля.
Ответ 3
Похоже, что вы хотите создать серверный компонент XMPP. На этом посту уже было сказано много вещей Какой сервер XMPP должен экспериментировать с разработкой серверного компонента.
Я могу связать вам несколько полезных ссылок:
Решение Gleber действительно ориентировано на "ejabberd" (конечно, самый простой в вашем случае), тогда как это можно масштабировать с другими серверами XMPP.
Ответ 4
Существует интерфейс:
ejabberd_router:register_route(MyHost)
который я использовал в прошлом и хорошо работает. После регистрации MyHost
с помощью ejabberd модуль получит сообщения, предназначенные для сообщений MyHost
через info
(при условии gen_server
).
Как отмечено @gleber, не забудьте добавить свой модуль в файл конфигурации.