private async System.Threading.Tasks.Task <List <SocialMediaAccountViewModel> > GetProfilesInfoAsync(ApplicationUser user, SocialMediaAccounts type)
        {
            GetSocialMediaAccounts(user, type,
                                   out FacebookUserAccount facebookAccount,
                                   out TwitterUserAccount twitterAccount);

            bool CanAccessFacebook = facebookAccount.account_access_token != "" &&
                                     await FacebookOAuthLogin.IsAuthorized(facebookAccount.account_access_token);

            bool CanAccessTwitter = twitterAccount.account_access_token != "" &&
                                    await TwitterOAuthAuthenticator.IsAuthorized(twitterAccount.account_access_token, twitterAccount.account_access_token_secret);

            List <SocialMediaAccountViewModel> profileInfo = new List <SocialMediaAccountViewModel>();

            if (CanAccessFacebook)
            {
                profileInfo.Add(await facebookPostsApi.GetProfileInfoAsync(facebookAccount.AccountId, facebookAccount.account_access_token));
            }

            if (CanAccessTwitter)
            {
                profileInfo.Add(await twitterPostsApi.GetProfileInfoAsync(twitterAccount.AccountId, twitterAccount.account_access_token, twitterAccount.account_access_token_secret));
            }

            return(profileInfo);
        }
