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);
            });
        }
예제 #2
0
        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;
                    }
                }
            });
        }