Example #1
0
        internal static void PrepareCampaigns()
        {
            Dictionary <string, KeyValuePair <long, string> > installed_campaigns = new Dictionary <string, KeyValuePair <long, string> >();
            Dictionary <string, KeyValuePair <long, string> > packaged_campaigns  = new Dictionary <string, KeyValuePair <long, string> >();

            DirectoryInfo campaign_root = new DirectoryInfo(Variables.CampaignsDataFolder());

            // List installed campaigns
            foreach (DirectoryInfo installed in campaign_root.GetDirectories())
            {
                FileInfo manifest_file = new FileInfo(Path.Combine(installed.FullName, "campaign.json"));
                if (manifest_file.Exists)
                {
                    Serializer <Campaign> manifest = new Serializer <Campaign>(SerializerType.Json, manifest_file.FullName, true);
                    installed_campaigns[manifest.Data.guid] = new KeyValuePair <long, string>(manifest.Data.build, installed.FullName);
                    Plugin.Log.Warning($"Campaign installation detected: {manifest.Data.name} ({manifest.Data.guid}_{manifest.Data.build})");
                }
            }
            Plugin.Log.Error($"{installed_campaigns.Count} installed campaign(s) detected");

            // List packaged campaigns
            foreach (FileInfo packaged in campaign_root.GetFiles("*.campaign", SearchOption.TopDirectoryOnly))
            {
                Plugin.Log.Warning($"Reading {packaged.Name}");

                try
                {
                    using (ZipArchive archive = ZipArchive.Open(packaged))
                    {
                        foreach (ZipArchiveEntry entry in from item in archive.Entries where string.Equals(item.Key, "manifest", StringComparison.InvariantCultureIgnoreCase) select item)
                        {
                            string   manifest_data = entry.ReadContent();
                            Manifest manifest      = null;
#if JSON_NEWTONSOFT
                            manifest = JsonConvert.DeserializeObject <Manifest>(manifest_data);
#endif
#if JSON_LITJSON
                            manifest = JsonMapper.ToObject <Manifest>(manifest_data);
#endif
                            Plugin.Log.Warning($"Campaign package: {packaged.Name} ({manifest.guid}_{manifest.build})");
                            if (manifest is null)
                            {
                                break;
                            }
                            else
                            {
                                if (packaged_campaigns.ContainsKey(manifest.guid))
                                {
                                    long listed_version = packaged_campaigns[manifest.guid].Key;
                                    if (manifest.build > listed_version)
                                    {
                                        Plugin.Log.Warning($"Updating {manifest.name} ({manifest.guid}_{manifest.build})");
                                        packaged_campaigns[manifest.guid] = new KeyValuePair <long, string>(manifest.build, packaged.FullName);
                                        break;
                                    }
                                }
                                else
                                {
                                    if (!installed_campaigns.ContainsKey(manifest.guid) || manifest.build > installed_campaigns[manifest.guid].Key)
                                    {
                                        Plugin.Log.Warning($"Adding {manifest.name} ({manifest.guid}_{manifest.build})");
                                        packaged_campaigns[manifest.guid] = new KeyValuePair <long, string>(manifest.build, packaged.FullName);
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    Plugin.Log.Exception(e);
                }
            }
            Plugin.Log.Error($"{packaged_campaigns.Count} packaged campaign(s) registered");

            // Extract campaigns and update already installed ones if needed
            foreach (var package in packaged_campaigns)
            {
                FileInfo campaign_package = new FileInfo(package.Value.Value);
                if (installed_campaigns.ContainsKey(package.Key))
                {
                    if (package.Value.Key > installed_campaigns[package.Key].Key)
                    {
                        DirectoryInfo extract_dir = new DirectoryInfo(installed_campaigns[package.Key].Value);

                        ExtractCampaign(campaign_package, extract_dir, package.Value.Key);
                    }
                }
                else
                {
                    string extract_dir = Path.Combine(campaign_root.FullName, package.Key);

                    ExtractCampaign(campaign_package, new DirectoryInfo(extract_dir), package.Value.Key);
                }
            }
        }