aboutsummaryrefslogtreecommitdiff
path: root/src/mod_muc/mod_muc.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_muc/mod_muc.erl')
-rw-r--r--src/mod_muc/mod_muc.erl55
1 files changed, 44 insertions, 11 deletions
diff --git a/src/mod_muc/mod_muc.erl b/src/mod_muc/mod_muc.erl
index b94a948da..b943e739a 100644
--- a/src/mod_muc/mod_muc.erl
+++ b/src/mod_muc/mod_muc.erl
@@ -18,7 +18,8 @@
room_destroyed/1,
store_room/2,
restore_room/1,
- forget_room/1]).
+ forget_room/1,
+ process_iq_disco_items/5]).
-include("ejabberd.hrl").
-include("jlib.hrl").
@@ -76,10 +77,14 @@ do_route(Host, From, To, Packet) ->
Res = {iq, ID, result, XMLNS,
[{xmlelement, "query",
[{"xmlns", XMLNS}],
- iq_disco()}]},
+ iq_disco_info()}]},
ejabberd_router:route(To,
From,
jlib:iq_to_xml(Res));
+ {iq, ID, get, ?NS_DISCO_ITEMS = XMLNS, SubEl} ->
+ spawn(?MODULE,
+ process_iq_disco_items,
+ [Host, From, To, ID, SubEl]);
_ ->
Err = jlib:make_error_reply(
Packet, ?ERR_SERVICE_UNAVAILABLE),
@@ -130,15 +135,6 @@ stop() ->
ok.
-iq_disco() ->
- [{xmlelement, "identity",
- [{"category", "conference"},
- {"type", "text"},
- {"name", "ejabberd/mod_muc"}], []},
- {xmlelement, "feature",
- [{"var", ?NS_MUC}], []}].
-
-
store_room(Name, Opts) ->
F = fun() ->
mnesia:write(#muc_room{name = Name,
@@ -180,3 +176,40 @@ load_permanent_rooms(Host) ->
end, Rs)
end.
+
+iq_disco_info() ->
+ [{xmlelement, "identity",
+ [{"category", "conference"},
+ {"type", "text"},
+ {"name", "ejabberd/mod_muc"}], []},
+ {xmlelement, "feature",
+ [{"var", ?NS_MUC}], []}].
+
+
+process_iq_disco_items(Host, From, To, ID, SubEl) ->
+ Res = {iq, ID, result, ?NS_DISCO_ITEMS,
+ [{xmlelement, "query",
+ [{"xmlns", ?NS_DISCO_ITEMS}],
+ iq_disco_items(Host, From)}]},
+ ejabberd_router:route(To,
+ From,
+ jlib:iq_to_xml(Res)).
+
+% TODO: ask more info from room processes
+iq_disco_items(Host, From) ->
+ lists:zf(fun(#muc_online_room{name = Name, pid = Pid}) ->
+ case catch gen_fsm:sync_send_all_state_event(
+ Pid, get_disco_item, 100) of
+ {'EXIT', _} ->
+ false;
+ {item, Desc} ->
+ {true,
+ {xmlelement, "item",
+ [{"jid", jlib:jid_to_string({Name, Host, ""})},
+ {"name", Desc}], []}}
+ end
+ end, ets:tab2list(muc_online_room)).
+
+
+
+