コード例 #1
0
        public async Task <JsonResult> AddUserToObservation(string userName)
        {
            var    errors         = new List <string>();
            var    observableUser = new ObservableUser();
            string errorMessage   = "Failed to add user!";

            if ((await _repository.GetListAsync <ObservableUser>()).ToList().Count() < 4)
            {
                observableUser.InstagramPK = _instaApi.GetPrimaryKeyByUsername(userName);
                observableUser.Username    = userName;
                bool added = await _repository.CreateAsync(observableUser);

                if (!added)
                {
                    errors.Add(errorMessage);
                    throw new HttpException(errorMessage);
                }
                else
                {
                    Response.StatusCode = 200;//ok
                }
            }
            else
            {
                errors.Add(errorMessage);
                errors.Add("The maximum number of users that can be observed [3]!");
                throw new HttpException(errorMessage);
            }

            return(Json(new
            {
                observableUser = observableUser,
                Errors = errors
            }));
        }
コード例 #2
0
        public async Task RemoveUserFromObservationAsync(ApplicationUser observer, ObservableUser observable)
        {
            var observableTasks = _tasks.Where(at => at.Observer.Equals(observer) &&
                                               at.Observable.Equals(observable)).ToList();

            if (observableTasks.Count == 0) // User is not under observation yet.
            {
                return;
            }

            foreach (var aTask in observableTasks)
            {
                aTask.CancellationTokenSource.Cancel();
            }

            foreach (var aTask in observableTasks)
            {
                foreach (var task in aTask.Tasks)
                {
                    task.Wait();
                }
            }

            _tasks = _tasks.Except(observableTasks).ToList();
        }
コード例 #3
0
 private async Task StartLikesAnalizingAsync(
     ApplicationUser observer, ObservableUser observable)
 {
     foreach (var targetUser in observable.ObservableUsers)
     {
         StartLikesAnalizingAsync(observer, observable, targetUser);
     }
 }
コード例 #4
0
 private async Task StartCommentsAnalizingAsync(
     ApplicationUser observer, ObservableUser observable)
 {
     Parallel.ForEach(observable.ObservableUsers, targetUser =>
     {
         StartCommentsAnalizingAsync(observer, observable, targetUser);
     });
 }
コード例 #5
0
 private static List <User> CreateKey(
     ApplicationUser observer,
     ObservableUser observable,
     ObservableUser targetUser)
 {
     return(new List <User> {
         observer, observable, targetUser
     });
 }
コード例 #6
0
 public AnalizationTask(
     ApplicationUser observer,
     ObservableUser observable,
     ObservableUser targetUser)
 {
     Observer   = observer;
     Observable = observable;
     TargetUser = targetUser;
     Tasks      = new List <Task>();
     CancellationTokenSource = new CancellationTokenSource();
 }
コード例 #7
0
ファイル: UsersVM.cs プロジェクト: fstaniul/MyCardio
        public void SelectUserAvatar(ObservableUser observableUser)
        {
//            var fileDialog = new OpenFileDialog();
//            var result = fileDialog.ShowDialog();
//
//            if (result == true)
//            {
//                var file = fileDialog.FileName;
//                observableUser.Image = file;
//            }
            ImagePicker.PickImage(observableUser, nameof(observableUser.Image));
        }
コード例 #8
0
 public AnalizationTask(
     ApplicationUser observer,
     ObservableUser observable,
     ObservableUser targetUser,
     IEnumerable <Task> tasks,
     CancellationTokenSource cancellationTokenSource)
 {
     Observer   = observer;
     Observable = observable;
     TargetUser = targetUser;
     Tasks      = new List <Task>(tasks);
     CancellationTokenSource = cancellationTokenSource;
 }
コード例 #9
0
        public async Task <ActionResult> AddObservableUser(ObservableUserViewModel observableUser)
        {
            // The current registered user who uses our application
            string primaryKey = System.Web.HttpContext.Current.Session["PrimaryKey"].ToString();
            var    observer   = await _repository.GetAsync <ApplicationUser>(u => u.InstagramPK == primaryKey);

            // The user we are going to add to the database
            var user = new ObservableUser();

            user.Username    = observableUser.UserName;
            user.InstagramPK = _instaApi.GetPrimaryKeyByUsername(observableUser.UserName);
            user.Observers.Add(observer);

            // Checking the presence of the user we want to add to the database in the database
            var observable = await _repository.GetAsync <ObservableUser>(x => x.InstagramPK == user.InstagramPK);

            if (observable != null)
            {
                // If such a user exists, check the existence of the current user in the list of its observers
                if (observable.Observers.Contains(observer))
                {
                    // If such a observer exists, return a message about it.
                    return(RedirectToAction("Index", new { status = "repeat" }));
                }
                else
                {
                    /* If such a observer does not exist, add it to the collection of observers,
                     * update the data in the database and return a message about the successful operation.*/
                    observable.Observers.Add(observer);
                    await _repository.UpdateAsync <ObservableUser>(observable);

                    observer.ObservableAccounts.Add(observable);
                    await _repository.UpdateAsync <ApplicationUser>(observer);

                    return(RedirectToAction("Index", new { status = "success" }));
                }
            }

            // Trying to add a new observable user to the database
            if (!await _repository.CreateAsync <ObservableUser>(user))
            {
                return(RedirectToAction("Index", new { status = "bad" }));
            }

            // Update the data in the database
            observer.ObservableAccounts.Add(user);
            await _repository.UpdateAsync <ApplicationUser>(observer);

            // Return a message about the successful operation
            return(RedirectToAction("Index", new { status = "success" }));
        }
