Exemple #1
0
        public GoogleDriveFile GetDriveFolder(string folderName)
        {
            DriveService           service    = GetService();
            List <GoogleDriveFile> FolderList = new List <GoogleDriveFile>();

            FilesResource.ListRequest request = service.Files.List();
            request.Q      = "mimeType='application/vnd.google-apps.folder'";
            request.Fields = "files(id, name)";
            Google.Apis.Drive.v3.Data.FileList result = request.Execute();
            foreach (var file in result.Files)
            {
                if (file.Name == folderName)
                {
                    GoogleDriveFile File = new GoogleDriveFile
                    {
                        Id          = file.Id,
                        Name        = file.Name,
                        Size        = file.Size,
                        Version     = file.Version,
                        CreatedTime = file.CreatedTime
                    };
                    FolderList.Add(File);
                }
            }
            return(FolderList.FirstOrDefault());
        }
Exemple #2
0
        public static async Task <WebDirectory> IndexAsync(WebDirectory webDirectory)
        {
            webDirectory.StartTime = DateTimeOffset.UtcNow;
            string nextPageToken = string.Empty;
            string folderId      = webDirectory.Uri.Segments.Last();

            do
            {
                await RateLimiter.RateLimit();

                Logger.Debug($"Started Google Drive Request for Folder {folderId}");

                FilesResource.ListRequest listRequest = DriveService.Files.List();
                listRequest.PageSize  = 1000;
                listRequest.Q         = $"'{folderId}' in parents";
                listRequest.PageToken = nextPageToken;
                listRequest.Fields    = "nextPageToken, files(id, name, mimeType, size)";
                Google.Apis.Drive.v3.Data.FileList fileList = await listRequest.ExecuteAsync();

                foreach (Google.Apis.Drive.v3.Data.File file in fileList.Files.OrderByDescending(f => f.MimeType == FolderMimeType).ThenBy(f => f.Name))
                {
                    bool isFile = file.MimeType != FolderMimeType;

                    if (!isFile)
                    {
                        webDirectory.Subdirectories.Add(new WebDirectory(webDirectory)
                        {
                            Url  = $"https://drive.google.com/drive/folders/{file.Id}",
                            Name = file.Name
                        });
                    }
                    else
                    {
                        webDirectory.Files.Add(new WebFile
                        {
                            Url      = $"https://drive.google.com/uc?export=download&id={file.Id}",
                            FileName = file.Name,
                            FileSize = file.Size ?? 0
                        });
                    }
                }

                nextPageToken = fileList.NextPageToken;
            } while (!string.IsNullOrWhiteSpace(nextPageToken));

            webDirectory.Finished = true;

            Logger.Debug($"Finished Google Drive Request for Folder {folderId}");

            return(webDirectory);
        }
