Ejemplo n.º 1
0
        public async Task ResetAuthCode()
        {
            string newCode = GenerateRandomPassword();
            var    user    = await _userManager.FindByNameAsync(User.Identity.Name);

            RedditSharp.IWebAgent cabalAgent = await serviceAgentPool.GetOrCreateAgentAsync(Configuration["CabalUsername"], () =>
            {
                return(Task.FromResult(
                           new RedditSharp.BotWebAgent(
                               Configuration["CabalUsername"],
                               Configuration["CabalPassword"],
                               Configuration["CabalClientID"],
                               Configuration["CabalSecret"],
                               Configuration["CabalRedirectURI"]
                               )
                           ));
            });

            RedditSharp.Reddit cabalReddit = new RedditSharp.Reddit(cabalAgent, true);

            await _userManager.RemovePasswordAsync(user);

            await _userManager.AddPasswordAsync(user, newCode);

            await cabalReddit.ComposePrivateMessageAsync("SnooNotes User Key",
                                                         $@"This is your key to allow a bot/thirdparty to access SnooNotes on your behalf. Guard it carefully!

#Key: `{newCode}`

If you did not request this, panic, then hit up /u/meepster23 to help sort it out.
", User.Identity.Name);
        }
Ejemplo n.º 2
0
        public async Task <bool> BanUser(Models.BannedEntity user)
        {
            var newBan = await bbDAL.BanUser(new Models.BannedEntity[] { user });

            if (!newBan)
            {
                return(false);
            }

            string reason = $"Banned {user.UserName} : {user.BanReason}";

            //only used if changing to allowing banning of multiple users at a time.
            //if (reason.Length > 255) reason = $"Banned {string.Join(",", userEntities.Select(e => e.EntityString))} for {string.Join(",", userEntities.Select(e => e.BanReason).Distinct())} by {string.Join(",", userEntities.Select(e => e.BannedBy).Distinct())}";
            //if (reason.Length > 255) reason = "Banned lots of things and the summary is too long for the description.. RIP";

            bool done  = false;
            int  count = 1;

            var ident = await userManager.FindByNameAsync(user.BannedBy);

            var webAgent = await agentPool.GetOrCreateWebAgentAsync(user.BannedBy, (uname, uagent, rlimit) =>
            {
                return(Task.FromResult <RedditSharp.RefreshTokenPoolEntry>(new RedditSharp.RefreshTokenPoolEntry(uname, ident.RefreshToken, rlimit, uagent)));
            });

            if (!ident.HasWiki)
            {
                throw new UnauthorizedAccessException("Need Wiki Permissions");
            }
            if (!ident.HasConfig)
            {
                throw new UnauthorizedAccessException("Need Config Permissions");
            }
            RedditSharp.Reddit rd = new RedditSharp.Reddit(webAgent, true);

            var wiki = new RedditSharp.Wiki(webAgent, user.SubName);

            //var wiki = new RedditSharp.WikiPage()
            while (!done && count < 5)
            {
                try
                {
                    done = await SaveAutoModConfig(reason, wiki);
                }
                catch (WebException ex)
                {
                    if ((ex.Response as HttpWebResponse).StatusCode == HttpStatusCode.Forbidden)
                    {
                        throw;
                    }
                    else
                    {
                        count++;
                    }
                    await Task.Delay(100);
                }
            }

            return(true);
        }
Ejemplo n.º 3
0
        public async Task <Modules.PostAnalysisResults> AnalyzePost(string id)
        {
            var post = new RedditSharp.Reddit(Program.Agent, false).GetPost(new Uri(id));

            Modules.PostAnalysisResults results = await Program.AnalyzePost(post);

            return(results);
        }
Ejemplo n.º 4
0
 public SelfPromotionCombustor(SelfPromotionCombustorSettings settings, RedditSharp.Reddit client) : this()
 {
     RedditClient            = client;
     Settings                = settings;
     PercentageThreshold     = settings.PercentageThreshold;
     IncludePostInPercentage = settings.IncludePostInPercentage;
     RemovalFlair            = settings.RemovalFlair;
     GracePeriod             = settings.GracePeriod;
 }
Ejemplo n.º 5
0
        static void Main(string[] args) {

            var redditApi = new RedditSharp.Reddit();
            var dailyProgrammer = redditApi.GetSubreddit("dailyprogrammer");

            var blankList = new[] { DailyProgrammerPost.Blank, DailyProgrammerPost.Blank, DailyProgrammerPost.Blank, };

            var grid = @"Easy | Intermediate | Hard | Weekly/Bonus

---- -| --------------| ------| -------------
| []() | []() | []() | **-** |
";

            var postsQuery = dailyProgrammer.Posts
                //.Take(20) // Used for development to speed things up
                //.ToList()
                //.OrderBy(p => p.Created)
                .Select(p => new DailyProgrammerPost(p.Title, p.Url.AbsoluteUri));

            List<DailyProgrammerPost> allPosts = new List<DailyProgrammerPost>();

            foreach (var post in postsQuery) {
                if (post.IsChallenge) {

                    allPosts.Add(post);
                }
                else if (post.IsWeekly || post.IsBonus) {

                    var week = allPosts.LastOrDefault()?.WeekNumber;

                    allPosts.Add(new DailyProgrammerPost(post.Title, post.Url, week));
                }
            }

            foreach (var weekOfPosts in allPosts.GroupBy(p => p.WeekNumber)) {

                var orderedPosts = weekOfPosts
                    .Where(p => p.IsChallenge)
                    .OrderBy(p => p.ChallengeDifficulty)
                    .Concat(weekOfPosts.Where(p => !p.IsChallenge))
                    .ToList();

                if (orderedPosts.Count() < 3) {

                    orderedPosts = orderedPosts.Concat(blankList).Take(3).ToList();
                }
                string extraAppend = orderedPosts.Count == 4 ? " |" : " | **-** |";

                var line = "| " + string.Join(" | ", orderedPosts) + extraAppend;

                grid += line + Environment.NewLine;
            }

            File.WriteAllText("c:\\\\temp\\DailyProgrammerReditOutput.txt", grid);
            Console.WriteLine("Done!");
            Console.ReadLine();
        }
        public async Task GetRALLComments()
        {
            RedditSharp.WebAgent agent  = new RedditSharp.WebAgent(authFixture.AccessToken);
            RedditSharp.Reddit   reddit = new RedditSharp.Reddit(agent, true);

            var comments = reddit.RSlashAll.GetComments(5);

            Assert.Equal(5, await comments.Count());
        }
        public async Task PageComments()
        {
            RedditSharp.WebAgent agent  = new RedditSharp.WebAgent(authFixture.AccessToken);
            RedditSharp.Reddit   reddit = new RedditSharp.Reddit(agent, true);

            var comments = await reddit.RSlashAll.GetComments().Take(55).ToList();

            Assert.Equal(55, comments.Count);
        }
        public async Task GetContributors()
        {
            RedditSharp.WebAgent agent  = new RedditSharp.WebAgent(authFixture.AccessToken);
            RedditSharp.Reddit   reddit = new RedditSharp.Reddit(agent);
            var sub = await reddit.GetSubredditAsync(authFixture.Config["TestSubreddit"]);

            var contribs = await sub.GetContributors().ToList();

            Assert.NotEmpty(contribs);
            Assert.Contains <string>(authFixture.TestUserName.ToLower(), contribs.Select(c => c.Name.ToLower()));
        }
        public async Task GetModerators()
        {
            RedditSharp.WebAgent agent  = new RedditSharp.WebAgent(authFixture.AccessToken);
            RedditSharp.Reddit   reddit = new RedditSharp.Reddit(agent);
            var sub = await reddit.GetSubredditAsync(authFixture.Config["TestSubreddit"]);

            var mods = await sub.GetModeratorsAsync();

            Assert.NotEmpty(mods);
            Assert.NotEmpty(mods.Where(m => m.Permissions != RedditSharp.ModeratorPermission.None));
        }
Ejemplo n.º 10
0
        public async Task GetCommentsMore()
        {
            RedditSharp.WebAgent agent  = new RedditSharp.WebAgent(authFixture.AccessToken);
            RedditSharp.Reddit   reddit = new RedditSharp.Reddit(agent);
            var post = (Post)await reddit.GetThingByFullnameAsync("t3_5u37lj");

            var comments = await post.GetCommentsWithMoresAsync(limit : 9);

            Assert.NotEmpty(comments);
            Assert.Equal(10, comments.Count);
        }
Ejemplo n.º 11
0
 public RedditSharpActivityMonitor(RedditSharp.Reddit reddit,
                                   Subreddit subreddit,
                                   IActivityDispatcher activityDispatcher,
                                   IDB4Repository db4Repository,
                                   ILogger logger)
 {
     _reddit             = reddit;
     _subreddit          = subreddit;
     _activityDispatcher = activityDispatcher;
     _db4Repository      = db4Repository;
     _logger             = logger;
 }
Ejemplo n.º 12
0
        public async Task SubmitPost()
        {
            RedditSharp.WebAgent agent  = new RedditSharp.WebAgent(authFixture.AccessToken);
            RedditSharp.Reddit   reddit = new RedditSharp.Reddit(agent, true);

            var sub = await reddit.GetSubredditAsync(authFixture.Config["TestSubreddit"]);

            var post = await sub.SubmitPostAsync("ThisIsASubmittedPost", "https://github.com/CrustyJew/RedditSharp/issues/76", resubmit : true);

            Assert.NotNull(post);
            await post.DelAsync();
        }
 public RedditSharpActivityMonitor(RedditSharp.Reddit reddit,
                                   Subreddit subreddit,
                                   IActivityDispatcher activityDispatcher,
                                   IDB4Repository db4Repository,
                                   ILogger logger)
 {
     _reddit                 = reddit;
     _subreddit              = subreddit;
     _activityDispatcher     = activityDispatcher;
     _db4Repository          = db4Repository;
     _logger                 = logger;
     _commentObserver        = new IncomingCommentObserver(activityDispatcher, db4Repository, logger);
     _privateMessageObserver = new IncomingPrivateMessageObserver(activityDispatcher, db4Repository, logger);
 }
Ejemplo n.º 14
0
        public WikiTests(AuthenticatedTestsFixture authenticatedFixture)
        {
            authFixture = authenticatedFixture;
            RedditSharp.WebAgent agent = new RedditSharp.WebAgent(authFixture.AccessToken);
            reddit = new RedditSharp.Reddit(agent);
            sub    = reddit.GetSubredditAsync(authFixture.Config["TestSubreddit"]).Result;

            var names = sub.GetWiki.GetPageNamesAsync().Result;

            if (!names.Select(n => n.ToLower()).Contains(WIKI_PAGE_NAME))
            {
                sub.GetWiki.EditPageAsync(WIKI_PAGE_NAME, "**test** content ***up*** in *hur*").Wait();
            }
        }
Ejemplo n.º 15
0
        public async Task EnumerateAllComments()
        {
            RedditSharp.WebAgent agent  = new RedditSharp.WebAgent(authFixture.AccessToken);
            RedditSharp.Reddit   reddit = new RedditSharp.Reddit(agent);
            var post = (Post)await reddit.GetThingByFullnameAsync("t3_5u37lj");

            var            comments     = post.EnumerateCommentTreeAsync(5);
            List <Comment> commentsList = new List <Comment>();

            await comments.ForEachAsync(c => commentsList.Add(c));

            Assert.NotEmpty(commentsList);
            Assert.Equal(25, commentsList.Count);
        }
Ejemplo n.º 16
0
        public string[] Parse(IHtmlDocument document)
        {
            //var list = new List<string>();
            //var items = document.QuerySelectorAll("a").Where(item => item.ClassName != null && item.ClassName.Contains("post__title_link"));  //habr
            //var items = document.QuerySelectorAll("div").Where(item => item.ClassName != null && item.ClassName.Contains("text"));    //nekdo
            //var items = document.QuerySelectorAll("a").Where(item => item.ClassName != null && item.ClassName.Contains("orange")).OfType<IHtmlAnchorElement>(); //2ch
            //var items = document.QuerySelectorAll("a").Where(item => item.ClassName != null && item.ClassName.Contains("b-list-item__link")).OfType<IHtmlAnchorElement>(); //lenta.ru
            //var items = document.QuerySelectorAll("a").Where(item => item.ClassName != null && item.ClassName.Contains("story__title-link")).OfType<IHtmlAnchorElement>(); //pikabu
            //var items = document.All.Where(item => item.LocalName != null && item.LocalName.Contains("img")).OfType<IHtmlImageElement>(); //stavklass, pornpics
            //var items = document.QuerySelectorAll("div").Where(item => item.ClassName == "thumb_container").Select(x => x.Attributes["data-previewvideo"].Value); //xhamster
            var items = document.QuerySelectorAll("source").Where(item => item.Attributes["src"].Value.Contains(".mp4")).Select(x => x.Attributes["src"].Value); //reddit - не работает
            //var items = document.QuerySelectorAll("a").Where(item => item.Attributes["href"].Value.Contains("gfycatporn.com/oilporn")).Select(x => x.Attributes["href"].Value); //gfycatporn
            //foreach (var item in items)
            //{
            //    if (item.Source.Length < 100)
            //    {
            //        list.Add(item.Source); //stavklass, pornpics
            //    }
            //    list.Add(item); //xhamster
            //    list.Add(item.TextContent); //habr, nekdo
            //    list.Add("https://2ch.hk" + item.PathName);   //2ch
            //    list.Add("https://m.lenta.ru" + item.PathName); //lenta.ru
            //    list.Add("https://pikabu.ru" + item.PathName);	//pikabu
            //}

            List <string> reddit_uri = new List <string>();   //список uri на NSFW видео
            //string giant = "";
            var           reddit    = new RedditSharp.Reddit();
            List <string> lines     = ReadingTextFile.GetLinesOfTextFile(); //читаем из файла логин и пароль для reddit.com (безопасность, блеать :))
            var           user      = reddit.LogIn(lines[3], lines[4]);
            var           subreddit = reddit.GetSubreddit("/r/Lesbian_gifs");

            //var subreddit = reddit.GetSubreddit("/r/NSFW_GIF");

            foreach (var post in subreddit.Hot.Take(50))
            {
                //if (post.Url.AbsoluteUri.Contains("imgur"))
                //{
                reddit_uri.Add(post.Url.AbsoluteUri);

                //}
                //if (post.Url.AbsoluteUri.Contains("gfycat"))
                //{
                //    giant = post.Url.AbsoluteUri.Insert(8, "giant.");
                //    reddit_uri.Add(giant + ".mp4");
                //}
            }
            return(reddit_uri.ToArray());
        }
Ejemplo n.º 17
0
        public async Task StreamComments()
        {
            RedditSharp.WebAgent agent  = new RedditSharp.WebAgent(authFixture.AccessToken);
            RedditSharp.Reddit   reddit = new RedditSharp.Reddit(agent, true);

            var count    = 0;
            var comments = reddit.RSlashAll.GetComments().GetEnumerator(50, 100, true);

            while (await comments.MoveNext(CancellationToken.None))
            {
                count++;
            }

            Assert.Equal(100, count);
        }
Ejemplo n.º 18
0
        public async Task<IEnumerable<string>> GetInactiveModeratedSubreddits() {
            var userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
            var ident = userManager.FindByName( User.Identity.Name );
            if ( ident.TokenExpires < DateTime.UtcNow ) {
                Utilities.AuthUtils.GetNewToken( ident );
                userManager.Update( ident );
            }
            Utilities.SNWebAgent agent = new Utilities.SNWebAgent( ident.AccessToken );
            RedditSharp.Reddit rd = new RedditSharp.Reddit( agent, true );

            List<Models.Subreddit> activeSubs = await subBLL.GetActiveSubs();
            List<string> activeSubNames = activeSubs.Select( s => s.SubName.ToLower() ).ToList();

            var subs = rd.User.ModeratorSubreddits.Where( s => s.ModPermissions.HasFlag( RedditSharp.ModeratorPermission.All ) && !activeSubNames.Contains( s.Name.ToLower() ) ).Select( s => s.Name );
            return subs.OrderBy( s => s );
        }
Ejemplo n.º 19
0
        /// <summary>Get a youtube url from /r/youtubehaiku.
        /// The top 100 posts are cached until all 100 have been returned</summary>
        public static async Task <Uri> GetYoutubeHaikuUrlAsync()
        {
            if (_cachedTop100YtHaikus.Count > 0)
            {
                var post = _cachedTop100YtHaikus.GetRandom();
                _cachedTop100YtHaikus.Remove(post);
                return(post.Url);
            }
            var reddit    = new RedditSharp.Reddit();
            var subreddit = await reddit.GetSubredditAsync("/r/youtubehaiku");

            var posts = await Task.Run(() => subreddit.GetTop(FromTime.All));

            _cachedTop100YtHaikus = posts.Take(100).ToList();
            return(_cachedTop100YtHaikus.GetRandom().Url);
        }
Ejemplo n.º 20
0
        public string[] Parse(IHtmlDocument document)
        {
            //var list = new List<string>();
            //var items = document.QuerySelectorAll("a").Where(item => item.ClassName != null && item.ClassName.Contains("post__title_link"));  //habr
            //var items = document.QuerySelectorAll("div").Where(item => item.ClassName != null && item.ClassName.Contains("text"));    //nekdo
            //var items = document.QuerySelectorAll("a").Where(item => item.ClassName != null && item.ClassName.Contains("orange")).OfType<IHtmlAnchorElement>(); //2ch
            //var items = document.QuerySelectorAll("a").Where(item => item.ClassName != null && item.ClassName.Contains("b-list-item__link")).OfType<IHtmlAnchorElement>(); //lenta.ru
            //var items = document.QuerySelectorAll("a").Where(item => item.ClassName != null && item.ClassName.Contains("story__title-link")).OfType<IHtmlAnchorElement>(); //pikabu
            //var items = document.All.Where(item => item.LocalName != null && item.LocalName.Contains("img")).OfType<IHtmlImageElement>(); //stavklass
            //var items = document.QuerySelectorAll("p").Where(item => item.ClassName != null && item.ClassName.Contains("title")).OfType<IHtmlAnchorElement>(); //reddit
            //var items = document.QuerySelectorAll("a").Where(item => item.Attributes["href"]!=null && item.Attributes["href"].Value.Contains("gifv"));//.Select(x => x.Attributes["href"].Value); //reddit еще

            //foreach (var item in items)
            //{
            //    //list.Add(item.TextContent); //habr, nekdo
            //    //list.Add(item.Source); //stavklass, pornpics
            //    //list.Add("https://2ch.hk" + item.PathName);   //2ch
            //    //list.Add("https://m.lenta.ru" + item.PathName);	//lenta.ru
            //    //list.Add("https://pikabu.ru" + item.PathName);	//pikabu
            //    //list.Add(item.Attributes["href"].Value.Replace("gifv", "mp4"));	//reddit
            //    list.Add(item.Attributes["href"].Value);
            //}
            //return list.ToArray();

            List <string> reddit_uri = new List <string>();   //список uri на mp4 и gif

            var           reddit = new RedditSharp.Reddit();
            List <string> lines  = ReadingTextFile.GetLinesOfTextFile();   //читаем из файла логин и пароль для reddit.com (безопасность, блеать :))
            var           user   = reddit.LogIn(lines[3], lines[4]);
            //var subreddit = reddit.GetSubreddit("/r/60fpsporn");
            var subreddit = reddit.GetSubreddit("/r/gifs");

            foreach (var post in subreddit.Hot.Take(50))
            {
                if (post.Url.AbsoluteUri.Contains(".gif"))
                {
                    if (post.Url.AbsoluteUri.Contains(".gifv"))
                    {
                        reddit_uri.Add(post.Url.AbsoluteUri.Replace("gifv", "mp4"));
                        continue;
                    }
                    reddit_uri.Add(post.Url.AbsoluteUri);
                }
            }
            return(reddit_uri.ToArray());
        }
Ejemplo n.º 21
0
        public static string PlotSubReddit(EntityData dimstyle, string pickedSubReddit)
        {
            string result = "OK";

            try
            {
                DrawEntity.DrawBox(dimstyle.origin, dimstyle.cornerBase, "REDDIT.BORDER", 20);
                RedditSharp.Reddit reddit = new RedditSharp.Reddit();

                var subreddit = reddit.GetSubreddit(pickedSubReddit);
                if (subreddit != null)
                {
                    Tuple <double, double> widthHeight;
                    int    i                 = -1;
                    double yTextLocation     = dimstyle.origin.Y;
                    double mtextActualHeight = 0;
                    DrawEntity.DrawDim(dimstyle.origin, new Point3d(dimstyle.cornerBase.X, dimstyle.origin.Y, 0), "/r/" + pickedSubReddit, "REDDIT.HEADINGS", dimstyle.headingTxtSize, 1.025);
                    foreach (var post in subreddit.Hot.Take(20))
                    {
                        string postId = GeneratePostId(PostMarker.postmarker);
                        yTextLocation -= (mtextActualHeight - (dimstyle.yLength * .025)); //adds 5% height padding
                        Point2d headingLocation = new Point2d(dimstyle.origin.X, yTextLocation);

                        widthHeight       = DrawEntity.DrawText(headingLocation, dimstyle.headingTxtSize, dimstyle.textWidth, post.Title, "REDDIT.HEADINGS", 7);
                        mtextActualHeight = widthHeight.Item2;
                        Point2d subHeadingLocation = new Point2d(dimstyle.origin.X, yTextLocation - mtextActualHeight);
                        string  subHeading         = string.Format("By:{0} | No. Of Comments: {1} | Submitted: {2} | NSFW: {3}",
                                                                   post.Author.ToString(), post.CommentCount.ToString(), post.Created.ToString(), post.NSFW ? "YES":"NO");
                        widthHeight = DrawEntity.DrawText(subHeadingLocation, dimstyle.subHeadingTxtSize, dimstyle.textWidth, subHeading, "REDDIT.SUBHEADINGS", 251);
                        Point2d postIdLocation = new Point2d((dimstyle.origin.X + widthHeight.Item1) + ((dimstyle.cornerBase.X - dimstyle.origin.X) * 0.001), yTextLocation - mtextActualHeight);
                        string  postIdFormat   = string.Format("[REDDITCAD POST ID: {0} ]", postId);
                        DrawEntity.DrawText(postIdLocation, dimstyle.subHeadingTxtSize, dimstyle.textWidth, postIdFormat, "REDDIT.POSTID", 10);
                        PostIds.AddPost(postId, post);
                        i--;
                    }
                }
            }
            catch (Exception e)
            {
                System.Windows.MessageBox.Show(e.Message);
                result = "FAILED";
            }
            return(result);
        }
 private void ButtonCheckSubredditIsNotOkay_Click(object sender, RoutedEventArgs e)
 {
     try
     {
         if (!string.IsNullOrEmpty(TextBoxSubreddit.Text))
         {
             Subreddit = TextBoxSubreddit.Text;
             var check = new RedditSharp.Reddit();
             var sub   = check.GetSubreddit(Subreddit);
             ToggleButtonSubredditCheck();
             setIsButtonsEnabled(true);
             setSubreddit();
         }
     }
     catch (Exception)
     {
         ToggleButtonSubredditCheck();
         setIsButtonsEnabled(false);
     }
 }
Ejemplo n.º 23
0
        public async Task <IEnumerable <string> > GetInactiveModeratedSubreddits()
        {
            var userManager = HttpContext.Current.GetOwinContext().GetUserManager <ApplicationUserManager>();
            var ident       = userManager.FindByName(User.Identity.Name);

            if (ident.TokenExpires < DateTime.UtcNow)
            {
                Utilities.AuthUtils.GetNewToken(ident);
                userManager.Update(ident);
            }
            Utilities.SNWebAgent agent = new Utilities.SNWebAgent(ident.AccessToken);
            RedditSharp.Reddit   rd    = new RedditSharp.Reddit(agent, true);

            List <Models.Subreddit> activeSubs = await subBLL.GetActiveSubs();

            List <string> activeSubNames = activeSubs.Select(s => s.SubName.ToLower()).ToList();

            var subs = rd.User.ModeratorSubreddits.Where(s => s.ModPermissions.HasFlag(RedditSharp.ModeratorPermission.All) && !activeSubNames.Contains(s.Name.ToLower())).Select(s => s.Name);

            return(subs.OrderBy(s => s));
        }
Ejemplo n.º 24
0
        public async Task <IEnumerable <string> > GetInactiveModeratedSubreddits()
        {
            var agent = await agentPool.GetOrCreateWebAgentAsync(User.Identity.Name, async (uname, uagent, rlimit) =>
            {
                var ident = await _userManager.FindByNameAsync(User.Identity.Name);
                return(new RedditSharp.RefreshTokenPoolEntry(uname, ident.RefreshToken, rlimit, uagent));
            });

            RedditSharp.Reddit rd = new RedditSharp.Reddit(agent, true);

            List <Models.Subreddit> activeSubs = await subBLL.GetActiveSubs(User);

            List <string> activeSubNames = activeSubs.Select(s => s.SubName.ToLower()).ToList();
            List <string> inactiveSubs   = new List <string>();
            await rd.User.GetModeratorSubreddits().ForEachAsync(s => { if (s.ModPermissions.HasFlag(RedditSharp.ModeratorPermission.All) && !activeSubNames.Contains(s.Name.ToLower()))
                                                                       {
                                                                           inactiveSubs.Add(s.Name);
                                                                       }
                                                                });

            return(inactiveSubs.OrderBy(s => s));
        }
Ejemplo n.º 25
0
        static async Task MainAsync(string login, string password, int amountOfThreadsToRead)
        {
            NonApiTasks.CreateLog("Grabbing user...");
            var reddit = new RedditSharp.Reddit();

            NonApiTasks.CreateLog("Logging in...");
            reddit.LogIn(login, password);
            NonApiTasks.CreateLog("Subreddit...");
            var subreddit = reddit.GetSubreddit(SubredditName);

            NonApiTasks.CreateLog("Subscribing...");
            subreddit.Subscribe();
            NonApiTasks.CreateLog("Reading ASCII from file...");
            try
            {
                NonApiTasks.Get_ASCII_ArtFromFile();
            }
            catch (Exception e)
            {
                NonApiTasks.CreateExceptionLog(e);
            }
            NonApiTasks.CreateLog("Wait for a while... ");
            NonApiTasks.CreateLog("Waiting time is dependent on subreddit's size");

            while (subreddit.Posts.Any())
            {
                NonApiTasks.CreateLog($"SubReddit: {subreddit.Name} with {subreddit.Posts.Count()}" + $"posts and {subreddit.Subscribers} subs.");

                foreach (var post in subreddit.Hot.Take(amountOfThreadsToRead))
                {
                    NonApiTasks.CreateLog($"Here's {post.CommentCount} comments in that post {post.Title}");
                    foreach (Comment comment in post.Comments)
                    {
                        await Core.CommentManagement(comment);
                    }
                }
            }
        }
Ejemplo n.º 26
0
        public static void Run([TimerTrigger("0 */1 * * * *")] TimerInfo myTimer, TraceWriter log)
        {
            string        url    = "https://www.reddit.com/r/azure/new/.json";
            List <string> items  = new List <string>();
            var           reddit = new RedditSharp.Reddit();

            List <Child> children     = new List <Child>();
            WebClient    client       = new WebClient();
            string       text1        = client.DownloadString(url);
            RedditObject redditObject = JsonConvert.DeserializeObject <RedditObject>(text1);

            foreach (var post in redditObject.Data.Children)
            {
                if (DateTime.UtcNow.AddMinutes(-1) < post.Data.TimeStampDate)
                {
                    children.Add(post);
                    log.Info($"Reddit Post {post.Data.title} found");
                }
            }

            if (children.Count > 0)
            {
                var apiKey           = (ConfigurationManager.AppSettings["SendGridApiKey"]);
                var sgClient         = new SendGridClient(apiKey);
                var from             = new EmailAddress(ConfigurationManager.AppSettings["EmailAddress"]);
                var subject          = "New Reddit Post";
                var to               = new EmailAddress(ConfigurationManager.AppSettings["EmailAddress"]);
                var plainTextContent = new StringBuilder();
                foreach (var post in children)
                {
                    plainTextContent.AppendLine($"<a href='{post.Data.Url}'>{post.Data.title}</a><br />");
                }
                var msg = MailHelper.CreateSingleEmail(from, to, subject, plainTextContent.ToString(), plainTextContent.ToString());
                sgClient.SendEmailAsync(msg).Wait();
            }
            log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
        }
Ejemplo n.º 27
0
        public override async Task <bool> UpdateModsForSubAsync(Models.Subreddit sub, ClaimsPrincipal user)
        {
            if (!user.HasClaim("uri:snoonotes:admin", sub.SubName.ToLower()))
            {
                throw new UnauthorizedAccessException("You don't have 'Full' permissions to this subreddit!");
            }
            if (sub.SubName.ToLower() == Configuration["CabalSubreddit"].ToLower())
            {
                return(false);
            }

            sub = (await subDAL.GetSubreddits(new string[] { sub.SubName })).First();
            if (sub == null)
            {
                throw new Exception("Unrecognized subreddit");
            }
            string subName = sub.SubName.ToLower();
            //var usersWithAccess = userManager.Users.Where(u =>
            //    u.Claims.Where(c =>
            //        c.ClaimType == ClaimTypes.Role && c.ClaimValue == sub.SubName.ToLower()).Count() > 0).ToList();
            var usersWithAccess = await _userManager.GetUsersInRoleAsync(subName);

            //var x = userManager.Users.Where(u=>u.Claims.Select(c => c.ClaimValue).Contains("videos")).ToList();
            //var y = userManager.Users.Select(u => u.Claims);
            var ident = await _userManager.FindByNameAsync(user.Identity.Name);


            ClaimsIdentity curuser = user.Identity as ClaimsIdentity;

            RedditSharp.IWebAgent agent;
            if (ident.HasConfig)
            {
                agent = await agentPool.GetOrCreateWebAgentAsync(curuser.Name, (uname, uagent, rlimit) =>
                {
                    return(Task.FromResult(new RedditSharp.RefreshTokenPoolEntry(uname, ident.RefreshToken, rlimit, uagent)));
                });
            }
            else
            {
                agent = new RedditSharp.WebAgent();
            }
            RedditSharp.Reddit           rd = new RedditSharp.Reddit(agent);
            RedditSharp.Things.Subreddit subinfo;
            try
            {
                subinfo = await rd.GetSubredditAsync(sub.SubName);
            }
            catch
            {
                return(false);
            }
            var modsWithAccess = (await subinfo.GetModeratorsAsync()).Where(m => ((int)m.Permissions & sub.Settings.AccessMask) > 0);
            // get list of users to remove perms from
            var usersToRemove = usersWithAccess.Where(u => !modsWithAccess.Select(m => m.Name.ToLower()).Contains(u.UserName.ToLower())).ToList();

            foreach (var appuser in usersToRemove)
            {
                await _userManager.RemoveFromRoleAsync(appuser, subName);

                //if ( appuser.Claims.Where( c => c.ClaimType == "uri:snoonotes:admin" && c.ClaimValue == subName ).Count() > 0 ) {
                await _userManager.RemoveClaimAsync(appuser, new Claim("uri:snoonotes:admin", subName));

                //}
            }

            var usersToAdd = modsWithAccess.Where(m => ((int)m.Permissions & sub.Settings.AccessMask) > 0 && !usersWithAccess.Select(u => u.UserName.ToLower()).Contains(m.Name.ToLower()));

            foreach (var appuser in usersToAdd)
            {
                try
                {
                    var u = await _userManager.FindByNameAsync(appuser.Name);

                    if (u != null)
                    {
                        //assume it won't be adding a duplicate *holds breath*
                        if (appuser.Permissions.HasFlag(RedditSharp.ModeratorPermission.All))
                        {
                            await _userManager.AddToRoleAsync(u, subName);

                            await _userManager.AddClaimAsync(u, new Claim("uri:snoonotes:admin:", subName));
                        }
                        else if (((int)appuser.Permissions & sub.Settings.AccessMask) > 0)
                        {
                            await _userManager.AddToRoleAsync(u, subName);
                        }
                    }
                }
                catch
                {
                    //TODO something, mighta caught a non registered user?
                }
            }


            usersWithAccess = usersWithAccess.Union(await _userManager.GetUsersForClaimAsync(new Claim("uri:snoonotes:admin", subName))).ToList();

            var usersToCheckUpdates = usersWithAccess.Where(u => modsWithAccess.Select(m => m.Name.ToLower()).Contains(u.UserName.ToLower())).ToList();

            foreach (var appuser in usersToCheckUpdates)
            {
                var access = modsWithAccess.Where(m => m.Name.ToLower() == appuser.UserName.ToLower()).Single().Permissions;
                if (access == RedditSharp.ModeratorPermission.All)
                {
                    if (!appuser.Claims.Any(c => c.ClaimType == "uri:snoonotes:admin" && c.ClaimValue == subName))
                    {
                        await _userManager.AddClaimAsync(appuser, new Claim("uri:snoonotes:admin", subName));
                    }
                }
                else
                {
                    //if( appuser.Claims.Any( c => c.ClaimType == "uri:snoonotes:admin" && c.ClaimValue == subName ) ) {

                    await _userManager.RemoveClaimAsync(appuser, new Claim("uri:snoonotes:admin", subName));

                    //}
                }
            }
            return(true);
        }
Ejemplo n.º 28
0
        static void ProcessSub(Subreddit sub)
        {
            string subName = sub.SubName.ToLower();

            if (subName == cabalSub)
            {
                ProcessCabal(sub);
                return;
            }
            SNWebAgent agent = new SNWebAgent();

            RedditSharp.Reddit reddit = new RedditSharp.Reddit(agent);
            List <RedditSharp.ModeratorUser> mods;

            try {
                mods = GetModerators(sub.SubName, agent, reddit).ToList();
            }
            catch (System.Net.WebException ex) {
                System.Net.HttpWebResponse resp = ex.Response as System.Net.HttpWebResponse;
                if (resp.StatusCode != System.Net.HttpStatusCode.Forbidden)
                {
                    Console.Error.WriteLine(string.Format("Subreddit : '{0}' got an invalid status code while processing. Status Code : {1}", sub.SubName, resp.StatusDescription));
                    return;
                }
                try {
                    if (sub.ReadAccessUser != null)
                    {
                        RedditSharp.Things.Subreddit subreddit;
                        string     accessToken = users[sub.ReadAccessUser.ToLower()].GetToken(ap);
                        SNWebAgent uagent      = new SNWebAgent(accessToken);
                        reddit    = new RedditSharp.Reddit(uagent);
                        subreddit = reddit.GetSubreddit(sub.SubName);
                        mods      = subreddit.Moderators.ToList();
                    }
                    else
                    {
                        Console.Error.WriteLine(string.Format("Subreddit : '{0}' is private and has no Read access users.", sub.SubName));
                        return;
                    }
                }
                catch (Exception e) {
                    Console.Error.WriteLine(string.Format("Subreddit : '{0}' encountered an unknown error : {1}", sub.SubName, e.ToString()));
                    return;
                }
            }
            List <string> userIdsToRemove           = new List <string>();
            List <string> userIdsToRemoveAdmin      = new List <string>();
            List <ApplicationUserClaim> claimsToAdd = new List <ApplicationUserClaim>();

            foreach (RedditSharp.ModeratorUser mod in mods)
            {
                string modName = mod.Name.ToLower();
                if (users.ContainsKey(modName))
                {
                    //registered user
                    if (mod.Permissions.HasFlag(RedditSharp.ModeratorPermission.All))
                    {
                        if (!sub.SubAdmins.Contains(modName))
                        {
                            claimsToAdd.Add(
                                new ApplicationUserClaim()
                            {
                                ClaimType  = "urn:snoonotes:subreddits:" + subName + ":admin",
                                ClaimValue = "true",
                                UserId     = users[mod.Name.ToLower()].Id
                            });
                        }
                        if (!sub.Users.Contains(modName))
                        {
                            claimsToAdd.Add(
                                new ApplicationUserClaim()
                            {
                                ClaimType  = ClaimsIdentity.DefaultRoleClaimType,
                                ClaimValue = subName,
                                UserId     = users[mod.Name.ToLower()].Id
                            });
                        }
                    }
                    else if (((int)mod.Permissions & sub.AccessMask) > 0 && !sub.Users.Contains(modName))
                    {
                        claimsToAdd.Add(
                            new ApplicationUserClaim()
                        {
                            ClaimType  = ClaimsIdentity.DefaultRoleClaimType,
                            ClaimValue = subName,
                            UserId     = users[mod.Name.ToLower()].Id
                        });
                    }
                }
            }

            foreach (string user in sub.Users)
            {
                var mod = mods.SingleOrDefault(m => m.Name.ToLower() == user);

                if (mod == null || (((int)mod.Permissions & sub.AccessMask) <= 0 && !mod.Permissions.HasFlag(RedditSharp.ModeratorPermission.All)))
                {
                    userIdsToRemove.Add(users[user].Id);
                }
            }
            foreach (string admin in sub.SubAdmins)
            {
                var mod = mods.SingleOrDefault(m => m.Name.ToLower() == admin);
                if (mod == null || !mod.Permissions.HasFlag(RedditSharp.ModeratorPermission.All))
                {
                    userIdsToRemoveAdmin.Add(users[admin].Id);
                }
            }

            Subreddit.MakeChanges(userIdsToRemove, userIdsToRemoveAdmin, claimsToAdd, sub.SubName);
        }
Ejemplo n.º 29
0
        static IEnumerable <RedditSharp.ModeratorUser> GetModerators(string subName, RedditSharp.IWebAgent agent, RedditSharp.Reddit reddit)
        {
            var request        = agent.CreateGet(string.Format(ModeratorsUrl, subName));
            var response       = request.GetResponse();
            var responseString = agent.GetResponseString(response.GetResponseStream());
            var json           = JObject.Parse(responseString);
            var type           = json["kind"].ToString();

            if (type != "UserList")
            {
                throw new FormatException("Reddit responded with an object that is not a user listing.");
            }
            var data   = json["data"];
            var mods   = data["children"].ToArray();
            var result = new RedditSharp.ModeratorUser[mods.Length];

            for (var i = 0; i < mods.Length; i++)
            {
                var mod = new RedditSharp.ModeratorUser(reddit, mods[i]);
                result[i] = mod;
            }
            return(result);
        }
Ejemplo n.º 30
0
        static void ProcessCabal(Subreddit appSub)
        {
            string cabalUser = System.Configuration.ConfigurationManager.AppSettings["CabalUsername"];


            string     accessToken = ApplicationUser.GetUser(cabalUser).GetToken(ap);
            SNWebAgent agent       = new SNWebAgent(accessToken);

            RedditSharp.Reddit reddit = new RedditSharp.Reddit(agent, false);

            var redditSub = reddit.GetSubreddit(cabalSub);
            var contribs  = redditSub.Contributors.GetListing(int.MaxValue).ToList();

            List <string> userIdsToRemove           = new List <string>();
            List <string> userIdsToRemoveAdmin      = new List <string>();
            List <ApplicationUserClaim> claimsToAdd = new List <ApplicationUserClaim>();

            foreach (var user in contribs)
            {
                string uname = user.Name.ToLower();
                if (users.ContainsKey(uname))
                {
                    //user exists in system
                    if (!appSub.Users.Contains(uname))
                    {
                        //user doesn't have sub permissions but should
                        claimsToAdd.Add(
                            new ApplicationUserClaim()
                        {
                            ClaimType  = ClaimsIdentity.DefaultRoleClaimType,
                            ClaimValue = cabalSub,
                            UserId     = users[uname].Id
                        });
                    }
                }
            }

            foreach (string user in appSub.Users)
            {
                var contributor = contribs.FirstOrDefault(c => c.Name.ToLower() == user);
                if (contributor == null)
                {
                    userIdsToRemove.Add(users[user].Id);
                }
            }

            List <RedditSharp.ModeratorUser> mods = GetModerators(cabalSub, agent, reddit).ToList();

            foreach (var mod in mods)
            {
                string modName = mod.Name.ToLower();
                if (users.ContainsKey(modName))
                {
                    //user exists in system
                    if (mod.Permissions == RedditSharp.ModeratorPermission.All && !appSub.SubAdmins.Contains(modName))
                    {
                        claimsToAdd.Add(
                            new ApplicationUserClaim()
                        {
                            ClaimType  = "urn:snoonotes:subreddits:" + cabalSub + ":admin",
                            ClaimValue = "true",
                            UserId     = users[modName].Id
                        });
                        userIdsToRemove.Remove(users[modName].Id);
                    }
                    if (((int)mod.Permissions & appSub.AccessMask) <= 0)
                    {
                        userIdsToRemove.Remove(users[modName].Id);

                        if (!claimsToAdd.Any(c => c.ClaimValue == cabalSub) && !appSub.Users.Contains(modName))
                        {
                            claimsToAdd.Add(
                                new ApplicationUserClaim()
                            {
                                ClaimType  = ClaimsIdentity.DefaultRoleClaimType,
                                ClaimValue = cabalSub,
                                UserId     = users[modName].Id
                            });
                        }
                    }
                }
            }

            foreach (string admin in appSub.SubAdmins)
            {
                var mod = mods.FirstOrDefault(m => m.Name.ToLower() == admin);
                if (mod == null || mod.Permissions != RedditSharp.ModeratorPermission.All)
                {
                    userIdsToRemoveAdmin.Add(users[admin].Id);
                }
            }

            Subreddit.MakeChanges(userIdsToRemove, userIdsToRemoveAdmin, claimsToAdd, cabalSub);
        }
Ejemplo n.º 31
0
        /// <summary>
        /// Plots reddit post based on Post Id
        /// </summary>
        /// <param name="dimstyle">object containing dim scales based on the bounding box drawn by user</param>
        /// <param name="id">Reddit Post ID</param>
        /// <returns></returns>
        public static string PlotPost(EntityData dimstyle, string id)
        {
            string result = "OK";

            try
            {
                RedditSharp.Things.Post post = (RedditSharp.Things.Post)PostIds.GetPost(id);
                if (IsLinkedImg(post.Url.AbsoluteUri))
                {
                    //Will insert imageif link is a direct link to the image
                    string filename = GetImage(post.Url.AbsoluteUri);
                    DrawEntity.DrawImg(dimstyle.origin, filename, "REDDIT.IMGS", dimstyle.yLength * .05, dimstyle.yLength * .05);
                }
                //if it's only a link to imgur page...
                List <string> imgurLinks = GetImgurImgs(post.Url.AbsoluteUri);
                for (int i = 0; i < imgurLinks.Count; i++)
                {
                    Point3d imgLocation = new Point3d(dimstyle.origin.X + (i * (dimstyle.cornerBase.X - dimstyle.origin.X)), dimstyle.origin.Y, 0);
                    double  heightNWith = dimstyle.yLength * 0.025; //Basing height and with on the height of the border drawn by user. if width & height are seperated then img will be distorted
                    string  image       = GetImage(imgurLinks[i]);
                    DrawEntity.DrawImg(imgLocation, image, "REDDIT.IMGS", heightNWith, heightNWith);
                }
                RedditSharp.Reddit reddit = new RedditSharp.Reddit();
                if (post != null)
                {
                    //Post generated looks like this with indentation
                    int     i                  = -1; //Multiplier to help to align text in the Y axis.
                    double  yTextLocation      = dimstyle.origin.Y;
                    double  mtextActualHeight  = (dimstyle.yLength * .0025);
                    Point2d subHeadingLocation = new Point2d(dimstyle.origin.X, dimstyle.origin.Y);
                    foreach (var comment in post.Comments.Take(50))
                    {
                        Tuple <double, double> widthHeight;                                // A*C*T*U*A*L width & height of the mtext created
                        yTextLocation -= (mtextActualHeight - (dimstyle.yLength * .0025)); //adds height padding
                        Point2d commentLocation = new Point2d(dimstyle.origin.X, yTextLocation);
                        widthHeight = DrawEntity.DrawText(commentLocation, dimstyle.commentsSize, dimstyle.textWidth, comment.Body, "REDDIT.COMMENTS", 7);

                        mtextActualHeight  = widthHeight.Item2;
                        subHeadingLocation = new Point2d(dimstyle.origin.X, yTextLocation - mtextActualHeight);
                        string subHeading = string.Format("By:{0} | Upvotes: {1} | Submitted: {2}",
                                                          comment.Author, comment.Upvotes, post.Created.ToString());
                        DrawEntity.DrawText(subHeadingLocation, dimstyle.subCommentsSize, dimstyle.textWidth, subHeading, "REDDIT.COMMENTS.SUBHEADINGS", 251);
                        i--;
                        foreach (var subcomment in comment.Comments.Take(20))
                        {
                            yTextLocation     -= (mtextActualHeight - (dimstyle.yLength * .0025)); //adds height padding
                            commentLocation    = new Point2d(dimstyle.origin.X + ((dimstyle.cornerBase.X - dimstyle.origin.X) * 0.025), yTextLocation);
                            widthHeight        = DrawEntity.DrawText(commentLocation, (dimstyle.commentsSize * 0.75), dimstyle.textWidth, subcomment.Body, "REDDIT.COMMENTS", 7);
                            mtextActualHeight  = widthHeight.Item2;
                            subHeadingLocation = new Point2d(dimstyle.origin.X + ((dimstyle.cornerBase.X - dimstyle.origin.X) * 0.025), yTextLocation - mtextActualHeight);
                            subHeading         = string.Format("By:{0} | Upvotes: {1} | Submitted: {2}",
                                                               subcomment.Author, subcomment.Upvotes, subcomment.Created.ToString());
                            DrawEntity.DrawText(subHeadingLocation, (dimstyle.subCommentsSize * 0.75), dimstyle.textWidth, subHeading, "REDDIT.COMMENTS.SUBHEADINGS", 251);
                            i--;
                            foreach (var subsubcomment in subcomment.Comments.Take(15))
                            {
                                yTextLocation     -= (mtextActualHeight - (dimstyle.yLength * .0025)); //adds height padding
                                commentLocation    = new Point2d(dimstyle.origin.X + ((dimstyle.cornerBase.X - dimstyle.origin.X) * 0.05), yTextLocation);
                                widthHeight        = DrawEntity.DrawText(commentLocation, (dimstyle.commentsSize * 0.5), dimstyle.textWidth, subsubcomment.Body, "REDDIT.COMMENTS", 7);
                                mtextActualHeight  = widthHeight.Item2;
                                subHeadingLocation = new Point2d(dimstyle.origin.X + ((dimstyle.cornerBase.X - dimstyle.origin.X) * 0.05), yTextLocation - mtextActualHeight);
                                subHeading         = string.Format("By:{0} | Upvotes: {1} | Submitted: {2}", subsubcomment.Author, subsubcomment.Upvotes, subsubcomment.Created.ToString());
                                DrawEntity.DrawText(subHeadingLocation, (dimstyle.subCommentsSize * 0.5), dimstyle.textWidth, subHeading, "REDDIT.COMMENTS.SUBHEADINGS", 251);
                                i--;
                                foreach (var subsubsubcomment in subsubcomment.Comments.Take(10))
                                {
                                    yTextLocation     -= (mtextActualHeight - (dimstyle.yLength * .0025)); //adds height padding
                                    commentLocation    = new Point2d(dimstyle.origin.X + ((dimstyle.cornerBase.X - dimstyle.origin.X) * 0.075), yTextLocation);
                                    widthHeight        = DrawEntity.DrawText(commentLocation, (dimstyle.commentsSize * .25), dimstyle.textWidth, subsubsubcomment.Body, "REDDIT.COMMENTS", 7);
                                    mtextActualHeight  = widthHeight.Item2;
                                    subHeadingLocation = new Point2d(dimstyle.origin.X + ((dimstyle.cornerBase.X - dimstyle.origin.X) * 0.075), yTextLocation - mtextActualHeight);
                                    subHeading         = string.Format("By:{0} | Upvotes: {1} | Submitted: {2}", subsubsubcomment.Author, subsubsubcomment.Upvotes, subsubsubcomment.Created.ToString());
                                    DrawEntity.DrawText(subHeadingLocation, (dimstyle.subCommentsSize * 0.25), dimstyle.textWidth, subHeading, "REDDIT.COMMENTS.SUBHEADINGS", 251);
                                    i--;
                                }
                            }
                        }
                    }
                    Point3d endPt = new Point3d(dimstyle.cornerBase.X - ((dimstyle.cornerBase.X - dimstyle.origin.X) / 2), subHeadingLocation.Y - (subHeadingLocation.Y * 0.0025), 0);
                    DrawEntity.DrawBox(dimstyle.origin, endPt, "REDDIT.BORDER", 20);
                    DrawEntity.DrawDim(dimstyle.origin, new Point3d(endPt.X, dimstyle.origin.Y, 0), "POST ID : " + id, "REDDIT.COMMENTS", dimstyle.subHeadingTxtSize, 1.005);
                }
            }
            catch (Exception e)
            {
                System.Windows.MessageBox.Show(e.Message);
                result = "FAILED";
            }
            return(result);
        }
Ejemplo n.º 32
0
		public async static Task<bool> UpdateModsForSub( Models.Subreddit sub ) {
			if ( !ClaimsPrincipal.Current.HasClaim( "urn:snoonotes:subreddits:" + sub.SubName.ToLower() + ":admin", "true" ) ) {
				throw new UnauthorizedAccessException( "You don't have 'Full' permissions to this subreddit!" );
			}
            if ( sub.SubName.ToLower() == System.Configuration.ConfigurationManager.AppSettings["CabalSubreddit"].ToLower() ) return false;

			sub = (await new BLL.SubredditBLL().GetSubreddits( new string[] { sub.SubName } )).First();
			if ( sub == null ) {
				throw new Exception( "Unrecognized subreddit" );
			}
			string subName = sub.SubName.ToLower();
			var userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
			//var usersWithAccess = userManager.Users.Where(u =>
			//    u.Claims.Where(c =>
			//        c.ClaimType == ClaimTypes.Role && c.ClaimValue == sub.SubName.ToLower()).Count() > 0).ToList();
			var usersWithAccess = userManager.Users.Where( u => u.Claims.Select( c => c.ClaimValue ).Contains( subName ) ).ToList();

			//var x = userManager.Users.Where(u=>u.Claims.Select(c => c.ClaimValue).Contains("videos")).ToList();
			//var y = userManager.Users.Select(u => u.Claims);
			var ident = userManager.FindByName( ClaimsPrincipal.Current.Identity.Name );

			if ( ident.TokenExpires < DateTime.UtcNow ) {
				GetNewToken( ident );
				userManager.Update( ident );
			}
			ClaimsIdentity curuser = ClaimsPrincipal.Current.Identity as ClaimsIdentity;
			SNWebAgent agent;
			if ( curuser.HasClaim( "urn:snoonotes:scope", "read" ) ) {
				agent = new SNWebAgent( ident.AccessToken );
			}
			else {
				agent = new SNWebAgent();
			}
			RedditSharp.Reddit rd = new RedditSharp.Reddit( agent );
			RedditSharp.Things.Subreddit subinfo;
			try {
				subinfo = rd.GetSubreddit( sub.SubName );
			}
			catch {
				return false;
			}
			var modsWithAccess = subinfo.Moderators.Where( m => ( (int) m.Permissions & sub.Settings.AccessMask ) > 0 );
			// get list of users to remove perms from
			var usersToRemove = usersWithAccess.Where( u => !modsWithAccess.Select( m => m.Name.ToLower() ).Contains( u.UserName.ToLower() ) ).ToList();
			foreach ( var user in usersToRemove ) {
				userManager.RemoveClaim( user.Id, new Claim( ClaimTypes.Role, subName ) );
				if ( user.Claims.Where( c => c.ClaimType == "urn:snoonotes:subreddits:" + subName + ":admin" ).Count() > 0 ) {
					userManager.RemoveClaim( user.Id, new Claim( "urn:snoonotes:subreddits:" + subName + ":admin", "true" ) );

				}
			}

			var usersToAdd = modsWithAccess.Where( m => ( (int) m.Permissions & sub.Settings.AccessMask ) > 0 && !usersWithAccess.Select( u => u.UserName.ToLower() ).Contains( m.Name.ToLower() ) );

			foreach ( var user in usersToAdd ) {
				try {
					var u = userManager.FindByName( user.Name );
					if ( u != null ) {

						//assume it won't be adding a duplicate *holds breath*
						if ( user.Permissions.HasFlag( RedditSharp.ModeratorPermission.All ) ) {
							userManager.AddClaim( u.Id, new Claim( ClaimTypes.Role, subName ) );
							userManager.AddClaim( u.Id, new Claim( "urn:snoonotes:subreddits:" + subName + ":admin", "true" ) );
						}
						else if ( ( (int) user.Permissions & sub.Settings.AccessMask ) > 0 ) {
							userManager.AddClaim( u.Id, new Claim( ClaimTypes.Role, subName ) );
						}
					}
				}
				catch {
					//TODO something, mighta caught a non registered user?
				}
			}

			return true;
		}
Ejemplo n.º 33
0
		public static async Task UpdateModeratedSubreddits( Models.ApplicationUser ident, UserManager<Models.ApplicationUser> manager ) {
            string cabalSubName = System.Configuration.ConfigurationManager.AppSettings["CabalSubreddit"].ToLower();
			if ( ident.TokenExpires < DateTime.UtcNow ) {
				GetNewToken( ident );
			}
			Utilities.SNWebAgent agent = new SNWebAgent( ident.AccessToken );
			RedditSharp.Reddit rd = new RedditSharp.Reddit( agent, true );
			var subs = rd.User.ModeratorSubreddits.ToList<RedditSharp.Things.Subreddit>();

			List<string> currentRoles = ident.Claims.Where( x => x.ClaimType == roleType ).Select( r => r.ClaimValue ).ToList<string>();

			List<Models.Subreddit> activeSubs = await new BLL.SubredditBLL().GetActiveSubs();
			List<string> activeSubNames = activeSubs.Select( s => s.SubName.ToLower() ).ToList();

			List<IdentityUserClaim> currentAdminRoles = ident.Claims.Where( c => c.ClaimType.StartsWith( "urn:snoonotes:subreddits:" ) ).ToList();
			List<Claim> rolesToAdd = new List<Claim>();
			List<Claim> rolesToRemove = new List<Claim>();
			foreach ( string role in currentRoles ) {
				var sub = subs.Find( s => s.Name.ToLower() == role );
				if ( activeSubNames.Contains( role ) ) {

					if ( sub != null ) {
						//if they already have the role and they still have the correct access
						if ( sub.ModPermissions.HasFlag( RedditSharp.ModeratorPermission.All ) || ( (int) sub.ModPermissions & activeSubs.Where( s => s.SubName.ToLower() == role ).Select( s => s.Settings.AccessMask ).First() ) > 0 ) {
							//Check if "full" permissions
							if ( sub.ModPermissions.HasFlag( RedditSharp.ModeratorPermission.All ) && !ClaimsPrincipal.Current.HasClaim( "urn:snoonotes:subreddits:" + role + ":admin", "true" ) ) {
								//has admin permissions but doesn't have role, so add it
								rolesToAdd.Add( new Claim( "urn:snoonotes:subreddits:" + role + ":admin", "true" ) );
							}
							else if ( !sub.ModPermissions.HasFlag( RedditSharp.ModeratorPermission.All ) && ClaimsPrincipal.Current.HasClaim( "urn:snoonotes:subreddits:" + role + ":admin", "true" ) ) {
								//doesn't have admin permission, but does have role, so remove it
								rolesToRemove.Add( new Claim( "urn:snoonotes:subreddits:" + role + ":admin", "true" ) );
							}
						}
						else {
							//lost da permissions
							rolesToRemove.Add( new Claim( roleType, role ) );
							if ( !sub.ModPermissions.HasFlag( RedditSharp.ModeratorPermission.All ) && ClaimsPrincipal.Current.HasClaim( "urn:snoonotes:subreddits:" + role + ":admin", "true" ) ) rolesToRemove.Add( new Claim( "urn:snoonotes:subreddits:" + role + ":admin", "true" ) );
						}

						//User already has sub as a role and is still a mod
						subs.Remove( sub );
					}
					else {
						rolesToRemove.Add( new Claim( roleType, role ) );
					}
				}
				else {
					//sub was deactivated, add it to remove.
					rolesToRemove.Add( new Claim( roleType, role ) );
					if ( ClaimsPrincipal.Current.HasClaim( "urn:snoonotes:subreddits:" + role + ":admin", "true" ) ) rolesToRemove.Add( new Claim( "urn:snoonotes:subreddits:" + role + ":admin", "true" ) );
				}

			}
			//subs now only contains subs that don't exist as roles
			foreach ( RedditSharp.Things.Subreddit sub in subs ) {
				string subname = sub.Name.ToLower();

				if ( activeSubNames.Contains( subname ) ) {
					if ( sub.ModPermissions.HasFlag( RedditSharp.ModeratorPermission.All ) ) {
						rolesToAdd.Add( new Claim( roleType, subname ) );
						rolesToAdd.Add( new Claim( "urn:snoonotes:subreddits:" + subname + ":admin", "true" ) );
					}
					else if ( ( (int) sub.ModPermissions & activeSubs.Where( s => s.SubName.ToLower() == subname ).Select( s => s.Settings.AccessMask ).First() ) > 0 ) {
						rolesToAdd.Add( new Claim( roleType, subname ) );
					}
				}
			}

			foreach ( var adminRole in currentAdminRoles ) {
				string subName = adminRole.ClaimType.Replace( "urn:snoonotes:subreddits:", "" ).Replace( ":admin", "" ).ToLower();
				if ( subs.Exists( s => s.Name.ToLower() == subName && !s.ModPermissions.HasFlag( RedditSharp.ModeratorPermission.All ) ) ) {
					ident.Claims.Remove( adminRole );
				}
			}
            string cabalUserName = System.Configuration.ConfigurationManager.AppSettings["CabalUsername"];
            var cabalUser = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindByName( cabalUserName );
            if(cabalUser.TokenExpires < DateTime.UtcNow ) {
                GetNewToken( cabalUser );
            }
            agent = new SNWebAgent( cabalUser.AccessToken );

            RedditSharp.Reddit reddit = new RedditSharp.Reddit( agent, false );

            var redditSub = reddit.GetSubreddit( cabalSubName );
            var contribs = redditSub.Contributors;

            if(contribs.Any(c=>c.Name.ToLower() == ident.UserName.ToLower() ) ) {
                var cabalClaim = new Claim( roleType, cabalSubName );
                rolesToRemove.RemoveAll( r => r.Type == cabalClaim.Type && r.Value == cabalClaim.Value );
                if ( !currentRoles.Contains( cabalSubName ) && !rolesToAdd.Any(ar => ar.Value == cabalClaim.Value && ar.Type == cabalClaim.Type)) {
                    rolesToAdd.Add( cabalClaim );
                }
            }

            foreach ( Claim c in rolesToRemove ) {
                manager.RemoveClaim( ident.Id, c );
				//ident.Claims.Remove( ident.Claims.First( uc => uc.UserId == ident.Id && uc.ClaimType == c.Type && uc.ClaimValue == c.Value ) );
			}
			foreach ( Claim c in rolesToAdd ) {
                //manager.AddClaim( ident.Id, c );
				ident.Claims.Add( new IdentityUserClaim() { ClaimType = c.Type, ClaimValue = c.Value, UserId = ident.Id } );
			}

		}
Ejemplo n.º 34
0
 public RedditSharpRedditService(RedditSharp.Reddit reddit,
                                 RedditState redditState)
 {
     _reddit      = reddit;
     _redditState = redditState;
 }
Ejemplo n.º 35
0
        static void ProcessSub( Subreddit sub )
        {
            string subName = sub.SubName.ToLower();
            if ( subName == cabalSub ) {
                ProcessCabal( sub );
                return;
            }
            SNWebAgent agent = new SNWebAgent();
            RedditSharp.Reddit reddit = new RedditSharp.Reddit( agent );
            List<RedditSharp.ModeratorUser> mods;
            try {
                mods = GetModerators( sub.SubName, agent, reddit ).ToList();
            }
            catch ( System.Net.WebException ex ) {
                System.Net.HttpWebResponse resp = ex.Response as System.Net.HttpWebResponse;
                if ( resp.StatusCode != System.Net.HttpStatusCode.Forbidden ) {
                    Console.Error.WriteLine( string.Format( "Subreddit : '{0}' got an invalid status code while processing. Status Code : {1}", sub.SubName, resp.StatusDescription ) );
                    return;
                }
                try {
                    if ( sub.ReadAccessUser != null ) {
                        RedditSharp.Things.Subreddit subreddit;
                        string accessToken = users[sub.ReadAccessUser.ToLower()].GetToken( ap );
                        SNWebAgent uagent = new SNWebAgent( accessToken );
                        reddit = new RedditSharp.Reddit( uagent );
                        subreddit = reddit.GetSubreddit( sub.SubName );
                        mods = subreddit.Moderators.ToList();
                    }
                    else {
                        Console.Error.WriteLine( string.Format( "Subreddit : '{0}' is private and has no Read access users.", sub.SubName ) );
                        return;
                    }
                }
                catch ( Exception e ) {
                    Console.Error.WriteLine( string.Format( "Subreddit : '{0}' encountered an unknown error : {1}", sub.SubName, e.ToString() ) );
                    return;
                }
            }
            List<string> userIdsToRemove = new List<string>();
            List<string> userIdsToRemoveAdmin = new List<string>();
            List<ApplicationUserClaim> claimsToAdd = new List<ApplicationUserClaim>();
            foreach ( RedditSharp.ModeratorUser mod in mods ) {
                string modName = mod.Name.ToLower();
                if ( users.ContainsKey( modName ) ) {
                    //registered user
                    if ( mod.Permissions.HasFlag( RedditSharp.ModeratorPermission.All ) ) {
                        if ( !sub.SubAdmins.Contains( modName ) ) {
                            claimsToAdd.Add(
                                new ApplicationUserClaim() {
                                    ClaimType = "urn:snoonotes:subreddits:" + subName + ":admin",
                                    ClaimValue = "true",
                                    UserId = users[mod.Name.ToLower()].Id
                                } );
                        }
                        if ( !sub.Users.Contains( modName ) ) {
                            claimsToAdd.Add(
                                new ApplicationUserClaim() {
                                    ClaimType = ClaimsIdentity.DefaultRoleClaimType,
                                    ClaimValue = subName,
                                    UserId = users[mod.Name.ToLower()].Id
                                } );
                        }
                    }
                    else if ( ( (int) mod.Permissions & sub.AccessMask ) > 0 && !sub.Users.Contains( modName ) ) {
                        claimsToAdd.Add(
                            new ApplicationUserClaim() {
                                ClaimType = ClaimsIdentity.DefaultRoleClaimType,
                                ClaimValue = subName,
                                UserId = users[mod.Name.ToLower()].Id
                            } );
                    }
                }
            }

            foreach ( string user in sub.Users ) {
                var mod = mods.SingleOrDefault( m => m.Name.ToLower() == user );

                if ( mod == null || ( ( (int) mod.Permissions & sub.AccessMask ) <= 0 && !mod.Permissions.HasFlag( RedditSharp.ModeratorPermission.All ) ) ) {
                    userIdsToRemove.Add( users[user].Id );
                }
            }
            foreach ( string admin in sub.SubAdmins ) {
                var mod = mods.SingleOrDefault( m => m.Name.ToLower() == admin );
                if ( mod == null || !mod.Permissions.HasFlag( RedditSharp.ModeratorPermission.All ) ) {
                    userIdsToRemoveAdmin.Add( users[admin].Id );
                }
            }

            Subreddit.MakeChanges( userIdsToRemove, userIdsToRemoveAdmin, claimsToAdd, sub.SubName );
        }
Ejemplo n.º 36
0
 public async Task<Modules.PostAnalysisResults> AnalyzePost(string id ) {
     var post = new RedditSharp.Reddit( Program.Agent, false ).GetPost( new Uri(id) );
     Modules.PostAnalysisResults results = await Program.AnalyzePost( post );
     return results;
 }
Ejemplo n.º 37
0
        static void ProcessCabal( Subreddit appSub )
        {
            string cabalUser = System.Configuration.ConfigurationManager.AppSettings["CabalUsername"];

            string accessToken = ApplicationUser.GetUser( cabalUser ).GetToken( ap );
            SNWebAgent agent = new SNWebAgent( accessToken );

            RedditSharp.Reddit reddit = new RedditSharp.Reddit( agent, false );

            var redditSub = reddit.GetSubreddit( cabalSub );
            var contribs = redditSub.Contributors.GetListing(int.MaxValue).ToList();

            List<string> userIdsToRemove = new List<string>();
            List<string> userIdsToRemoveAdmin = new List<string>();
            List<ApplicationUserClaim> claimsToAdd = new List<ApplicationUserClaim>();

            foreach ( var user in contribs ) {
                string uname = user.Name.ToLower();
                if ( users.ContainsKey( uname ) ) {
                    //user exists in system
                    if ( !appSub.Users.Contains( uname ) ) {
                        //user doesn't have sub permissions but should
                        claimsToAdd.Add(
                            new ApplicationUserClaim() {
                                ClaimType = ClaimsIdentity.DefaultRoleClaimType,
                                ClaimValue = cabalSub,
                                UserId = users[uname].Id
                            } );
                    }
                }
            }

            foreach ( string user in appSub.Users ) {
                var contributor = contribs.FirstOrDefault( c => c.Name.ToLower() == user );
                if ( contributor == null ) {
                    userIdsToRemove.Add( users[user].Id );
                }
            }

            List<RedditSharp.ModeratorUser> mods = GetModerators( cabalSub, agent, reddit ).ToList();

            foreach ( var mod in mods ) {
                string modName = mod.Name.ToLower();
                if ( users.ContainsKey( modName ) ) {
                    //user exists in system
                    if ( mod.Permissions == RedditSharp.ModeratorPermission.All && !appSub.SubAdmins.Contains( modName ) ) {
                        claimsToAdd.Add(
                            new ApplicationUserClaim() {
                                ClaimType = "urn:snoonotes:subreddits:" + cabalSub + ":admin",
                                ClaimValue = "true",
                                UserId = users[modName].Id
                            } );
                        userIdsToRemove.Remove( users[modName].Id );
                    }
                    if ( ( (int) mod.Permissions & appSub.AccessMask ) <= 0 ) {

                        userIdsToRemove.Remove( users[modName].Id );

                        if ( !claimsToAdd.Any( c => c.ClaimValue == cabalSub ) && !appSub.Users.Contains(modName )) {
                            claimsToAdd.Add(
                                new ApplicationUserClaim() {
                                    ClaimType = ClaimsIdentity.DefaultRoleClaimType,
                                    ClaimValue = cabalSub,
                                    UserId = users[modName].Id
                                } );
                        }

                    }

                }
            }

            foreach ( string admin in appSub.SubAdmins ) {
                var mod = mods.FirstOrDefault( m => m.Name.ToLower() == admin );
                if ( mod == null || mod.Permissions != RedditSharp.ModeratorPermission.All ) {
                    userIdsToRemoveAdmin.Add( users[admin].Id );
                }
            }

            Subreddit.MakeChanges( userIdsToRemove, userIdsToRemoveAdmin, claimsToAdd, cabalSub );
        }