diff --git a/apps/roster/src/roster.erl b/apps/roster/src/roster.erl index 9e986471be65bd1e8de48e14c9f2000c77734572..e6239977a1ae656701892ab5063856afffb49cf4 100644 --- a/apps/roster/src/roster.erl +++ b/apps/roster/src/roster.erl @@ -1095,14 +1095,20 @@ sort_readers(Room) -> readmsgs(#'Contact'{phone_id = R}=C, LocR) -> C#'Contact'{reader = p2p_readmsgs(LocR, R)}; readmsgs(M, _) -> M. -p2p_readmsgs(R, R) -> [contact_readmsg(R,R), contact_readmsg(R,R)]; +p2p_readmsgs(LocR, C = #'Contact'{ phone_id = PhoneId }) -> + [contact_readmsg(LocR, PhoneId), contact_readmsg(C)]; p2p_readmsgs(LocR, R) -> [contact_readmsg(LocR, R), contact_readmsg(R, LocR)]. + +contact_readmsg(#'Contact'{ reader = ReaderId }) when ReaderId /= [] -> + reader_cache(ReaderId); +contact_readmsg(_) -> + 0. + contact_readmsg(#'Roster'{id = LocalId, phone = Phone}, #'Roster'{} = R) -> contact_readmsg(roster:phone_id(LocalId, Phone), R); contact_readmsg(LocalPhoneId, #'Roster'{userlist = Contacts}) -> - case lists:keyfind(LocalPhoneId, #'Contact'.phone_id, Contacts) of - #'Contact'{reader = ReaderId} when ReaderId /= []-> reader_cache(ReaderId); _ -> 0 end; + contact_readmsg(lists:keyfind(LocalPhoneId, #'Contact'.phone_id, Contacts)); contact_readmsg(LocalPhoneId, PhoneId) -> case kvs:get('Roster', roster_id(PhoneId)) of {ok, #'Roster'{} = R}-> contact_readmsg(LocalPhoneId, R); @@ -1315,48 +1321,40 @@ set_explicit_removed([], RoomId, RoomName) -> set_explicit_removed(Room, _, _) -> Room. - userlist(R) -> hd(split_objlist(#'Roster'.userlist, R)). user(Roster, C) -> user(Roster, C, 0). user(RosterId, UserId, LastSync) -> user(RosterId, UserId, [], LastSync). -user(#'Roster'{ - id = Id, - phone = Phone - }, - #'Contact'{ - phone_id = PhoneId, - reader = Reader - } = C, - W, - _LastSync) +user(#'Roster'{ id = Id, phone = Phone } = Roster, + #'Contact'{ phone_id = PhoneId, reader = Reader } = C, + W, _LastSync) when is_record(W, writer); is_record(W, p2p); W == [] -> - Writer = case W of + LocalPhoneId = phone_id(Phone, Id), + Writer = case W of [] -> - kvs_stream:load_writer(feed(C, phone_id(Phone, Id))); + kvs_stream:load_writer(feed(C, LocalPhoneId)); _ -> - W + W end, - Local = phone_id(Phone, Id), - {Unread, LastMsg, _} = unread_msg(Writer, Reader, Local), + {Unread, LastMsg, _} = unread_msg(Writer, Reader, LocalPhoneId), {Presence, Update} = is_online2(PhoneId), - Msgs = case catch p2p_readmsgs(Local, PhoneId) of + Msgs = case catch p2p_readmsgs(Roster, C) of {'EXIT', {Err, _}} -> n2o:error(?MODULE,"Catch:~p~n",[n2o:stack_trace(error, Err)]), - throw({error, {user, Local, PhoneId}}); - Ms -> Ms + throw({error, {user, LocalPhoneId, PhoneId}}); + Ms -> Ms end, C#'Contact'{ presence = Presence, - update = Update, + update = Update, services = get_services(phone(PhoneId)), - unread = Unread, + unread = Unread, last_msg = LastMsg, - reader = Msgs + reader = Msgs }; user(#'Roster'{id = RosterId, userlist = Users, phone = Phone}=R, UserId, W, LastSync) -> case lists:keyfind(UserId, #'Contact'.phone_id, Users) of