Exemple #3
0
        public static Google.Apis.Drive.v3.Data.FileList DeleteAfter30(DriveService service, FilesListOptionalParms optional = null)
        {
            DateTime ThirtyDayBeforeToday = DateTime.Now.AddDays(-30);

            try
            {
                // Initial validation.
                if (service == null)
                {
                    throw new ArgumentNullException("service");
                }

                // Building the initial request.
                var request = service.Files.List();

                // Applying optional parameters to the request.
                request.Fields = "nextPageToken, files(createdTime ,id, name, mimeType)";

                var pageStreamer = new Google.Apis.Requests.PageStreamer <Google.Apis.Drive.v3.Data.File, FilesResource.ListRequest, Google.Apis.Drive.v3.Data.FileList, string>(
                    (req, token) => request.PageToken = token,
                    response => response.NextPageToken,
                    response => response.Files);

                var allFiles = new Google.Apis.Drive.v3.Data.FileList();
                allFiles.Files = new List <Google.Apis.Drive.v3.Data.File>();

                foreach (var result in pageStreamer.Fetch(request))
                {
                    if (result.MimeType != "application/vnd.google-apps.folder")
                    {
                        if (result.CreatedTime < ThirtyDayBeforeToday)
                        {
                            service.Files.Delete(result.Id).Execute();
                        }
                        else
                        {
                            Console.WriteLine("Data sie zgdza");
                        }
                    }
                    else
                    {
                        Console.WriteLine("Nie usunięto");
                    }
                }
                return(allFiles);
            }
            catch (Exception Ex)
            {
                throw new Exception("Request Files.List failed.", Ex);
            }
        }
        public static void PrettyPrint(DriveService service, Google.Apis.Drive.v3.Data.FileList list, string indent)
        {
            foreach (var item in list.Files.OrderBy(a => a.Name))
            {
                Console.WriteLine(string.Format("{0}|-{1}", indent, item.Name));

                if (item.MimeType == "application/vnd.google-apps.folder")
                {
                    var ChildrenFiles = ListAll(service, new FilesListOptionalParms {
                        Q = string.Format("('{0}' in parents)", item.Id), PageSize = 1000
                    });
                    PrettyPrint(service, ChildrenFiles, indent + "  ");
                }
            }
        }
        //get link folder
        //create folder on drive
        public static string GetLinkFolder(string folderName)
        {
            string linkdrive = "";

            Google.Apis.Drive.v3.DriveService service = GetService();
            // Define parameters of request.
            FilesResource.ListRequest request = service.Files.List();
            request.Q = "mimeType='application/vnd.google-apps.folder' and name='" + folderName + "'";
            //request.Fields = "files(id, name)";
            Google.Apis.Drive.v3.Data.FileList result = request.Execute();
            foreach (var item in result.Files)
            {
                linkdrive = item.Id;
                break;
            }

            return(linkdrive);
        }
        //Drive'daki klasörlerin listesini almak için
        public static List <GoogleDriveModel> GetDriveFolders()
        {
            DriveService            service    = GetService();
            List <GoogleDriveModel> FolderList = new List <GoogleDriveModel>();

            FilesResource.ListRequest request = service.Files.List();
            request.Q      = "mimeType='application/vnd.google-apps.folder'";
            request.Fields = "files(id, name)";
            Google.Apis.Drive.v3.Data.FileList result = request.Execute();
            foreach (var file in result.Files)
            {
                GoogleDriveModel File = new GoogleDriveModel
                {
                    Id          = file.Id,
                    Name        = file.Name,
                    Size        = file.Size,
                    Version     = file.Version,
                    CreatedTime = file.CreatedTime
                };
                FolderList.Add(File);
            }
            return(FolderList);
        }
Exemple #7
0
        /// <summary>
        /// Get files method.
        /// </summary>
        /// <param name="parent">The parent folder.</param>
        /// <returns>A list of files.</returns>
        public IList <Google.Apis.Drive.v3.Data.File> GetFiles(string parent)
        {
            IList <Google.Apis.Drive.v3.Data.File> files;

            FilesResource.ListRequest listRequest = driveService.Files.List();

            listRequest.Fields   = "files(id, name, mimeType, modifiedTime)";
            listRequest.Q        = $"'{parent}' in parents";
            listRequest.PageSize = 1000;

            Google.Apis.Drive.v3.Data.FileList filesList = listRequest.Execute();
            files = filesList.Files;

            string message = string.Format(
                CultureInfo.InvariantCulture,
                "Retrieved files from: {0} count: {1}",
                parent,
                files.Count);

            Log.Info(CultureInfo.InvariantCulture, m => m(
                         message));

            return(files);
        }
