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