//public async void UpdateAllScripts(ScriptConfigModel selectedScript)
        //{
        //    await DownLoadScript(selectedScript.ScriptPath);
        //    selectedScript.LastCommitTime = selectedScript.PreUpdateTime.Value;
        //    selectedScript.IsUpdateAvailable = false;
        //    selectedScript.PreUpdateTime = null;
        //    UpdateScriptConfig();
        //}

        public void DeleteScript(ScriptConfigModel selectedScript)
        {
            if (File.Exists(MainViewModel.AssemblyPath + selectedScript.ScriptLocalPath))
            {
                File.Delete(MainViewModel.AssemblyPath + selectedScript.ScriptLocalPath);
            }
            ScriptsData.Remove(selectedScript);
            UpdateScriptConfig();
        }
 public void UpdateScriptConfig(ScriptConfigModel scriptConfigModel = null)
 {
     try
     {
         if (scriptConfigModel != null)
         {
             if (fileWatcher != null)
             {
                 fileWatcher.EnableRaisingEvents = false;
             }
             if (!scriptConfigModel.IsEnabled)
             {
                 if (File.Exists(MainViewModel.AssemblyPath + scriptConfigModel.ScriptLocalPath))
                 {
                     File.Move(MainViewModel.AssemblyPath + scriptConfigModel.ScriptLocalPath, MainViewModel.AssemblyPath + scriptConfigModel.ScriptLocalPath.Replace(".lua", ".bak"));
                     scriptConfigModel.ScriptLocalPath = scriptConfigModel.ScriptLocalPath.Replace(".lua", ".bak").Replace(MainViewModel.AssemblyPath, "");
                 }
             }
             else
             {
                 if (File.Exists(MainViewModel.AssemblyPath + scriptConfigModel.ScriptLocalPath))
                 {
                     File.Move(MainViewModel.AssemblyPath + scriptConfigModel.ScriptLocalPath, MainViewModel.AssemblyPath + scriptConfigModel.ScriptLocalPath.Replace(".bak", ".lua"));
                     scriptConfigModel.ScriptLocalPath = scriptConfigModel.ScriptLocalPath.Replace(".bak", ".lua").Replace(MainViewModel.AssemblyPath, "");
                 }
             }
         }
         var json = JsonConvert.SerializeObject(ScriptsData, Formatting.Indented);
         File.WriteAllText("scripts.json", json);
     }
     catch (Exception ex)
     {
         DotaViewModel.GameBrowserVm.MainViewModel.ShowError(ex.Message);
         Log.Error(ex, "null");
     }
     finally
     {
         if (fileWatcher != null)
         {
             fileWatcher.EnableRaisingEvents = true;
         }
         ScriptsData = new ObservableCollection <ScriptConfigModel>(ScriptsData);
     }
 }
        private async Task DownLoadScript(string url, bool isEnabled)
        {
            var fileName = Path.GetFileName(url);

            if (!isEnabled)
            {
                fileName.Replace(".lua", ".bak");
            }
            var request = WebRequest.CreateHttp(url);

            request.Method = "GET";
            try
            {
                using (var response = await request.GetResponseAsync())
                {
                    using (var responseStream = response.GetResponseStream())
                    {
                        if (File.Exists($@"{scriptDir}\{fileName}"))
                        {
                            var scriptConfig   = ScriptsData.FirstOrDefault(x => x.ScriptLocalPath == $@"{scriptDir}\{fileName}".Replace(MainViewModel.AssemblyPath, "") && x.ScriptPath == null && x.RepositoryPath == null);
                            var conflictResult = false;
                            if (scriptConfig != null)
                            {
                                ScriptConflictName = fileName;
                                var dialogResult = await DialogHost.Show((this.View as UserControl).FindName("ScriptConflictContent"), "ScriptConflict", delegate(object sender, DialogClosingEventArgs args)
                                {
                                    conflictResult = (bool)args.Parameter;
                                });

                                if (conflictResult)
                                {
                                    scriptConfig.RepositoryPath = null;
                                    scriptConfig.ScriptPath     = LuaPath;
                                }
                                else
                                {
                                    return;
                                }
                            }
                        }
                        else
                        {
                            var newScriptData = new ScriptConfigModel
                            {
                                IsEnabled       = isEnabled,
                                ScriptName      = Path.GetFileNameWithoutExtension(fileName),
                                ScriptLocalPath = $@"{scriptDir}\{fileName}".Replace(MainViewModel.AssemblyPath, ""),
                                ScriptPath      = LuaPath
                            };
                            ScriptsData.Add(newScriptData);
                        }
                        using (var fileToDownload = new FileStream($@"{scriptDir}\{fileName}", FileMode.Create, FileAccess.ReadWrite))
                        {
                            await responseStream.CopyToAsync(fileToDownload);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private async Task DownLoadRepository(string repPath)
        {
            repPath = $"{repPath}/archive/master.zip";
            var request = WebRequest.CreateHttp(repPath);

            request.Method = "GET";
            try
            {
                using (var response = await request.GetResponseAsync())
                {
                    using (var responseStream = response.GetResponseStream())
                    {
                        using (var fileToDownload = new FileStream($@"{scriptDir}\{Path.GetFileName(repPath)}", FileMode.Create, FileAccess.ReadWrite))
                        {
                            await responseStream.CopyToAsync(fileToDownload);
                        }
                    }
                }
            }
            catch (WebException ex)
            {
                throw ex;
            }
            var zipPath = $@"{scriptDir}\{Path.GetFileName(repPath)}";

            if (File.Exists(zipPath))
            {
                var directory = $"{repPath.Replace("http://github.com/", "").Split('/')[1]}-master";
                using (ZipArchive archive = ZipFile.OpenRead(zipPath))
                {
                    var result = from currEntry in archive.Entries
                                 where Path.GetDirectoryName(currEntry.FullName).Contains(directory)
                                 where !String.IsNullOrEmpty(currEntry.Name)
                                 select currEntry;


                    foreach (ZipArchiveEntry entry in result)
                    {
                        var outPath = $@"{scriptDir}\{entry.FullName.Replace($"{directory}/", "")}";
                        if (outPath.EndsWith(".lua") && File.Exists(outPath.Replace(".lua", ".bak")))
                        {
                            outPath = outPath.Replace(".lua", ".bak");
                        }
                        var localScriptVersion = ScriptsData.FirstOrDefault(x => x.ScriptLocalPath == outPath.Replace(MainViewModel.AssemblyPath, "") && x.ScriptPath == null && x.RepositoryPath == null);
                        var conflictResult     = false;
                        if (localScriptVersion != null)
                        {
                            ScriptConflictName = entry.Name;
                            var dialogResult = await DialogHost.Show((this.View as UserControl).FindName("ScriptConflictContent"), "ScriptConflict", delegate(object sender, DialogClosingEventArgs args)
                            {
                                conflictResult = (bool)args.Parameter;
                            });
                        }
                        EnsureDirectoryExists(outPath);
                        entry.ExtractToFile(outPath, true);
                        if (Path.GetDirectoryName(outPath) == scriptDir)
                        {
                            var scriptConfig = ScriptsData.FirstOrDefault(x => x.ScriptName == Path.GetFileNameWithoutExtension(entry.Name));
                            if (scriptConfig != null)
                            {
                                if (conflictResult)
                                {
                                    scriptConfig.RepositoryPath = LuaPath;
                                    scriptConfig.ScriptPath     = null;
                                }
                                continue;
                            }

                            var newScriptData = new ScriptConfigModel
                            {
                                IsEnabled       = outPath.EndsWith(".bak") ? false : true,
                                ScriptName      = Path.GetFileNameWithoutExtension(entry.Name),
                                ScriptLocalPath = outPath.Trim('/').Replace(MainViewModel.AssemblyPath, ""),
                                RepositoryPath  = LuaPath
                            };
                            ScriptsData.Add(newScriptData);
                        }
                    }
                }
            }
        }
        private async void LoadScripts()
        {
            try
            {
                if (!Directory.Exists(scriptDir))
                {
                    Directory.CreateDirectory(scriptDir);
                }
                if (!File.Exists("scripts.json"))
                {
                    var scriptsFile = File.Create("scripts.json");
                    scriptsFile.Close();
                }
                string jsonString = string.Empty;
                using (var sr = new StreamReader("scripts.json"))
                {
                    string line;
                    while ((line = sr.ReadLine()) != null)
                    {
                        jsonString += line;
                    }
                }
                HashSet <string> extensions = new HashSet <string> {
                    ".lua", ".bak"
                };
                if (!string.IsNullOrEmpty(jsonString))
                {
                    var tempData = JsonConvert.DeserializeObject <IEnumerable <ScriptConfigModel> >(jsonString);
                    ScriptsData = new ObservableCollection <ScriptConfigModel>(tempData.Where(x => File.Exists(MainViewModel.AssemblyPath + x.ScriptLocalPath)));
                    foreach (var scriptData in ScriptsData)
                    {
                        if (scriptData.ScriptLocalPath.Contains(MainViewModel.AssemblyPath))
                        {
                            scriptData.ScriptLocalPath = scriptData.ScriptLocalPath.Replace(MainViewModel.AssemblyPath, "");
                        }
                    }
                    foreach (var scriptPath in Directory.EnumerateFiles(scriptDir, "*.*").Where(x => extensions.Contains(Path.GetExtension(x))))
                    {
                        var fileNameWOExt = Path.GetFileNameWithoutExtension(scriptPath);
                        if (ScriptsData.FirstOrDefault(x => x.ScriptName == fileNameWOExt) != null)
                        {
                            continue;
                        }
                        var isEnabled     = scriptPath.EndsWith(".bak") ? false : true;
                        var newScriptData = new ScriptConfigModel
                        {
                            IsEnabled       = isEnabled,
                            ScriptName      = fileNameWOExt,
                            ScriptLocalPath = isEnabled == true ? $@"{scriptDir}\{fileNameWOExt}.lua".Replace(MainViewModel.AssemblyPath, "") : $@"{scriptDir}\{fileNameWOExt}.bak".Replace(MainViewModel.AssemblyPath, "")
                        };
                        ScriptsData.Add(newScriptData);
                    }
                }
                else
                {
                    ScriptsData = new ObservableCollection <ScriptConfigModel>();
                    foreach (var scriptPath in Directory.EnumerateFiles(scriptDir, "*.*").Where(x => extensions.Contains(Path.GetExtension(x))))
                    {
                        var isEnabled     = scriptPath.EndsWith(".bak") ? false : true;
                        var fileNameWOext = Path.GetFileNameWithoutExtension(scriptPath);
                        var newScriptData = new ScriptConfigModel
                        {
                            IsEnabled       = isEnabled,
                            ScriptName      = fileNameWOext,
                            ScriptLocalPath = isEnabled == true ? $@"{scriptDir}\{fileNameWOext}.lua".Replace(MainViewModel.AssemblyPath, "") : $@"{scriptDir}\{fileNameWOext}.lua.bak".Replace(MainViewModel.AssemblyPath, "")
                        };
                        ScriptsData.Add(newScriptData);
                    }
                }

                UpdateScriptConfig();
            }
            catch (Exception ex)
            {
                DotaViewModel.GameBrowserVm.MainViewModel.ShowError(ex.Message);
                Log.Error(ex, "null");
            }
        }
 private void FileWatcherHandle(object sender, FileSystemEventArgs e)
 {
     try
     {
         if (!Regex.IsMatch(Path.GetExtension(e.FullPath), @"\.lua|\.bak", RegexOptions.IgnoreCase))
         {
             return;
         }
         if (e.ChangeType == WatcherChangeTypes.Changed)
         {
             var scriptConfig = ScriptsData.FirstOrDefault(x => x.ScriptLocalPath == e.FullPath.Replace(MainViewModel.AssemblyPath, "") && x.ScriptName == Path.GetFileNameWithoutExtension(e.Name));
             if (scriptConfig != null)
             {
                 scriptConfig.ScriptPath     = null;
                 scriptConfig.RepositoryPath = null;
                 UpdateScriptConfig();
                 return;
             }
         }
         if (e.ChangeType == WatcherChangeTypes.Renamed)
         {
             var args         = e as RenamedEventArgs;
             var isEnabled    = e.FullPath.EndsWith(".bak") ? false : true;
             var scriptConfig = ScriptsData.FirstOrDefault(x => x.ScriptLocalPath == args.OldFullPath.Replace(MainViewModel.AssemblyPath, "") && x.ScriptName == Path.GetFileNameWithoutExtension(args.OldName));
             if (scriptConfig != null)
             {
                 scriptConfig.IsEnabled       = isEnabled;
                 scriptConfig.ScriptLocalPath = args.FullPath.Replace(MainViewModel.AssemblyPath, "");
                 scriptConfig.ScriptName      = Path.GetFileNameWithoutExtension(args.Name);
                 UpdateScriptConfig();
             }
             else
             {
                 var newScriptConfig = new ScriptConfigModel
                 {
                     IsEnabled       = isEnabled,
                     ScriptLocalPath = e.FullPath.Replace(MainViewModel.AssemblyPath, ""),
                     ScriptName      = Path.GetFileNameWithoutExtension(e.Name)
                 };
                 System.Windows.Application.Current.Dispatcher.Invoke(() =>
                 {
                     ScriptsData.Add(newScriptConfig);
                 });
                 UpdateScriptConfig();
             }
             return;
         }
         if (e.ChangeType == WatcherChangeTypes.Created)
         {
             var isEnabled = e.FullPath.EndsWith(".bak") ? false : true;
             if (File.Exists(e.FullPath))
             {
                 var scriptConfig = ScriptsData.FirstOrDefault(x => x.ScriptLocalPath == e.FullPath.Replace(MainViewModel.AssemblyPath, "") && x.ScriptName == Path.GetFileNameWithoutExtension(e.Name));
                 if (scriptConfig != null)
                 {
                     scriptConfig.ScriptPath     = null;
                     scriptConfig.RepositoryPath = null;
                     UpdateScriptConfig();
                     return;
                 }
             }
             var newScriptConfig = new ScriptConfigModel
             {
                 IsEnabled       = isEnabled,
                 ScriptLocalPath = e.FullPath.Replace(MainViewModel.AssemblyPath, ""),
                 ScriptName      = Path.GetFileNameWithoutExtension(e.Name)
             };
             System.Windows.Application.Current.Dispatcher.Invoke(() =>
             {
                 ScriptsData.Add(newScriptConfig);
             });
             UpdateScriptConfig();
             return;
         }
         if (e.ChangeType == WatcherChangeTypes.Deleted)
         {
             var scriptConfig = ScriptsData.FirstOrDefault(x => x.ScriptLocalPath == e.FullPath.Replace(MainViewModel.AssemblyPath, "") && x.ScriptName == Path.GetFileNameWithoutExtension(e.Name));
             if (scriptConfig != null)
             {
                 System.Windows.Application.Current.Dispatcher.Invoke(() =>
                 {
                     ScriptsData.Remove(scriptConfig);
                 });
                 UpdateScriptConfig();
             }
         }
     }
     catch (Exception ex)
     {
         DotaViewModel.GameBrowserVm.MainViewModel.ShowError(ex.Message);
         Log.Error(ex, "null");
     }
 }