Exemple #8
0
        /// <summary>
        /// List files in the appDataFolder matching the given query string.
        /// </summary>
        /// <param name="query">The query string to use when searching. Set to null to list all
        /// files.</param>
        /// <returns>A list of File objects matching the given query string.</returns>
        /// <remarks>
        /// See https://developers.google.com/drive/v3/web/search-parameters for documentation of
        /// the query string.
        ///
        /// TODO: Figure out how to tell if the initial request or subsequent pagination failed,
        ///       and handle those cases appropriately.
        /// </remarks>
        private async Task <List <Google.Apis.Drive.v3.Data.File> > ListFilesHelperAsync(string query)
        {
            List <Google.Apis.Drive.v3.Data.File> result = new List <Google.Apis.Drive.v3.Data.File>();

            FilesResource.ListRequest listRequest = service.Files.List();
            listRequest.Spaces = "appDataFolder";
            if (query != null)
            {
                listRequest.Q = query;
            }

            bool done = false;

            Google.Apis.Drive.v3.Data.FileList fileList = await listRequest.ExecuteAsync();

            while (!done)
            {
                IList <Google.Apis.Drive.v3.Data.File> files = fileList.Files;
                result.AddRange(files);
                if (fileList.NextPageToken == null)
                {
                    Debug.WriteLine("Processed last page");
                    done = true;
                }
                else
                {
                    Debug.WriteLine("Retrieving another page");
                    FilesResource.ListRequest newListRequest = service.Files.List();
                    newListRequest.Spaces    = "appDataFolder";
                    newListRequest.PageSize  = 10;
                    newListRequest.PageToken = fileList.NextPageToken;
                    fileList = await newListRequest.ExecuteAsync();
                }
            }
            return(result);
        }
        /// <summary>
        /// Lists or searches files.
        /// Documentation https://developers.google.com/drive/v3/reference/files/list
        /// Generation Note: This does not always build correctly.  Google needs to standardize things I need to figure out which ones are wrong.
        /// </summary>
        /// <param name="service">Authenticated Drive service. </param>
        /// <param name="optional">The optional parameters. </param>
        /// <returns>FileListResponse</returns>
        public static Google.Apis.Drive.v3.Data.FileList ListAll(DriveService service, FilesListOptionalParms optional = null)
        {
            try
            {
                // Initial validation.
                if (service == null)
                {
                    throw new ArgumentNullException("service");
                }

                // Building the initial request.
                var request = service.Files.List();

                // Applying optional parameters to the request.
                request = (FilesResource.ListRequest)SampleHelpers.ApplyOptionalParms(request, optional);

                var pageStreamer = new Google.Apis.Requests.PageStreamer <Google.Apis.Drive.v3.Data.File, FilesResource.ListRequest, Google.Apis.Drive.v3.Data.FileList, string>(
                    (req, token) => request.PageToken = token,
                    response => response.NextPageToken,
                    response => response.Files);

                var allFiles = new Google.Apis.Drive.v3.Data.FileList();
                allFiles.Files = new List <Google.Apis.Drive.v3.Data.File>();

                foreach (var result in pageStreamer.Fetch(request))
                {
                    allFiles.Files.Add(result);
                }

                return(allFiles);
            }
            catch (Exception Ex)
            {
                throw new Exception("Request Files.List failed.", Ex);
            }
        }
