Esempio n. 1
0
        /// <summary>
        /// ストリームエレメントを処理します。
        /// </summary>
        /// <param name="info">ストリームエレメントを受信したアカウント</param>
        /// <param name="elem">ストリームエレメント</param>
        private static void RegisterStreamElement(AccountInfo info, StreamingEvent elem)
        {
            switch (elem.Kind)
            {
                case ElementKind.Status:
                case ElementKind.DirectMessage:
                    // 通常ステータスを受信した
                    TweetStorage.Register(elem.Status);
                    break;
                case ElementKind.Favorite:
                    var avm = TweetStorage.Register(elem.Status);
                    if (avm == null) return;
                    var uavm = UserStorage.Get(elem.SourceUser);
                    if (avm.RegisterFavored(uavm))
                        EventStorage.OnFavored(avm, uavm);
                    break;
                case ElementKind.Unfavorite:
                    var rvm = TweetStorage.Register(elem.Status);
                    if (rvm == null) return;
                    var urvm = UserStorage.Get(elem.SourceUser);
                    if (rvm.RemoveFavored(urvm))
                        EventStorage.OnUnfavored(rvm, urvm);
                    break;
                case ElementKind.Delete:
                    TweetStorage.Remove(elem.DeletedStatusId);
                    break;
                    /*
                     * TODO:Implements later?
                case ElementKind.ListUpdated:
                    break;
                case ElementKind.ListMemberAdded:
                    if (ListStorage.IsListMemberCached(elem.TargetList.User.ScreenName, elem.TargetList.Name))
                    {
                        var members = ListStorage.GetListMembers(elem.TargetList.User.ScreenName, elem.TargetList.Name);
                    }
                    break;

                case ElementKind.ListMemberRemoved:
                case ElementKind.ListSubscribed:
                case ElementKind.ListUnsubscribed:
                    // TODO: do something

                    break;
                    */
                case ElementKind.Follow:
                case ElementKind.Unfollow:
                    var affect = AccountStorage.Get(elem.SourceUser.ScreenName);
                    var effect = AccountStorage.Get(elem.TargetUser.ScreenName);
                    if (affect != null)
                    {
                        // Add/Remove followings
                        if (elem.Kind == ElementKind.Follow)
                            affect.RegisterFollowing(elem.TargetUser.NumericId);
                        else
                            affect.RemoveFollowing(elem.TargetUser.NumericId);
                    }
                    if (effect != null)
                    {
                        // Add/Remove followers
                        if (elem.Kind == ElementKind.Follow)
                            effect.RegisterFollower(elem.SourceUser.NumericId);
                        else
                            effect.RemoveFollower(elem.SourceUser.NumericId);
                    }
                    if (elem.Kind == ElementKind.Follow)
                        EventStorage.OnFollowed(UserStorage.Get(elem.SourceUser), UserStorage.Get(elem.TargetUser));
                    else
                        EventStorage.OnRemoved(UserStorage.Get(elem.SourceUser), UserStorage.Get(elem.TargetUser));
                    break;
                case ElementKind.Blocked:
                    if (info == null) break;
                    info.RemoveFollowing(elem.TargetUser.NumericId);
                    info.RemoveFollower(elem.TargetUser.NumericId);
                    info.RegisterBlocking(elem.TargetUser.NumericId);
                    // TODO: notify events
                    break;
                case ElementKind.Unblocked:
                    if (info == null) break;
                    info.RemoveBlocking(elem.TargetUser.NumericId);
                    // TODO: Notify events
                    break;
                default:
                    System.Diagnostics.Debug.WriteLine("unknown:" + elem.ToString());
                    break;
            }
        }