24
1
mirror of https://github.com/processone/ejabberd.git synced 2024-06-16 22:05:29 +02:00

Include original timestamp on delayed presences (thanks to Mickael Remond)(EJAB-234)

SVN Revision: 2348
This commit is contained in:
Badlop 2009-06-30 17:50:47 +00:00
parent 49688feaf2
commit 29ea2738cc
3 changed files with 22 additions and 11 deletions

View File

@ -1441,7 +1441,13 @@ process_presence_probe(From, To, StateData) ->
andalso ?SETS:is_element(LFrom, StateData#state.pres_a), andalso ?SETS:is_element(LFrom, StateData#state.pres_a),
if if
Cond1 -> Cond1 ->
Packet = StateData#state.pres_last, Timestamp = StateData#state.pres_timestamp,
Packet = xml:append_subtags(
StateData#state.pres_last,
%% To is the one sending the presence (the target of the probe)
[jlib:timestamp_to_xml(Timestamp, utc, To, ""),
%% TODO: Delete the next line once XEP-0091 is Obsolete
jlib:timestamp_to_xml(Timestamp)]),
case ejabberd_hooks:run_fold( case ejabberd_hooks:run_fold(
privacy_check_packet, StateData#state.server, privacy_check_packet, StateData#state.server,
allow, allow,
@ -1495,6 +1501,7 @@ presence_update(From, Packet, StateData) ->
presence_broadcast(StateData, From, StateData#state.pres_a, Packet), presence_broadcast(StateData, From, StateData#state.pres_a, Packet),
presence_broadcast(StateData, From, StateData#state.pres_i, Packet), presence_broadcast(StateData, From, StateData#state.pres_i, Packet),
StateData#state{pres_last = undefined, StateData#state{pres_last = undefined,
pres_timestamp = undefined,
pres_a = ?SETS:new(), pres_a = ?SETS:new(),
pres_i = ?SETS:new(), pres_i = ?SETS:new(),
pres_invis = false}; pres_invis = false};
@ -1511,6 +1518,7 @@ presence_update(From, Packet, StateData) ->
StateData#state.pres_i, StateData#state.pres_i,
Packet), Packet),
S1 = StateData#state{pres_last = undefined, S1 = StateData#state{pres_last = undefined,
pres_timestamp = undefined,
pres_a = ?SETS:new(), pres_a = ?SETS:new(),
pres_i = ?SETS:new(), pres_i = ?SETS:new(),
pres_invis = true}, pres_invis = true},
@ -1539,6 +1547,7 @@ presence_update(From, Packet, StateData) ->
get_priority_from_presence(OldPresence) get_priority_from_presence(OldPresence)
end, end,
NewPriority = get_priority_from_presence(Packet), NewPriority = get_priority_from_presence(Packet),
Timestamp = calendar:now_to_universal_time(now()),
update_priority(NewPriority, Packet, StateData), update_priority(NewPriority, Packet, StateData),
FromUnavail = (StateData#state.pres_last == undefined) or FromUnavail = (StateData#state.pres_last == undefined) or
StateData#state.pres_invis, StateData#state.pres_invis,
@ -1557,7 +1566,8 @@ presence_update(From, Packet, StateData) ->
end, end,
presence_broadcast_first( presence_broadcast_first(
From, StateData#state{pres_last = Packet, From, StateData#state{pres_last = Packet,
pres_invis = false pres_invis = false,
pres_timestamp = Timestamp
}, Packet); }, Packet);
true -> true ->
presence_broadcast_to_trusted(StateData, presence_broadcast_to_trusted(StateData,
@ -1571,7 +1581,8 @@ presence_update(From, Packet, StateData) ->
ok ok
end, end,
StateData#state{pres_last = Packet, StateData#state{pres_last = Packet,
pres_invis = false pres_invis = false,
pres_timestamp = Timestamp
} }
end, end,
NewState NewState

View File

