mirror of
https://github.com/processone/ejabberd.git
synced 2024-06-20 22:22:09 +02:00
82 lines
2.5 KiB
Erlang
82 lines
2.5 KiB
Erlang
![]() |
%%%-------------------------------------------------------------------
|
||
|
%%% @author Evgeny Khramtsov <ekhramtsov@process-one.net>
|
||
|
%%% @copyright (C) 2016, Evgeny Khramtsov
|
||
|
%%% @doc
|
||
|
%%%
|
||
|
%%% @end
|
||
|
%%% Created : 12 Jul 2016 by Evgeny Khramtsov <ekhramtsov@process-one.net>
|
||
|
%%%-------------------------------------------------------------------
|
||
|
-module(xmpp_util).
|
||
|
|
||
|
%% API
|
||
|
-export([add_delay_info/3, add_delay_info/4, unwrap_carbon/1,
|
||
|
is_standalone_chat_state/1]).
|
||
|
|
||
|
-include("xmpp.hrl").
|
||
|
|
||
|
%%%===================================================================
|
||
|
%%% API
|
||
|
%%%===================================================================
|
||
|
-spec add_delay_info(stanza(), jid(), erlang:timestamp()) -> stanza().
|
||
|
add_delay_info(Stz, From, Time) ->
|
||
|
add_delay_info(Stz, From, Time, <<"">>).
|
||
|
|
||
|
-spec add_delay_info(stanza(), jid(),
|
||
|
erlang:timestamp(), binary()) -> stanza().
|
||
|
|
||
|
add_delay_info(Stz, From, Time, Desc) ->
|
||
|
case xmpp:get_subtag(Stz, #delay{}) of
|
||
|
#delay{from = OldFrom, desc = OldDesc} = Delay ->
|
||
|
case jid:tolower(From) == jid:tolower(OldFrom) of
|
||
|
true when Desc == <<"">> ->
|
||
|
Stz;
|
||
|
true when OldDesc == <<"">> ->
|
||
|
xmpp:set_subtag(Stz, Delay#delay{desc = Desc});
|
||
|
true ->
|
||
|
case binary:match(OldDesc, Desc) of
|
||
|
nomatch ->
|
||
|
NewDesc = <<OldDesc/binary, ", ", Desc/binary>>,
|
||
|
xmpp:set_subtag(Stz, Delay#delay{desc = NewDesc});
|
||
|
_ ->
|
||
|
Stz
|
||
|
end;
|
||
|
false ->
|
||
|
NewDelay = #delay{stamp = Time, from = From, desc = Desc},
|
||
|
xmpp:set_subtag(Stz, NewDelay)
|
||
|
end;
|
||
|
false ->
|
||
|
Delay = #delay{stamp = Time, from = From, desc = Desc},
|
||
|
xmpp:set_subtag(Stz, Delay)
|
||
|
end.
|
||
|
|
||
|
-spec unwrap_carbon(stanza()) -> xmpp_element().
|
||
|
unwrap_carbon(#message{} = Msg) ->
|
||
|
case xmpp:get_subtag(Msg, #carbons_sent{}) of
|
||
|
#carbons_sent{forwarded = #forwarded{sub_els = [El]}} ->
|
||
|
El;
|
||
|
_ ->
|
||
|
case xmpp:get_subtag(Msg, #carbons_received{}) of
|
||
|
#carbons_received{forwarded = #forwarded{sub_els = [El]}} ->
|
||
|
El;
|
||
|
_ ->
|
||
|
Msg
|
||
|
end
|
||
|
end;
|
||
|
unwrap_carbon(Stanza) -> Stanza.
|
||
|
|
||
|
-spec is_standalone_chat_state(stanza()) -> boolean().
|
||
|
is_standalone_chat_state(Stanza) ->
|
||
|
case unwrap_carbon(Stanza) of
|
||
|
#message{sub_els = Els} ->
|
||
|
IgnoreNS = [?NS_CHATSTATES, ?NS_DELAY],
|
||
|
Stripped = [El || El <- Els,
|
||
|
not lists:member(xmpp:get_ns(El), IgnoreNS)],
|
||
|
Stripped == [];
|
||
|
_ ->
|
||
|
false
|
||
|
end.
|
||
|
|
||
|
%%%===================================================================
|
||
|
%%% Internal functions
|
||
|
%%%===================================================================
|