summaryrefslogtreecommitdiff
path: root/src/mod_muc
diff options
context:
space:
mode:
authorAlexey Shchepin <alexey@process-one.net>2003-03-27 14:06:17 +0000
committerAlexey Shchepin <alexey@process-one.net>2003-03-27 14:06:17 +0000
commit0b865c3dc454eb4915e453ca6f258ab1d8f9055b (patch)
tree3d302b735cedb4e1372b2c6080040921ea9ee004 /src/mod_muc
parent* src/mod_muc/: Support for discovering service and more (diff)
* src/mod_muc/: Small fixes in discovering
SVN Revision: 93
Diffstat (limited to 'src/mod_muc')
-rw-r--r--src/mod_muc/mod_muc.erl6
-rw-r--r--src/mod_muc/mod_muc_room.erl65
2 files changed, 65 insertions, 6 deletions
diff --git a/src/mod_muc/mod_muc.erl b/src/mod_muc/mod_muc.erl
index b943e739..e3e39168 100644
--- a/src/mod_muc/mod_muc.erl
+++ b/src/mod_muc/mod_muc.erl
@@ -200,13 +200,13 @@ 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}], []}}
+ {"name", Desc}], []}};
+ _ ->
+ false
end
end, ets:tab2list(muc_online_room)).
diff --git a/src/mod_muc/mod_muc_room.erl b/src/mod_muc/mod_muc_room.erl
index 7f0026ad..bb03a31c 100644
--- a/src/mod_muc/mod_muc_room.erl
+++ b/src/mod_muc/mod_muc_room.erl
@@ -38,7 +38,7 @@
-record(config, {allow_change_subj = true,
allow_query_users = true,
allow_private_messages = true,
- public = true, % TODO
+ public = true,
persistent = false,
moderated = false, % TODO
members_by_default = true,
@@ -208,12 +208,19 @@ normal_state({route, From, "",
StateData) ->
case jlib:iq_query_info(Packet) of
{iq, ID, Type, XMLNS, SubEl} when
- (XMLNS == ?NS_MUC_ADMIN) or (XMLNS == ?NS_MUC_OWNER) ->
+ (XMLNS == ?NS_MUC_ADMIN) or
+ (XMLNS == ?NS_MUC_OWNER) or
+ (XMLNS == ?NS_DISCO_INFO) or
+ (XMLNS == ?NS_DISCO_ITEMS) ->
Res1 = case XMLNS of
?NS_MUC_ADMIN ->
process_iq_admin(From, Type, SubEl, StateData);
?NS_MUC_OWNER ->
- process_iq_owner(From, Type, SubEl, StateData)
+ process_iq_owner(From, Type, SubEl, StateData);
+ ?NS_DISCO_INFO ->
+ process_iq_disco_info(From, Type, StateData);
+ ?NS_DISCO_ITEMS ->
+ process_iq_disco_items(From, Type, StateData)
end,
{IQRes, NewStateData} =
case Res1 of
@@ -1521,3 +1528,55 @@ make_opts(StateData) ->
].
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Disco
+
+process_iq_disco_info(From, set, StateData) ->
+ {error, ?ERR_NOT_ALLOWED};
+
+process_iq_disco_info(From, get, StateData) ->
+ FAffiliation = get_affiliation(From, StateData),
+ FRole = get_role(From, StateData),
+ case (FRole /= none) or
+ (FAffiliation == admin) or
+ (FAffiliation == owner) of
+ true ->
+ {result, [{xmlelement, "identity",
+ [{"category", "conference"},
+ {"type", "text"},
+ {"name", StateData#state.room}], []},
+ {xmlelement, "feature",
+ [{"var", ?NS_MUC}], []}], StateData};
+ _ ->
+ {error, ?ERR_NOT_ALLOWED}
+ end.
+
+
+process_iq_disco_items(From, set, StateData) ->
+ {error, ?ERR_NOT_ALLOWED};
+
+process_iq_disco_items(From, get, StateData) ->
+ FAffiliation = get_affiliation(From, StateData),
+ FRole = get_role(From, StateData),
+ case (FRole /= none) or
+ (FAffiliation == admin) or
+ (FAffiliation == owner) of
+ true ->
+ UList =
+ lists:map(
+ fun({LJID, Info}) ->
+ Nick = Info#user.nick,
+ {xmlelement, "item",
+ [{"jid", jlib:jid_to_string(
+ {StateData#state.room,
+ StateData#state.host,
+ Nick})},
+ {"name", Nick}], []}
+ end,
+ ?DICT:to_list(StateData#state.users)),
+ {result, UList, StateData};
+ _ ->
+ {error, ?ERR_NOT_ALLOWED}
+ end.
+
+