@ -1827,7 +1827,7 @@ send_new_presence(NJID, Reason, StateData) ->
false -> false ->
[] []
end, end,
Packet = append_subtags( Packet = xml:append_subtags(
Presence, Presence,
[{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}], [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}],
[{xmlelement, "item", ItemAttrs, ItemEls} | Status]}]), [{xmlelement, "item", ItemAttrs, ItemEls} | Status]}]),
@ -1868,7 +1868,7 @@ send_existing_presences(ToJID, StateData) ->
affiliation_to_list(FromAffiliation)}, affiliation_to_list(FromAffiliation)},
{"role", role_to_list(FromRole)}] {"role", role_to_list(FromRole)}]
end, end,
Packet = append_subtags( Packet = xml:append_subtags(
Presence, Presence,
[{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}], [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}],
[{xmlelement, "item", ItemAttrs, []}]}]), [{xmlelement, "item", ItemAttrs, []}]}]),
@ -1881,10 +1881,6 @@ send_existing_presences(ToJID, StateData) ->
end, ?DICT:to_list(StateData#state.users)). end, ?DICT:to_list(StateData#state.users)).
append_subtags({xmlelement, Name, Attrs, SubTags1}, SubTags2) ->
{xmlelement, Name, Attrs, SubTags1 ++ SubTags2}.
now_to_usec({MSec, Sec, USec}) -> now_to_usec({MSec, Sec, USec}) ->
(MSec*1000000 + Sec)*1000000 + USec. (MSec*1000000 + Sec)*1000000 + USec.
@ -1944,7 +1940,7 @@ send_nick_changing(JID, OldNick, StateData) ->
[{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}], [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}],
[{xmlelement, "item", ItemAttrs1, []}, [{xmlelement, "item", ItemAttrs1, []},
{xmlelement, "status", [{"code", "303"}], []}]}]}, {xmlelement, "status", [{"code", "303"}], []}]}]},
Packet2 = append_subtags( Packet2 = xml:append_subtags(
Presence, Presence,
[{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}], [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}],
[{xmlelement, "item", ItemAttrs2, []}]}]), [{xmlelement, "item", ItemAttrs2, []}]}]),
@ -2004,7 +2000,7 @@ add_message_to_history(FromNick, FromJID, Packet, StateData) ->
true -> StateData#state.jid; true -> StateData#state.jid;
false -> FromJID false -> FromJID
end, end,
TSPacket = append_subtags(Packet, TSPacket = xml:append_subtags(Packet,
[jlib:timestamp_to_xml(TimeStamp, utc, SenderJid, ""), [jlib:timestamp_to_xml(TimeStamp, utc, SenderJid, ""),
%% TODO: Delete the next line once XEP-0091 is Obsolete %% TODO: Delete the next line once XEP-0091 is Obsolete
jlib:timestamp_to_xml(TimeStamp)]), jlib:timestamp_to_xml(TimeStamp)]),

View File

@ -34,6 +34,7 @@
get_attr/2, get_attr_s/2, get_attr/2, get_attr_s/2,
get_tag_attr/2, get_tag_attr_s/2, get_tag_attr/2, get_tag_attr_s/2,
get_subtag/2, get_subtag_cdata/2, get_subtag/2, get_subtag_cdata/2,
append_subtags/2,
get_path_s/2, get_path_s/2,
replace_tag_attr/3]). replace_tag_attr/3]).
@ -219,6 +220,9 @@ get_subtag_cdata(Tag, Name) ->
get_tag_cdata(Subtag) get_tag_cdata(Subtag)
end. end.
append_subtags({xmlelement, Name, Attrs, SubTags1}, SubTags2) ->
{xmlelement, Name, Attrs, SubTags1 ++ SubTags2}.
get_path_s(El, []) -> get_path_s(El, []) ->
El; El;
get_path_s(El, [{elem, Name} | Path]) -> get_path_s(El, [{elem, Name} | Path]) ->