public override async Task <IEnumerable <Subreddit> > GetSubreddits(IEnumerable <string> subnames) { using (SqlConnection conn = new SqlConnection(connstring)) { string query = @" select s.SubredditID, s.SubName, s.Active, s.SentinelActive, s.DirtbagUrl, s.DirtbagUsername, s.DirtbagPassword, ss.AccessMask, ss.TempBanID, ss.PermBanID, nt.NoteTypeID, s.SubName,nt.DisplayName,nt.ColorCode,nt.DisplayOrder,nt.Bold,nt.Italic,nt.IconString, nt.Disabled from Subreddits s left join SubredditSettings ss on ss.SubRedditID = s.SubredditID left join NoteTypes nt on nt.SubredditID = s.SubredditID where s.SubName in @subnames ORDER BY nt.DisplayOrder asc "; var lookup = new Dictionary <int, Subreddit>(); var result = await conn.QueryAsync <Subreddit, DirtbagSettings, SubredditSettings, NoteType, Subreddit>(query, (s, bs, ss, nt) => { Subreddit sub; if (!lookup.TryGetValue(s.SubredditID, out sub)) { lookup.Add(s.SubredditID, sub = s); } if (ss == null && sub.Settings == null) { ss = new SubredditSettings(); sub.Settings = ss; } else if (sub.Settings == null) { sub.Settings = ss; } sub.BotSettings = bs; sub.Settings.NoteTypes.Add(nt); return(sub); }, splitOn : "DirtbagUrl,AccessMask,NoteTypeID", param : new { subnames }); //string noteTypeQuery = "select nt.NoteTypeID,s.SubName,nt.DisplayName,nt.ColorCode,nt.DisplayOrder,nt.Bold,nt.Italic from NoteTypes nt " // + " inner join Subreddits s on s.SubredditID = nt.SubredditID" // + " where s.SubName in @subnames"; //var noteTypes = con.Query<NoteType>(noteTypeQuery, new { subnames }); return(lookup.Values.AsEnumerable()); } }
public virtual async Task <List <Subreddit> > GetActiveSubs() { using (SqlConnection conn = new SqlConnection(connstring)) { string query = "select s.SubredditID, s.SubName, s.Active, s.SentinelActive, ss.AccessMask, ss.TempBanID, ss.PermBanID from Subreddits s left join " + "SubredditSettings ss on ss.SubRedditID = s.SubredditID " + "where active = 1"; var result = await conn.QueryAsync <Subreddit, SubredditSettings, Subreddit>(query, (s, ss) => { if (ss == null) { ss = new SubredditSettings(); } s.Settings = ss; return(s); }, splitOn : "AccessMask"); return(result.Where(r => !excludeSubs.Contains(r.SubName.ToLower())).ToList()); } }
public SubredditSettings Validate(SubredditSettings subredditSettings) { CheckNull(subredditSettings, "Reddit API returned empty response container."); return(subredditSettings); }
public void Execute(string[] args, Reddit reddit) { if (args.Length != 3) { Console.WriteLine("Invalid usage. See 'srutil help backup' for more information."); return; } var subreddit = reddit.GetSubreddit(args[1]); // Verify archive var settings = new SubredditSettings(reddit, subreddit); var styles = new SubredditStyle(reddit, subreddit); var serializer = new JsonSerializer(); using (var file = new ZipFile(File.OpenRead(args[2]))) { if (file.GetEntry("stylesheet.css") == null || file.GetEntry("settings.json") == null || file.GetEntry("flair.json") == null) { Console.WriteLine("{0} is not a valid subreddit backup.", args[2]); return; } Console.WriteLine("Resetting {0} to default settings...", subreddit.DisplayName); var reset = new Reset(); reset.Execute(new[] { "reset", subreddit.DisplayName, "all" }, reddit); foreach (ZipEntry entry in file) { if (!entry.IsFile) { continue; } if (entry.Name == "stylesheet.css") { var stream = new StreamReader(file.GetInputStream(entry)); styles.CSS = stream.ReadToEnd(); // We udpate the CSS last to avoid errors with images } else if (entry.Name == "settings.json") { Console.WriteLine("Restoring settings..."); var stream = new StreamReader(file.GetInputStream(entry)); serializer.Populate(new JsonTextReader(stream), settings); settings.UpdateSettings(); } else if (entry.Name == "flair.json") // TODO: Link flair templates, selected flair for users { var stream = new StreamReader(file.GetInputStream(entry)); var flair = serializer.Deserialize <UserFlairTemplate[]>(new JsonTextReader(stream)); if (flair.Any()) { Console.WriteLine("Restoring user flair templates..."); int progress = 1; int left = Console.CursorLeft; int top = Console.CursorTop; foreach (var item in flair) { subreddit.AddFlairTemplate(item.CssClass, FlairType.User, item.Text, true); Console.CursorLeft = left; Console.CursorTop = top; Console.WriteLine("{0}/{1}", progress++, flair.Length); } } } else if (entry.Name == "header.png" || entry.Name == "header.jpg") { var image = Path.GetFileName(entry.Name); Console.WriteLine("Restoring header image..."); var stream = file.GetInputStream(entry); var data = new byte[entry.Size]; stream.Read(data, 0, (int)entry.Size); subreddit.UploadHeaderImage(entry.Name, Path.GetExtension(entry.Name) == "png" ? ImageType.PNG : ImageType.JPEG, data); } else if (entry.Name.StartsWith("images/")) { var image = Path.GetFileName(entry.Name); Console.WriteLine("Restoring image: " + image); var stream = file.GetInputStream(entry); var data = new byte[entry.Size]; stream.Read(data, 0, (int)entry.Size); styles.UploadImage(Path.GetFileNameWithoutExtension(image), Path.GetExtension(image) == ".png" ? ImageType.PNG : ImageType.JPEG, data); } } Console.WriteLine("Restoring CSS..."); styles.UpdateCss(); Console.WriteLine("Finished restoring {0}", subreddit.DisplayName); } }