Beispiel #2
0
        // GET: Team/Manage
        public async System.Threading.Tasks.Task <ActionResult> Manage(string tab)
        {
            GetUser(out _, out ApplicationUser user);
            GetSocialMediaAccounts(user, SocialMediaAccounts.Team,
                                   out FacebookUserAccount facebookAccount,
                                   out TwitterUserAccount twitterAccount);

            bool CanAccessFacebook = facebookAccount.account_access_token != "" &&
                                     await FacebookOAuthLogin.IsAuthorized(facebookAccount.account_access_token);

            bool CanAccessTwitter = twitterAccount.account_access_token != "" &&
                                    await TwitterOAuthAuthenticator.IsAuthorized(twitterAccount.account_access_token, twitterAccount.account_access_token_secret);

            List <SocialMediaAccountViewModel> profileInfo = new List <SocialMediaAccountViewModel>();

            try
            {
                if (CanAccessFacebook)
                {
                    profileInfo.Add(await facebookPostsApi.GetProfileInfoAsync(facebookAccount.AccountId, facebookAccount.account_access_token));
                }

                if (CanAccessTwitter)
                {
                    profileInfo.Add(await twitterPostsApi.GetProfileInfoAsync(twitterAccount.AccountId, twitterAccount.account_access_token, twitterAccount.account_access_token_secret));
                }
            }
            catch (SocialMediaApiException ex)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest, ex.Message));
            }
            catch (Exception)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            switch (tab)
            {
            case "overview":
                return(PartialView("~/Views/Team/Partials/_Overview.cshtml", Tuple.Create(user, profileInfo)));

            case "settings":
                Dictionary <string, SocialMediaAccountViewModel> profileInfoDict = profileInfo.ToDictionary(p => p.Type.ToLower(), p => p);
                //if (user.Team.LeaderId == user.Id)
                return(PartialView("~/Views/Team/Partials/_Settings.cshtml", Tuple.Create(user, profileInfoDict)));

            //else
            //    return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
            default:
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
        }
        private async Task <ActionResult> CreatePost(SocialMediaAccounts type, HttpRequestBase Request)
        {
            GetUser(out _, out ApplicationUser user);
            GetSocialMediaAccounts(user, type,
                                   out FacebookUserAccount facebookAccount,
                                   out TwitterUserAccount twitterAccount);

            bool CanAccessFacebook = facebookAccount.account_access_token != "" &&
                                     await FacebookOAuthLogin.IsAuthorized(facebookAccount.account_access_token);

            bool CanAccessTwitter = twitterAccount.account_access_token != "" &&
                                    await TwitterOAuthAuthenticator.IsAuthorized(twitterAccount.account_access_token, twitterAccount.account_access_token_secret);

            List <Task <PostViewModel> > postTasks = new List <Task <PostViewModel> >();

            JArray selectedAccounts = JArray.Parse(Request.Form["accounts"]);

            HttpFileCollectionBase images  = Request.Files;
            List <MemoryStream>    streams = new List <MemoryStream>();

            if (images.Count != 0)
            {
                streams = images.AllKeys
                          .ToList()
                          .Select(key =>
                {
                    MemoryStream stream = new MemoryStream();
                    images[key].InputStream.CopyTo(stream);
                    return(stream);
                })
                          .ToList();
            }

            List <PostViewModel> postedPosts = new List <PostViewModel>();

            try
            {
                foreach (var account in selectedAccounts)
                {
                    if (account["type"].ToString().ToLower() == "facebook" && CanAccessFacebook)
                    {
                        //postedPosts.Add(await facebookPostsApi.CreatePostAsync(facebookAccount.AccountId,
                        //    Request.Form["message"],
                        //    Request.Files,
                        //    facebookAccount.account_access_token));

                        postTasks.Add(facebookPostsApi.CreatePostAsync(facebookAccount.AccountId,
                                                                       Request.Form["message"],
                                                                       streams,
                                                                       facebookAccount.account_access_token));
                    }

                    if (account["type"].ToString().ToLower() == "twitter" && CanAccessTwitter)
                    {
                        //postedPosts.Add(await twitterPostsApi.CreatePostAsync(Request.Form["message"],
                        //    Request.Files,
                        //    twitterAccount.account_access_token,
                        //    twitterAccount.account_access_token_secret));
                        postTasks.Add(twitterPostsApi.CreatePostAsync(Request.Form["message"],
                                                                      streams,
                                                                      twitterAccount.account_access_token,
                                                                      twitterAccount.account_access_token_secret));
                    }
                }

                foreach (var task in postTasks)
                {
                    postedPosts.Add(await task.TimeoutAfter <PostViewModel>(new TimeSpan(0, 0, 10), () => new PostViewModel {
                        Id = ""
                    }));
                }
            }
            catch (SocialMediaApiException ex)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest, ex.Message));
            }
            catch (Exception)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            //PostViewModel post = await facebookPostsApi.CreatePostAsync(user.FbUserAccount.AccountId, Request.Form["message"], Request.Files, user.FbUserAccount.account_access_token);

            return(PartialView("~/Views/Post/Partials/_Posts.cshtml", postedPosts.Where(post => post.Id != "").ToList()));
        }
        // GET: Post/GetAllPosts -> Private
        private async Task <ActionResult> GetAllPosts(SocialMediaAccounts type, string fb_after_cursor, string twitter_after_cursor)
        {
            GetUser(out _, out ApplicationUser user);
            GetSocialMediaAccounts(user, type,
                                   out FacebookUserAccount facebookAccount,
                                   out TwitterUserAccount twitterAccount);

            bool CanGetFacebookPosts = facebookAccount.account_access_token != "" &&
                                       await FacebookOAuthLogin.IsAuthorized(facebookAccount.account_access_token);

            bool CanGetTwitterPosts = twitterAccount.account_access_token != "" &&
                                      await TwitterOAuthAuthenticator.IsAuthorized(twitterAccount.account_access_token, twitterAccount.account_access_token_secret);

            Task <Tuple <List <PostViewModel>, string> > facebookPostsTask =
                new Task <Tuple <List <PostViewModel>, string> >(() => Tuple.Create(new List <PostViewModel>(), ""));
            Task <Tuple <List <PostViewModel>, string> > twitterPostsTask =
                new Task <Tuple <List <PostViewModel>, string> >(() => Tuple.Create(new List <PostViewModel>(), ""));;

            try
            {
                if (CanGetFacebookPosts)
                {
                    facebookPostsTask = facebookPostsApi.GetPostedPostsAsync(facebookAccount.AccountId,
                                                                             facebookAccount.account_access_token,
                                                                             5, fb_after_cursor);
                }

                if (CanGetTwitterPosts)
                {
                    twitterPostsTask = twitterPostsApi.GetPostedPostsAsync(twitterAccount.AccountId,
                                                                           twitterAccount.account_access_token,
                                                                           twitterAccount.account_access_token_secret,
                                                                           5, twitter_after_cursor);
                }
            }
            catch (SocialMediaApiException ex)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest, ex.Message));
            }
            catch (Exception)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            Tuple <List <PostViewModel>, string> facebookPosts = await facebookPostsTask.TimeoutAfter(new TimeSpan(0, 0, 1), () => Tuple.Create(new List <PostViewModel>(), "")); // await facebookPostsTask;

            Tuple <List <PostViewModel>, string> twitterPosts = await twitterPostsTask.TimeoutAfter(new TimeSpan(0, 0, 1), () => Tuple.Create(new List <PostViewModel>(), ""));   // await twitterPostsTask;

            IEnumerable <Tuple <PostViewModel, PostViewModel> > pairs = facebookPosts.Item1.Zip(twitterPosts.Item1, (a, b) => Tuple.Create(a, b));
            List <PostViewModel> posts = pairs.ToList()
                                         .SelectMany(p => new List <PostViewModel>()
            {
                p.Item1, p.Item2
            })
                                         .ToList();

            int facebookPostsCount = facebookPosts.Item1.Count;
            int twitterPostsCount  = twitterPosts.Item1.Count;

            posts.AddRange(facebookPostsCount >= twitterPostsCount ?
                           facebookPosts.Item1.GetRange(Math.Min(facebookPostsCount, twitterPostsCount), Math.Abs(facebookPostsCount - twitterPostsCount)) :
                           twitterPosts.Item1.GetRange(Math.Min(facebookPostsCount, twitterPostsCount), Math.Abs(facebookPostsCount - twitterPostsCount)));

            return(Json(new
            {
                cursors = new
                {
                    fbafter = facebookPosts.Item2,
                    twafter = twitterPosts.Item2
                },
                posts = Utils.RenderRazorViewToString(this, "~/Views/Post/Partials/_Posts.cshtml", posts)
            }, JsonRequestBehavior.AllowGet));
        }