Как добавить пользовательские данные в тело сообщения xmpp в ejabberd

Я настроил настройку чата, используя Pidgin и Ejabberd. Я записал собственный модуль в ejabberd, используя user_send_packet:

ejabberd_hooks:add(user_send_packet, _Host, ?MODULE,
           myMessage, 95),

Функция myMessage выглядит следующим образом:

myMessage({Packet, C2SState})->


PacketType=xmpp:get_name(Packet),
case PacketType of
<<"iq">>->
ok;
<<"presence">>->
ok;
<<"message">>->

Sum=2+2,
?INFO_MSG("Sum is ~p~n",[Sum])

end,

{Packet,C2SState}.

По сути, эта функция делает то, что всякий раз, когда кто-то отправляет сообщение в чате, говорит «привет», значение Sum вычисляется и печатается на сервере и в его журналах, а сообщение «привет» отправляется второму пользователю.

Но теперь я хочу отправить значение Sum вместе с сообщением "hello there" второму пользователю, например:

"hello there Sum is 4" 

Может ли кто-нибудь помочь мне с этим?

Заранее спасибо.


person abhishek ranjan    schedule 02.08.2017    source источник


Ответы (1)


Вот:

process_message({#message{body = Body} = Msg, C2SState})->
    Sum = calc_sum_and_return_as_binary(),
    NewBody = lists:map(
        fun(#text{data = Data} = Txt) ->
            Txt#text{data = <<Data/binary, Sum/binary>>}
        end, Body),
    {Msg#message{body = NewBody}, C2SState};
process_message(Acc) ->
    Acc.

Обратите внимание, что запись #text{} содержит поле lang, которое можно использовать, если вы хотите поддерживать интернационализацию добавляемого текста.

person user2610053    schedule 03.08.2017
comment
Спасибо за ответ в первую очередь. Я использовал фрагмент кода, предоставленный вами, и заметил следующие вещи: во-первых, Sum=4 не преобразовывался в двоичный файл, поскольку Sum является переменной, затем я использовал Sum=[4], но пользователь, которому было отправлено это сообщение, закрыл соединение. и перезапустил его с сообщением Connection reset by peer. Затем я попробовал Sum=4, Sum=[4] и Sum=[4], которые были успешными и отправили сообщения как 4,4 и [4] соответственно. Затем я узнал, что в строке erlang есть не что иное, как список так что подумал, что я использовал Sum=[[4]], но это снова привело к сбросу соединения. - person abhishek ranjan; 03.08.2017
comment
Итак, я хочу спросить две вещи: (1) как я могу отправить только Sum=[4] как сообщение, которое будет получено как [4]? и (2) Необходимо ли заключать каждое отправляемое сообщение в двойные кавычки, чтобы оно было отправлено как сообщение? - person abhishek ranjan; 03.08.2017
comment
Послушайте, это простые вопросы по Erlang, вам лучше потратить пару часов на изучение простого туториала по Erlang, чтобы прояснить эти вещи. - person user2610053; 03.08.2017
comment
Проще говоря, если вы хотите добавить текст [4], вы должны сделать следующее: Sum = list_to_binary([$[, integer_to_list(2+2), $]]) - person user2610053; 03.08.2017