Exemplo n.º 1
0
        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());
            }
        }
Exemplo n.º 2
0
        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());
            }
        }
Exemplo n.º 3
0
        public SubredditSettings Validate(SubredditSettings subredditSettings)
        {
            CheckNull(subredditSettings, "Reddit API returned empty response container.");

            return(subredditSettings);
        }
Exemplo n.º 4
0
        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);
            }
        }