public RosterPushHandler(ViewModel.Contacts contacts, IMapper mapper) { // handle incoming subscription requests Handle( el => el.OfType <Iq>() && el.Cast <Iq>().Query.OfType <Roster>() && el.Cast <Iq>().Type == IqType.Set, async(context, xmppXElement) => { var iq = xmppXElement.Cast <Iq>(); var roster = iq.Query.Cast <Roster>(); var rItems = roster.GetRoster(); await Observable.Start(() => { foreach (var ri in rItems) { if (ri.Subscription == Subscription.Remove) { // remove contacts.Remove(c => c.Jid == ri.Jid); } else { // add or update var contact = mapper.Map <ViewModel.Contact>(ri); contacts.AddOrReplace(contact, c => c.Jid == contact.Jid); } } } , RxApp.MainThreadScheduler); }); }
public AvatarCollectionHandler( IAvatarStorage avatarStorage, IUserAvatarStorage userAvatarStorage, ViewModel.Account account, ViewModel.Contacts contacts) { this.avatarStorage = avatarStorage; this.userAvatarStorage = userAvatarStorage; this.contacts = contacts; Handle( el => el.OfType <Message>() && el.HasDescendants <Event>() && el.HasDescendants <Metadata>(), async(context, el) => { var msg = el.Cast <Message>(); var metaData = el.Descendants <Metadata>().First(); if (metaData.Info != null) { var id = metaData.Info.Id; var from = msg.From.Bare; if (!avatarStorage.HasAvatar(id)) { await RequestAvatar(from, id); } if (contacts.Contains(from)) { // avatar of a contact contacts[from].AvatarBytes = avatarStorage.GetAvatar(id)?.ImageBytes; } else if (account.XmppId == from) { //our own avatar account.AvatarBytes = avatarStorage.GetAvatar(id)?.ImageBytes; } } }); }