コード例 #10
0
        public async Task <ActionResult> AddObservableAccountForObservableUser(ObservableAccountForObservableUserVM observablePage)
        {
            // Receive the observable user
            var observableUser = new ObservableUser();

            observableUser = await _repository.GetAsync <ObservableUser>(x => x.Username == observablePage.observableUserName);

            // Checking the presence of the target content we want to add to the database in the database
            var page = await _repository.GetAsync <ObservableUser>(x => x.Username == observablePage.TargetContentName);

            if (page != null)
            {
                // If such content exists, check the existence of the observable user in the list of its ActivityInitiators
                if (observableUser != null && page.ActivityInitiators.Contains(observableUser))
                {
                    return(RedirectToAction("Index", new { status = "repeat" }));
                }
                else
                {
                    /* If such observable user does not exist, add it to the collection of ActivityInitiators,
                     * update the data in the database and return a message about the successful operation.*/
                    page.ActivityInitiators.Add(observableUser);
                    await _repository.UpdateAsync <ObservableUser>(page);

                    observableUser.ObservableUsers.Add(page);
                    await _repository.UpdateAsync <ObservableUser>(observableUser);

                    return(RedirectToAction("Index", new { status = "success" }));
                }
            }

            // If such content is not in the database, then we initialize the new content
            page             = new ObservableUser();
            page.InstagramPK = _instaApi.GetPrimaryKeyByUsername(observablePage.TargetContentName);
            page.Username    = observablePage.TargetContentName;
            page.ActivityInitiators.Add(observableUser);

            // Trying to add a new content to the database
            if (!await _repository.CreateAsync <ObservableUser>(page))
            {
                return(RedirectToAction("Index", new { status = "bad" }));
            }

            // Update the data in the database
            observableUser.ObservableUsers.Add(page);
            await _repository.UpdateAsync <ObservableUser>(observableUser);

            // Return a message about the successful operation
            return(RedirectToAction("Index", new { status = "success" }));
        }
コード例 #11
0
        private async Task StartLikesAnalizingAsync(
            ApplicationUser observer, ObservableUser observable, ObservableUser targetUser)
        {
            IInstagramAPI instagramAPI = new InstagramAPI.InstagramAPI();

            instagramAPI.SetCookies(observer.StateData);

            List <InstagramPost> posts =
                await GetProfileStateAsync(instagramAPI, targetUser);

            var cancellationTokenSource = new CancellationTokenSource();

            Task likesAnalizingTask = Task.Run(
                () =>
            {
                List <InstagramPost> newPostsState = new List <InstagramPost>();

                do
                {
                    newPostsState =
                        instagramAPI.GetUserPostsByPrimaryKey(targetUser.InstagramPK);

                    if (AreDifferencesPresent(posts, newPostsState))
                    {
                        var postsWithDifference = GetDistinctivePosts(posts, newPostsState);

                        foreach (var distinctivePost in postsWithDifference)
                        {
                            CheckForUserLike(observer, observable, targetUser, distinctivePost.Key, distinctivePost.Value);
                        }
                    }

                    posts = newPostsState;

                    try
                    {
                        Sleep(SLEEP_TIMEOUT, cancellationTokenSource.Token);
                    }
                    catch (OperationCanceledException ex)
                    {
                        break;
                    }
                } while (!cancellationTokenSource.Token.IsCancellationRequested);

                SaveProfileStateAsync(targetUser, newPostsState);
            });

            TryAddToTasks(observer, observable, targetUser, likesAnalizingTask, cancellationTokenSource);
        }
コード例 #12
0
 private void CheckForUserComment(ApplicationUser observer, ObservableUser observable, User postOwner, InstagramPost firstPostState, InstagramPost secondPostState)
 {
     if (!firstPostState.Commenters.Contains(observable) &&
         secondPostState.Commenters.Contains(observable))
     {
         var activity = new UserActivity();
         activity.ObserverPrimaryKey   = observer.InstagramPK;
         activity.InitiatorPrimaryKey  = observable.InstagramPK;
         activity.TargetUserPrimaryKey = postOwner.InstagramPK;
         activity.LinkToMedia          = firstPostState.MediaFileUri;
         activity.EventDate            = DateTime.Now;
         activity.ActivityType         = UserActivityType.Comment;
         _commentCreated?.Invoke(null, activity);
     }
 }
