public static int CheckMod(string modName, string singleModVersion, ModInfo modInfo, MetadataCache metadataCache)
 {
     CacheInfo ci = new CacheInfo();
     ci.version = modInfo.version;
     ci.state = "fail-install";
     CleanKSP();
     if (!InstallMod(modName, singleModVersion))
     {
         metadataCache.AddCacheData(modName, ci);
         return -1;
     }
     if (!FilesOK(modName, modInfo))
     {
         ci.state = "fail-files";
         metadataCache.AddCacheData(modName, ci);
         return -2;
     }
     ci.state = "ok";
     metadataCache.AddCacheData(modName, ci);
     if (File.Exists("errors/" + modName + ".txt"))
     {
         File.Delete("errors/" + modName + ".txt");
     }
     return 0;
 }
 public static string GetModHash(string modName, ModInfo modInfo)
 {
     string url = Uri.UnescapeDataString(modInfo.downloadUrl);
     //Differences?
     url = url.Replace("&", "%26");
     using (var sha1 = new SHA1Managed())
     {
         byte[] hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(url));
         string retVal = BitConverter.ToString(hash).Replace("-", "").Substring(0, 8);
         return retVal;
     }
 }
 public static string GetGameDataDir(string modName, ModInfo modInfo)
 {
     string[] dirs = Directory.GetDirectories("temp/extract", "*", SearchOption.AllDirectories);
     foreach (string dirName in dirs)
     {
         if (Path.GetFileName(dirName).ToLower() == "gamedata")
         {
             return dirName.Substring("temp/extract/".Length);
         }
     }
     return "";
 }
        public static Dictionary<string, ModInfo> GetModInfo(string KSP_VERSION, JToken registry)
        {
            Dictionary<string, ModInfo> modInfo = new Dictionary<string, ModInfo>();
            foreach (JProperty mod in registry["available_modules"])
            {
                string currentModName = mod.Name;
                bool versionOk = false;

                foreach (JProperty versionProperty in mod.Value["module_version"])
                {
                    JObject versionKeys = (JObject)versionProperty.Value;
                    ModInfo mi = new ModInfo();
                    mi.version = (string)versionKeys["version"];
                    mi.downloadUrl = (string)versionKeys["download"];
                    JToken installs = versionKeys["install"];
                    if (installs.Type != JTokenType.Null)
                    {
                        foreach (JObject jobj in (JArray)installs)
                        {
                            string file = (string)jobj["file"];
                            string installs_to = (string)jobj["install_to"];
                            mi.installs.Add(new KeyValuePair<string,string>(file, installs_to));
                        }
                    }
                    string ksp_version = (string)versionKeys["ksp_version"];
                    string ksp_version_min = (string)versionKeys["ksp_version"];
                    string ksp_version_max = (string)versionKeys["ksp_version"];
                    versionOk = (ksp_version == KSP_VERSION) || VersionCompatible(KSP_VERSION, ksp_version_min, ksp_version_max);
                    if (versionOk)
                    {
                        modInfo.Add(currentModName, mi);
                        break;
                    }
                }
                if (versionOk)
                {
                    continue;
                }
            }
            return modInfo;
        }
        public static bool FilesOK(string modName, ModInfo modInfo)
        {
            Console.WriteLine("Checking files!");
            //string fileName = CkanUtils.GetCacheName(modName, modInfo);
            string fullName = null;
            string extractDirectoryName = "temp/extract/";
            string[] dirFiles = Directory.GetFiles("downloads");
            string fileHash = CkanUtils.GetModHash(modName, modInfo);
            foreach (string fileName in dirFiles)
            {
                if (Path.GetFileName(fileName).StartsWith(fileHash))
                {
                    fullName = fileName;
                    break;
                }
            }
            if (fullName == null)
            {
                Console.WriteLine("Checking files FAILED, No zip file!");
                return false;
            }
            if (Directory.Exists(extractDirectoryName))
            {
                Directory.Delete(extractDirectoryName, true);
            }
            Directory.CreateDirectory(extractDirectoryName);
            ZipFile.ExtractToDirectory(fullName, extractDirectoryName);
            string gamedataDir = workarounds.customRootFolders.ContainsKey(modName) ? workarounds.customRootFolders[modName] : CkanUtils.GetGameDataDir(fullName, modInfo);
            if (gamedataDir == null)
            {
                Console.WriteLine("GameData Directory was not found!");
                return false;
            }

            bool ok = CheckDirectory(modName, "temp/extract/" + gamedataDir, "/");
            Console.WriteLine("Checking done!");
            return ok;
        }
 public static Dictionary<string, ModInfo> GetSingleModInfo(string KSP_VERSION, JToken registry, string modName, string modVersion)
 {
     Dictionary<string, ModInfo> modInfo = new Dictionary<string, ModInfo>();
     JObject mod = (JObject)registry["available_modules"][modName];
     if (mod == null)
     {
         return modInfo;
     }
     bool versionOk = false;
     foreach (JProperty versionProperty in mod["module_version"])
     {
         JObject versionKeys = (JObject)versionProperty.Value;
         ModInfo mi = new ModInfo();
         mi.version = (string)versionKeys["version"];
         mi.downloadUrl = (string)versionKeys["download"];
         JToken installs = versionKeys["install"];
         if (installs.Type != JTokenType.Null)
         {
             foreach (JObject jobj in (JArray)installs)
             {
                 string file = (string)jobj["file"];
                 string installs_to = (string)jobj["install_to"];
                 mi.installs.Add(new KeyValuePair<string,string>(file, installs_to));
             }
         }
         string ksp_version = (string)versionKeys["ksp_version"];
         string ksp_version_min = (string)versionKeys["ksp_version"];
         string ksp_version_max = (string)versionKeys["ksp_version"];
         versionOk = (ksp_version == KSP_VERSION) || VersionCompatible(KSP_VERSION, ksp_version_min, ksp_version_max);
         if (versionOk && (modVersion == null || mi.version == modVersion))
         {
             modInfo.Add(modName, mi);
             return modInfo;
         }
     }
     return modInfo;
 }