Skip to content

Commit

Permalink
Merge 2fdf822 into 3777093
Browse files Browse the repository at this point in the history
  • Loading branch information
arcusfelis committed Jul 18, 2018
2 parents 3777093 + 2fdf822 commit b9c3169
Show file tree
Hide file tree
Showing 4 changed files with 274 additions and 186 deletions.
8 changes: 4 additions & 4 deletions include/mod_muc_room.hrl
Expand Up @@ -75,10 +75,10 @@
access :: mod_muc:access(),
jid :: jid:jid(),
config = #config{} :: mod_muc_room:config(),
users = dict:new(),
sessions = dict:new(),
robots = dict:new(),
affiliations = dict:new(),
users = maps:new() :: map(),
sessions = maps:new() :: map(),
robots = maps:new() :: map(),
affiliations = maps:new() :: map(),
history,
subject = <<>>,
subject_author = <<>>,
Expand Down
106 changes: 73 additions & 33 deletions src/inbox/mod_inbox_muc.erl
Expand Up @@ -4,68 +4,104 @@
%%% @doc
%%%
%%% @end
%%% Created : 6.07.2018
%%% Created : 6.07.2018
%%%-------------------------------------------------------------------
-module(mod_inbox_muc).
-author("dominik.stanaszek@erlang-solutions.com").
-include("jlib.hrl").
-include("mongoose.hrl").

-export([update_inbox/5, start/1, stop/1]).
-export([update_inbox_for_muc/1, start/1, stop/1]).

%% Receiver's host in lowercase
-type receiver_host() :: jid:server().
-type receiver_bare_user_jid() :: jid:jid().
-type room_bare_jid() :: jid:jid().
-type packet() :: exml:element().

start(Host) ->
ejabberd_hooks:add(update_inbox_for_muc, Host, ?MODULE, update_inbox, 90),
% TODO check ooptions: if system messages stored ->
ejabberd_hooks:add(update_inbox_for_muc, Host, ?MODULE, update_inbox_for_muc, 90),
% TODO check ooptions: if system messages stored ->
% add hook handler for system messages on hook ie. invitation_sent
ok.

stop(Host) ->
ejabberd_hooks:delete(update_inbox_for_muc, Host, ?MODULE, update_inbox, 90),
ejabberd_hooks:delete(update_inbox_for_muc, Host, ?MODULE, update_inbox_for_muc, 90),
ok.

update_inbox(Acc, Room, {From, FromRoomJid}, AffsDict, Packet) ->
Affs = dict:to_list(AffsDict),
Users = affs_to_allowed_users(Affs),
FromBare = jid:to_bare(From),
lists:foreach(fun(User) -> update_inbox(Room,
{FromBare, FromRoomJid},
User,
Packet) end,
Users),
Acc.

affs_to_allowed_users(Users) ->
AllowedUsers = lists:filter(fun({_User, outcast}) -> false;
(_) -> true end, Users),
lists:map(fun({{User, Domain, Res}, _Aff}) -> jid:make(User, Domain, Res) end,
AllowedUsers).
-spec update_inbox_for_muc(Acc) -> Acc when
Acc :: map().
update_inbox_for_muc(
#{room_jid := Room,
from_jid := From,
from_room_jid := FromRoomJid,
packet := Packet,
affiliations_map := AffsMap} = Acc) ->
F = fun(AffLJID, Affiliation) ->
case is_allowed_affiliation(Affiliation) of
true ->
To = jid:to_bare(jid:make(AffLJID)),
%% Guess direction based on user JIDs
Direction = direction(From, To),
Host = To#jid.lserver,
Packet2 = jlib:replace_from_to(FromRoomJid, To, Packet),
update_inbox_for_user(Direction, Host, Room, To, Packet2);
false ->
ok
end
end,
mongoose_maps:maps_foreach(F, AffsMap),
Acc.

-spec is_allowed_affiliation(mod_muc:affiliation()) -> boolean().
is_allowed_affiliation(outcast) -> false;
is_allowed_affiliation(_) -> true.

update_inbox(Room, {From, FromRoomJid}, To, Packet) ->
Host = To#jid.server,
case direction(From, To) of
outgoing ->
NewPacket = jlib:replace_from_to(FromRoomJid, To, Packet),
handle_outgoing_message(Host, From, Room, NewPacket);
incoming ->
NewPacket = jlib:replace_from_to(FromRoomJid, To, Packet),
handle_incoming_message(Host, Room, To, NewPacket)
-spec update_inbox_for_user(Direction, Host, Room, To, Packet) -> term() when
Direction :: incoming | outgoing,
Host :: receiver_host(),
Room :: room_bare_jid(),
To :: receiver_bare_user_jid(),
Packet :: packet().
update_inbox_for_user(Direction, Host, Room, To, Packet) ->
%% Check that Host is a local served domain (not s2s)
case {is_local_host(Host), Direction} of
{true, outgoing} ->
handle_outgoing_message(Host, Room, To, Packet);
{true, incoming} ->
handle_incoming_message(Host, Room, To, Packet);
_ ->
ok
end.

%% From and To are user JIDs (not room JIDs)
direction(From, To) ->
case jid:are_equal(From, To) of
case jid:are_bare_equal(From, To) of
true -> outgoing;
false -> incoming
end.

handle_outgoing_message(Host, User, Room, Packet) ->
%% Sender and receiver is the same user
-spec handle_outgoing_message(Host, Room, To, Packet) -> term() when
Host :: receiver_host(),
Room :: room_bare_jid(),
To :: receiver_bare_user_jid(),
Packet :: packet().
handle_outgoing_message(Host, Room, To, Packet) ->
Markers = mod_inbox_utils:get_reset_markers(Host),
case mod_inbox_utils:if_chat_marker_get_id(Packet, Markers) of
undefined ->
mod_inbox_utils:write_to_sender_inbox(Host, User, Room, Packet);
mod_inbox_utils:write_to_sender_inbox(Host, To, Room, Packet);
Id ->
mod_inbox_utils:reset_unread_count(User, Room, Id)
mod_inbox_utils:reset_unread_count(To, Room, Id)
end.

-spec handle_incoming_message(Host, Room, To, Packet) -> term() when
Host :: receiver_host(),
Room :: room_bare_jid(),
To :: receiver_bare_user_jid(),
Packet :: packet().
handle_incoming_message(Host, Room, To, Packet) ->
Markers = mod_inbox_utils:get_reset_markers(Host),
case mod_inbox_utils:has_chat_marker(Packet, Markers) of
Expand All @@ -75,3 +111,7 @@ handle_incoming_message(Host, Room, To, Packet) ->
false ->
mod_inbox_utils:write_to_receiver_inbox(Host, Room, To, Packet)
end.

%% Returns false, if host is s2s host
is_local_host(LServer) ->
lists:member(LServer, ?MYHOSTS).

0 comments on commit b9c3169

Please sign in to comment.