コード例 #13
0
 public AnalizationTask(
     ApplicationUser observer,
     ObservableUser observable,
     ObservableUser targetUser,
     Task task,
     CancellationTokenSource cancellationTokenSource)
 {
     Observer   = observer;
     Observable = observable;
     TargetUser = targetUser;
     Tasks      = new List <Task> {
         task
     };
     CancellationTokenSource = cancellationTokenSource;
 }
コード例 #14
0
        private async Task SaveProfileStateAsync(ObservableUser profileOwner, List <InstagramPost> posts)
        {
            var profile = await _repository.GetAsync <UserProfile>(p => p.Owner.Equals(profileOwner));

            if (profile != null) // Profile state already exists in DB.
            {
                posts = profile.Posts;
                _repository.UpdateAsync(profile);
            }
            else // We have to create new record in DB.
            {
                profile = new UserProfile
                {
                    Owner = profileOwner,
                    Posts = posts
                };

                _repository.CreateAsync(profile);
            }
        }
コード例 #15
0
        private void TryAddToTasks(
            ApplicationUser observer,
            ObservableUser observable,
            ObservableUser targetUser,
            Task task,
            CancellationTokenSource cancellationTokenSource)
        {
            var analizationTask = _tasks.Where(at => at.Observer.Equals(observer) &&
                                               at.Observable.Equals(observable) &&
                                               at.TargetUser.Equals(targetUser)).FirstOrDefault();

            if (analizationTask == null) // Task not created yet.
            {
                var newAnalizationTask =
                    new AnalizationTask(observer, observable, targetUser, task, cancellationTokenSource);
                _tasks.Add(newAnalizationTask);
            }

            analizationTask.AddTask(task);
        }
コード例 #16
0
        private List <ObservableUser> GetPostLikers(InstaMedia media)
        {
            var likers = new List <ObservableUser>();

            Task <IResult <InstaLikersList> > likersListTask =
                Task.Run(() =>
                         _instaApi.MediaProcessor.GetMediaLikersAsync(media.Pk));

            likersListTask.Wait();

            IResult <InstaLikersList> likersList = likersListTask.Result;

            foreach (var liker in likersList.Value)
            {
                var newUser = new ObservableUser();
                newUser.InstagramPK = liker.Pk.ToString();
                newUser.Username    = liker.UserName;
                likers.Add(newUser);
            }

            return(likers);
        }
コード例 #17
0
        private List <ObservableUser> GetPostCommenters(InstaMedia media)
        {
            var commenters = new List <ObservableUser>();

            Task <IResult <InstaCommentList> > commentsListTask =
                Task.Run(() =>
                         _instaApi.CommentProcessor.GetMediaCommentsAsync(media.Pk, PaginationParameters.MaxPagesToLoad(MAX_PAGES_TO_LOAD)));

            commentsListTask.Wait();

            IResult <InstaCommentList> commentsList = commentsListTask.Result;

            foreach (var comment in commentsList.Value.Comments)
            {
                var newUser = new ObservableUser();
                newUser.InstagramPK = comment.User.Pk.ToString();
                newUser.Username    = comment.User.UserName;
                commenters.Add(newUser);
            }

            return(commenters);
        }
コード例 #18
0
ファイル: UsersVM.cs プロジェクト: fstaniul/MyCardio
 private void DeleteUser(ObservableUser obj)
 {
     _observableUsers.Remove(obj);
     _users.Remove(obj.Source);
 }
コード例 #19
0
ファイル: UsersVM.cs プロジェクト: fstaniul/MyCardio
 public void SelectUser(ObservableUser observableUser)
 {
     PulsesOverviewVM.Instance.ObservableUser = observableUser;
     MainWindowVM.Navigate(typeof(PulsesOverview));
 }
コード例 #20
0
 public async Task StartObservationAsync(ApplicationUser observer, ObservableUser observable, ObservableUser targetUser)
 {
     StartLikesAnalizingAsync(observer, observable, targetUser);
     StartCommentsAnalizingAsync(observer, observable, targetUser);
 }
コード例 #21
0
        public async Task RemoveTargetUserFromObservationAsync(ApplicationUser observer, ObservableUser observable, User targetUser)
        {
            var aTask = _tasks.Where(at => at.Observer.Equals(observer) &&
                                     at.Observable.Equals(observable) &&
                                     at.TargetUser.Equals(targetUser)).FirstOrDefault();

            if (aTask == null) // User is not under observation.
            {
                return;
            }

            aTask.CancellationTokenSource.Cancel();

            foreach (var task in aTask.Tasks)
            {
                task.Wait();
            }

            _tasks.Remove(aTask);
        }