get_iq_namespace/1, iq_query_info/1,
iq_query_or_response_info/1, is_iq_request_type/1,
iq_to_xml/1, parse_xdata_submit/1,
+ is_standalone_chat_state/1,
add_delay_info/3, add_delay_info/4,
timestamp_to_iso/1, timestamp_to_iso/2,
now_to_utc_string/1, now_to_local_string/1,
children = [{xmlcdata, i2l(Count)}]}
| Arr].
+-spec is_standalone_chat_state(xmlel()) -> boolean().
+
+is_standalone_chat_state(#xmlel{name = <<"message">>} = El) ->
+ ChatStates = [<<"active">>, <<"inactive">>, <<"gone">>, <<"composing">>,
+ <<"paused">>],
+ Stripped =
+ lists:foldl(fun(ChatState, AccEl) ->
+ xml:remove_subtags(AccEl, ChatState,
+ {<<"xmlns">>, ?NS_CHATSTATES})
+ end, El, ChatStates),
+ case Stripped of
+ #xmlel{children = [#xmlel{name = <<"thread">>}]} ->
+ true;
+ #xmlel{children = []} ->
+ true;
+ _ ->
+ false
+ end;
+is_standalone_chat_state(_El) -> false.
+
-spec add_delay_info(xmlel(), jid() | ljid() | binary(), erlang:timestamp())
-> xmlel().
filter_presence(Action, _Stanza) -> Action.
filter_chat_states(_Action, #xmlel{name = <<"message">>} = Stanza) ->
- %% All XEP-0085 chat states except for <gone/>:
- ChatStates = [<<"active">>, <<"inactive">>, <<"composing">>, <<"paused">>],
- Stripped =
- lists:foldl(fun(ChatState, AccStanza) ->
- xml:remove_subtags(AccStanza, ChatState,
- {<<"xmlns">>, ?NS_CHATSTATES})
- end, Stanza, ChatStates),
- case Stripped of
- #xmlel{children = [#xmlel{name = <<"thread">>}]} ->
+ case jlib:is_standalone_chat_state(Stanza) of
+ true ->
?DEBUG("Got standalone chat state notification", []),
{stop, drop};
- #xmlel{children = []} ->
- ?DEBUG("Got standalone chat state notification", []),
- {stop, drop};
- _ ->
- ?DEBUG("Got message with chat state notification", []),
+ false ->
+ ?DEBUG("Got message stanza", []),
{stop, send}
end;
filter_chat_states(Action, _Stanza) -> Action.
and (Type /= <<"headline">>) ->
case gen_mod:get_module_opt(
LServer, ?MODULE, store_empty_body,
- fun(V) when is_boolean(V) -> V end,
- true) of
+ fun(V) when is_boolean(V) -> V;
+ (unless_chat_state) -> unless_chat_state
+ end,
+ unless_chat_state) of
false ->
xml:get_subtag(Packet, <<"body">>) /= false;
+ unless_chat_state ->
+ not jlib:is_standalone_chat_state(Packet);
true ->
true
end;
fun (A) -> A end;
mod_opt_type(db_type) -> fun gen_mod:v_db/1;
mod_opt_type(store_empty_body) ->
- fun (V) when is_boolean(V) -> V end;
+ fun (V) when is_boolean(V) -> V;
+ (unless_chat_state) -> unless_chat_state
+ end;
mod_opt_type(_) ->
[access_max_user_messages, db_type, store_empty_body].