Exemple #10
0
        public static async Task CheckFilesAsync(CancellationToken cancellationToken)
        {
            _mvm.IsLvEnabled = false;

            var listRequest = Helper.Service.Files.List();

            listRequest.OrderBy = "name";
            listRequest.Fields  = "files(id, name, modifiedTime)";
            listRequest.Q       = $"'{Properties.FolderId}' in parents";

            Google.Apis.Drive.v3.Data.FileList files = null;
            try
            {
                files = await listRequest.ExecuteAsync();
            }
            catch (Exception e)
            {
                if (_mvm.IsHideExceptionMissionChecked == false)
                {
                    MessageBox.Show($"An Exception was thrown: {e.Message}\nIt was thrown while trying to connect to the Google servers!", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                }
                return;
            }

            files.Files.Remove(files.Files.SingleOrDefault(r => r.Name == "readme.txt"));

            if (_mvm.IsRemoveMfsChecked)
            {
                var deadMissionFiles = _mvm.IgnoredItems.Where(i => files.Files.All(b => b.Id != i.FileId)).ToList();
                foreach (var item in deadMissionFiles)
                {
                    _mvm.IgnoredItems.Remove(item);
                    if (File.Exists(Properties.GetArma3MissionFolderPath + item.Item))
                    {
                        File.Delete(Properties.GetArma3MissionFolderPath + item.Item);
                    }
                }
            }

            foreach (var item in _mvm.IgnoredItems)
            {
                files.Files.Remove(files.Files.SingleOrDefault(r => r.Id == item.FileId));
            }

            if (_mvm.IsOrdered)
            {
                files.Files = files.Files.Reverse().ToList();
            }

            if (_mvm.MissionItems.Count > 0)
            {
                //Mission file added to the Google drive
                if (_mvm.MissionItems.Count < files.Files.Count)
                {
                    foreach (var item in files.Files.ToList())
                    {
                        if (_mvm.MissionItems.Any(a => a.Mission == item.Name))
                        {
                            continue;
                        }

                        int itemPosition = files.Files.IndexOf(item);
                        _mvm.MissionItems.Insert(itemPosition, new MissionModel()
                        {
                            Mission               = item.Name,
                            IsMissionUpdated      = "Missing",
                            ModifiedTime          = item.ModifiedTime.Value.ToString("dd.MM.yyyy HH:mm:ss"),
                            IsModifiedTimeUpdated = "Missing",
                            FileId    = item.Id,
                            IsChecked = false
                        });
                    }
                }

                //Mission file removed from the Google drive
                if (_mvm.MissionItems.Count > files.Files.Count)
                {
                    foreach (var item in _mvm.MissionItems.ToList().Where(item => files.Files.All(a => a.Name != item.Mission)))
                    {
                        _mvm.MissionItems.Remove(item);
                        if (File.Exists(Properties.GetArma3MissionFolderPath + item.Mission))
                        {
                            File.Delete(Properties.GetArma3MissionFolderPath + item.Mission);
                        }
                    }
                }

                //The same amount in both places
                if (_mvm.MissionItems.Count == files.Files.Count)
                {
                    foreach (var(item1, item2) in _mvm.MissionItems.Zip(files.Files, Tuple.Create).ToList().Where(item => item.Item1.ModifiedTime != item.Item2.ModifiedTime.Value.ToString("dd.MM.yyyy HH:mm:ss")))
                    {
                        string status = await CheckItemAsync(item2.Name, item2.Id);

                        item1.Mission               = item2.Name;
                        item1.IsMissionUpdated      = status;
                        item1.ModifiedTime          = item2.ModifiedTime.Value.ToString("dd.MM.yyyy HH:mm:ss");
                        item1.IsModifiedTimeUpdated = status;
                        item1.FileId    = item2.Id;
                        item1.IsChecked = item1.IsChecked;
                    }
                }

                foreach (var item in _mvm.MissionItems.ToList())
                {
                    string status = await CheckItemAsync(item.Mission, item.FileId);

                    item.IsMissionUpdated      = status;
                    item.IsModifiedTimeUpdated = status;
                }
            }
            else
            {
                foreach (var file in files.Files)
                {
                    string status = await CheckItemAsync(file.Name, file.Id);

                    _mvm.MissionItems.Add(new MissionModel()
                    {
                        Mission               = file.Name,
                        IsMissionUpdated      = status,
                        ModifiedTime          = file.ModifiedTime.Value.ToString("dd.MM.yyyy HH:mm:ss"),
                        IsModifiedTimeUpdated = status,
                        FileId    = file.Id,
                        IsChecked = false
                    });
                }
            }

            _mvm.IsLvEnabled = true;

            var requestedProgram = await Helper.GetFileRequest(Properties.ProgramId, "md5Checksum").ExecuteAsync();

            string programMd5Checksum = CalculateMd5(Process.GetCurrentProcess().MainModule.FileName);

            if (cancellationToken.IsCancellationRequested)
            {
                return;
            }

            if (Equals(requestedProgram.Md5Checksum, programMd5Checksum))
            {
                _mvm.ProgramStatus = "Updated";
            }
            else
            {
                _mvm.ProgramStatus = "Outdated";

                _mvm.IsUpdateVisible = Visibility.Visible;

                if (_mvm.IsUpdateNotifyChecked)
                {
                    var result = System.Windows.Forms.MessageBox.Show("A new update for GTA program has been detected. Download it?", "Update", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Information);
                    if (result == System.Windows.Forms.DialogResult.Yes)
                    {
                        await Download.FileAsync(Properties.ProgramId, null, Helper.CtsStopDownloading.Token, Download.Option.ProgramUpdate);
                    }
                }
            }
        }
Exemple #11
0
        public static async Task <WebDirectory> IndexAsync(WebDirectory webDirectory)
        {
            webDirectory.StartTime = DateTimeOffset.UtcNow;
            string nextPageToken = string.Empty;
            string folderId      = webDirectory.Uri.Segments.Last();

            do
            {
                bool rateLimitException = false;

                do
                {
                    try
                    {
                        await RateLimiter.RateLimit();

                        Logger.Debug($"Started Google Drive Request for Folder {folderId}");

                        FilesResource.ListRequest listRequest = DriveService.Files.List();
                        listRequest.PageSize  = 1000;
                        listRequest.Q         = $"'{folderId}' in parents";
                        listRequest.PageToken = nextPageToken;
                        listRequest.Fields    = "nextPageToken, files(id, name, mimeType, size)";
                        listRequest.IncludeItemsFromAllDrives = true;
                        listRequest.SupportsAllDrives         = true;
                        Google.Apis.Drive.v3.Data.FileList fileList = await listRequest.ExecuteAsync();

                        foreach (Google.Apis.Drive.v3.Data.File file in fileList.Files.OrderByDescending(f => f.MimeType == FolderMimeType).ThenBy(f => f.Name))
                        {
                            bool isFile = file.MimeType != FolderMimeType;

                            if (!isFile)
                            {
                                webDirectory.Subdirectories.Add(new WebDirectory(webDirectory)
                                {
                                    Url  = $"https://drive.google.com/drive/folders/{file.Id}",
                                    Name = file.Name
                                });
                            }
                            else
                            {
                                webDirectory.Files.Add(new WebFile
                                {
                                    Url      = $"https://drive.google.com/uc?export=download&id={file.Id}",
                                    FileName = file.Name,
                                    FileSize = file.Size ?? 0
                                });
                            }
                        }

                        nextPageToken = fileList.NextPageToken;

                        rateLimitException = false;
                    }
                    catch (GoogleApiException ex)
                    {
                        rateLimitException = ex.Error.Message == "User rate limit exceeded.";

                        if (rateLimitException)
                        {
                            Logger.Debug($"Google Drive rate limit, try again");
                        }
                        else
                        {
                            Logger.Error($"Google Drive error: {ex}");
                        }
                    }
                } while (rateLimitException);
            } while (!string.IsNullOrWhiteSpace(nextPageToken));

            Logger.Debug($"Finished Google Drive Request for Folder {folderId}");

            return(webDirectory);
        }
Exemple #12
0
        // Gets path from cache or downloads image to cache from drive
        public static int saveAll(int highest)
        {
            Commands.Gec.RefreshGec();
            FileUtils.checkForCacheExistance();

            DriveService driveService = AuthenticateServiceAccount(
                "*****@*****.**",
                "../../../GeckoBot-af43fa71833e.json");
            var listRequest = driveService.Files.List();

            listRequest.PageSize = 1000;                        // Only fetch one thousand
            listRequest.Q        = "mimeType contains 'image'"; // Filter out folders or other non image types

            Google.Apis.Drive.v3.Data.FileList     files2 = listRequest.Execute();
            IList <Google.Apis.Drive.v3.Data.File> files  = files2.Files;

            int totalAmount = 0;
            int amount      = 0;

            while (totalAmount < highest)
            {
                foreach (Google.Apis.Drive.v3.Data.File file in files)
                {
                    string name = file.Name.Remove(3);

                    if (name.Contains("b"))
                    {
                        name = file.Name.Remove(4);
                    }
                    if (CheckCache(name) == null)
                    {
                        string type = file.MimeType.Replace("image/", ""); // sorta hacky solution to get file type

                        using var fileStream = new FileStream(
                                  $"../../Cache/{name}_icon.{type}",
                                  FileMode.Create,
                                  FileAccess.Write);
                        driveService.Files.Get(file.Id).Download(fileStream);

                        amount++;
                    }

                    if (!Commands.Gec.geckos.ContainsKey(EmoteUtils.escapeforbidden(name)))
                    {
                        Commands.Gec.geckos.Add(EmoteUtils.escapeforbidden(name), EmoteUtils.escapeforbidden(file.Name));

                        if (CheckCache(name) != null)
                        {
                            continue;
                        }
                    }
                    else if (!Commands.Gec.geckos.ContainsValue(EmoteUtils.escapeforbidden(file.Name)))
                    {
                        Commands.Gec.geckos.Remove(EmoteUtils.escapeforbidden(name));
                        Commands.Gec.geckos.Add(EmoteUtils.escapeforbidden(name), EmoteUtils.escapeforbidden(file.Name));
                    }

                    totalAmount++;
                }
                listRequest.PageToken = files2.NextPageToken;
            }

            FileUtils.Save(Globals.DictToString(Commands.Gec.geckos, "{0} ⁊ {1} ҩ "), @"..\..\Cache\gecko7.gek");

            return(amount);
        }
    public static async Task <WebDirectory> IndexAsync(WebDirectory webDirectory, string resourceKey)
    {
        webDirectory.StartTime = DateTimeOffset.UtcNow;
        string nextPageToken = string.Empty;
        string folderId      = webDirectory.Uri.Segments.Last();

        bool rateLimitException = false;

        int retries    = 0;
        int maxRetries = 5;

        while (retries < maxRetries || rateLimitException || !string.IsNullOrWhiteSpace(nextPageToken))
        {
            try
            {
                await RateLimiter.RateLimit();

                Logger.Debug($"Started Google Drive Request for Folder {folderId}");

                if (!string.IsNullOrWhiteSpace(resourceKey))
                {
                    DriveService.HttpClient.DefaultRequestHeaders.Add("X-Goog-Drive-Resource-Keys", $"{folderId}/{resourceKey}");
                }
                else
                {
                    if (DriveService.HttpClient.DefaultRequestHeaders.Contains("X-Goog-Drive-Resource-Keys"))
                    {
                        DriveService.HttpClient.DefaultRequestHeaders.Remove("X-Goog-Drive-Resource-Keys");
                    }
                }

                FilesResource.ListRequest listRequest = DriveService.Files.List();
                listRequest.PageSize  = 1000;
                listRequest.Q         = $"'{folderId}' in parents";
                listRequest.PageToken = nextPageToken;
                listRequest.Fields    = "nextPageToken, files(id, name, mimeType, size, shortcutDetails, resourceKey)";
                listRequest.IncludeItemsFromAllDrives = true;
                listRequest.SupportsAllDrives         = true;
                Google.Apis.Drive.v3.Data.FileList fileList = await listRequest.ExecuteAsync();

                foreach (Google.Apis.Drive.v3.Data.File file in fileList.Files.OrderByDescending(f => f.MimeType == FolderMimeType || f.MimeType == ShortcutMimeType).ThenBy(f => f.Name))
                {
                    string mimeType = file.ShortcutDetails?.TargetMimeType ?? file.MimeType;
                    string id       = file.ShortcutDetails?.TargetId ?? file.Id;

                    bool isFile = mimeType != FolderMimeType;

                    if (!isFile)
                    {
                        string url = $"https://drive.google.com/drive/folders/{id}";

                        if (!string.IsNullOrEmpty(file.ResourceKey))
                        {
                            url += $"?resourcekey={file.ResourceKey}";
                        }

                        webDirectory.Subdirectories.Add(new WebDirectory(webDirectory)
                        {
                            Url  = url,
                            Name = file.Name
                        });
                    }
                    else
                    {
                        string url = $"https://drive.google.com/uc?export=download&id={id}";

                        if (!string.IsNullOrEmpty(file.ResourceKey))
                        {
                            url += $"&resourcekey={file.ResourceKey}";
                        }

                        webDirectory.Files.Add(new WebFile
                        {
                            Url      = url,
                            FileName = file.Name,
                            FileSize = file.Size ?? 0
                        });
                    }
                }

                nextPageToken = fileList.NextPageToken;

                rateLimitException = false;

                if (retries > 0)
                {
                    Logger.Warn($"Retrieval succesful after try {retries + 1} for {webDirectory.Url}");
                }

                if (string.IsNullOrWhiteSpace(nextPageToken))
                {
                    break;
                }

                retries = 0;
            }
            catch (GoogleApiException ex)
            {
                RateLimiter.AddDelay(TimeSpan.FromSeconds(5));
                rateLimitException = ex.Error?.Message == "User rate limit exceeded.";

                if (rateLimitException)
                {
                    Logger.Debug($"Google Drive rate limit, try again");
                }
                else
                {
                    retries++;
                    Logger.Warn($"Google Drive error for {webDirectory.Url} on try {retries + 1}: {ex.Message}");
                }

                if (retries == maxRetries)
                {
                    Logger.Error($"Skip {webDirectory.Url} because of {maxRetries} consecutive errors on : {ex.Message}");
                    webDirectory.Error = true;
                    return(webDirectory);
                }
            }
        }

        Logger.Debug($"Finished Google Drive Request for Folder {folderId}");

        return(webDirectory);
    }