コード例 #1
0
ファイル: AvatarModule.cs プロジェクト: knah/VRCMods
        private void DoSearchKnownAvatars()
        {
            if (FavCatMod.PageUserInfo == null)
            {
                return;
            }

            FavCatMod.GetUiManager().Method_Public_Void_String_Boolean_0("UserInterface/MenuContent/Screens/Avatar", false);
            SetSearchListHeaderAndScrollToIt("Search running...");
            LastSearchRequest = "Created by " + FavCatMod.PageUserInfo.field_Private_APIUser_0.displayName;
            FavCatMod.Database.RunBackgroundAvatarSearchByUser(FavCatMod.PageUserInfo.field_Private_APIUser_0.id, AcceptSearchResult);
        }
コード例 #2
0
        public Task TrimCache(long maxSize)
        {
            return(Task.Run(async() =>
            {
                MelonLogger.Log("Trimming image cache");
                var allFileInfos = new List <(LiteFileInfo <string>, StoredImageInfo)>();
                var runningSums = new List <long>();
                foreach (var liteFileInfo in myFileDatabase.FileStorage.FindAll())
                {
                    if (string.IsNullOrEmpty(liteFileInfo.Id))
                    {
                        continue;
                    }

                    allFileInfos.Add((liteFileInfo,
                                      myImageInfos.FindById(liteFileInfo.Id) ?? new StoredImageInfo
                    {
                        LastAccessed = DateTime.MinValue, Id = liteFileInfo.Id
                    }));
                }

                allFileInfos.Sort((a, b) => a.Item2.LastAccessed.CompareTo(b.Item2.LastAccessed));
                long totalSize = 0;
                foreach (var fileInfo in allFileInfos)
                {
                    totalSize += fileInfo.Item1.Length;
                    runningSums.Add(totalSize);
                }

                if (totalSize < maxSize)
                {
                    MelonLogger.Log("Cache already under limit");
                    return;
                }

                var cutoffPoint = runningSums.BinarySearch(maxSize);
                if (cutoffPoint < 0)
                {
                    cutoffPoint = ~cutoffPoint;
                }

                for (var i = 0; i < cutoffPoint; i++)
                {
                    myFileDatabase.FileStorage.Delete(allFileInfos[i].Item1.Id);
                    myImageInfos.Delete(allFileInfos[i].Item2.Id);
                }

                await FavCatMod.YieldToMainThread();

                MelonLogger.Log($"Removed {cutoffPoint} images from cache");
            }));
        }
コード例 #3
0
        public async Task LoadImageAsync(string url, Action <Texture2D?> onDone)
        {
            try
            {
                if (!myFileDatabase.FileStorage.Exists(url))
                {
                    onDone(null);
                    return;
                }

                await Task.Run(() => { }).ConfigureAwait(false);

                using var imageStream = myFileDatabase.FileStorage.OpenRead(url);
                using var image       = await Image.LoadAsync <Rgba32>(imageStream).ConfigureAwait(false);

                var newImageInfo = new StoredImageInfo {
                    Id = url, LastAccessed = DateTime.UtcNow
                };
                myImageInfos.Upsert(newImageInfo);

                await FavCatMod.YieldToMainThread();

                try
                {
                    onDone(CreateTextureFromImage(image));
                }
                catch (Exception ex)
                {
                    MelonLogger.LogError($"Exception in onDone callback: {ex}");
                }
            }
            catch (Exception ex)
            {
                if (Imports.IsDebugMode())
                {
                    MelonLogger.LogWarning($"Exception in image load, will delete offending image: {ex}");
                }
                myFileDatabase.FileStorage.Delete(url);
                myImageInfos.Delete(url);
                onDone(AssetsHandler.PreviewLoading.texture);
            }
        }