示例#1
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);
            }
        }