-spec get_room_disco_item({binary(), binary(), pid()},
term()) -> {ok, disco_item()} |
{error, timeout | notfound}.
-get_room_disco_item({Name, Host, Pid}, Query) ->
- RoomJID = jid:make(Name, Host),
- try p1_fsm:sync_send_all_state_event(Pid, Query, 100) of
- {item, Desc} ->
- {ok, #disco_item{jid = RoomJID, name = Desc}};
- false ->
- {error, notfound}
- catch _:{timeout, {p1_fsm, _, _}} ->
- {error, timeout};
- _:{_, {p1_fsm, _, _}} ->
- {error, notfound}
+get_room_disco_item({Name, Host, Pid},
+ {get_disco_item, Filter, JID, Lang}) ->
+ RoomJID = jid:make(Name, Host),
+ Timeout = 100,
+ Time = erlang:monotonic_time(millisecond),
+ Query1 = {get_disco_item, Filter, JID, Lang, Time+Timeout},
+ try p1_fsm:sync_send_all_state_event(Pid, Query1, Timeout) of
+ {item, Desc} ->
+ {ok, #disco_item{jid = RoomJID, name = Desc}};
+ false ->
+ {error, notfound}
+ catch _:{timeout, {p1_fsm, _, _}} ->
+ {error, timeout};
+ _:{_, {p1_fsm, _, _}} ->
+ {error, notfound}
end.
-spec get_subscribed_rooms(binary(), jid()) -> {ok, [{jid(), [binary()]}]} | {error, any()}.
handle_event(_Event, StateName, StateData) ->
{next_state, StateName, StateData}.
-handle_sync_event({get_disco_item, Filter, JID, Lang}, _From, StateName, StateData) ->
+handle_sync_event({get_disco_item, Filter, JID, Lang, Time}, _From, StateName, StateData) ->
Len = maps:size(StateData#state.nicks),
Reply = case (Filter == all) or (Filter == Len) or ((Filter /= 0) and (Len /= 0)) of
true ->
false ->
false
end,
- {reply, Reply, StateName, StateData};
-%% This clause is only for backwards compatibility
+ CurrentTime = erlang:monotonic_time(millisecond),
+ if CurrentTime < Time ->
+ {reply, Reply, StateName, StateData};
+ true ->
+ {next_state, StateName, StateData}
+ end;
+%% These two clauses are only for backward compatibility with nodes running old code
handle_sync_event({get_disco_item, JID, Lang}, From, StateName, StateData) ->
handle_sync_event({get_disco_item, any, JID, Lang}, From, StateName, StateData);
+handle_sync_event({get_disco_item, Filter, JID, Lang}, From, StateName, StateData) ->
+ handle_sync_event({get_disco_item, Filter, JID, Lang, infinity}, From, StateName, StateData);
handle_sync_event(get_config, _From, StateName,
StateData) ->
{reply, {ok, StateData#state.config}, StateName,