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); }
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); }
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); }
public SelfPromotionCombustor(SelfPromotionCombustorSettings settings, RedditSharp.Reddit client) : this() { RedditClient = client; Settings = settings; PercentageThreshold = settings.PercentageThreshold; IncludePostInPercentage = settings.IncludePostInPercentage; RemovalFlair = settings.RemovalFlair; GracePeriod = settings.GracePeriod; }
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)); }
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); }
public RedditSharpActivityMonitor(RedditSharp.Reddit reddit, Subreddit subreddit, IActivityDispatcher activityDispatcher, IDB4Repository db4Repository, ILogger logger) { _reddit = reddit; _subreddit = subreddit; _activityDispatcher = activityDispatcher; _db4Repository = db4Repository; _logger = logger; }
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); }
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(); } }
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); }
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()); }
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); }
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 ); }
/// <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); }
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()); }
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); } }
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)); }
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)); }
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); } } } }
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}"); }
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); }
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); }
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); }
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); }
/// <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); }
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; }
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 } ); } }
public RedditSharpRedditService(RedditSharp.Reddit reddit, RedditState redditState) { _reddit = reddit; _redditState = redditState; }
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 ); }
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; }
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 ); }