private static void End() { if (_ending) { return; } _ending = true; if (_gameLoaded) { ApplicationLibrary.LoadAndSaveMetaData(_device.System.TitleIdText, appMetadata => { DateTime lastPlayedDateTime = DateTime.Parse(appMetadata.LastPlayed); double sessionTimePlayed = DateTime.UtcNow.Subtract(lastPlayedDateTime).TotalSeconds; appMetadata.TimePlayed += Math.Round(sessionTimePlayed, MidpointRounding.AwayFromZero); }); } Profile.FinishProfiling(); _device?.Dispose(); _audioOut?.Dispose(); Logger.Shutdown(); Environment.Exit(0); }
private static void End() { if (_ending) { return; } _ending = true; if (_gameLoaded) { string metadataFolder = System.IO.Path.Combine(new VirtualFileSystem().GetBasePath(), "games", _device.System.TitleId, "gui"); string metadataFile = System.IO.Path.Combine(metadataFolder, "metadata.json"); IJsonFormatterResolver resolver = CompositeResolver.Create(new[] { StandardResolver.AllowPrivateSnakeCase }); ApplicationMetadata appMetadata; if (!File.Exists(metadataFile)) { Directory.CreateDirectory(metadataFolder); appMetadata = new ApplicationMetadata { Favorite = false, TimePlayed = 0, LastPlayed = "Never" }; byte[] data = JsonSerializer.Serialize(appMetadata, resolver); File.WriteAllText(metadataFile, Encoding.UTF8.GetString(data, 0, data.Length).PrettyPrintJson()); } using (Stream stream = File.OpenRead(metadataFile)) { appMetadata = JsonSerializer.Deserialize <ApplicationMetadata>(stream, resolver); } DateTime lastPlayedDateTime = DateTime.Parse(appMetadata.LastPlayed); double sessionTimePlayed = DateTime.UtcNow.Subtract(lastPlayedDateTime).TotalSeconds; appMetadata.TimePlayed += Math.Round(sessionTimePlayed, MidpointRounding.AwayFromZero); byte[] saveData = JsonSerializer.Serialize(appMetadata, resolver); File.WriteAllText(metadataFile, Encoding.UTF8.GetString(saveData, 0, saveData.Length).PrettyPrintJson()); } Profile.FinishProfiling(); _device.Dispose(); _audioOut.Dispose(); DiscordClient?.Dispose(); Logger.Shutdown(); Environment.Exit(0); }
private static void End() { if (_gameLoaded) { try { string savePath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "RyuFS", "nand", "user", "save", "0000000000000000", _userId, _device.System.TitleID); double currentPlayTime = 0; using (FileStream stream = File.OpenRead(System.IO.Path.Combine(savePath, "LastPlayed.dat"))) { using (StreamReader reader = new StreamReader(stream)) { DateTime startTime = DateTime.Parse(reader.ReadLine()); using (FileStream lastPlayedStream = File.OpenRead(System.IO.Path.Combine(savePath, "TimePlayed.dat"))) { using (StreamReader lastPlayedReader = new StreamReader(lastPlayedStream)) { currentPlayTime = double.Parse(lastPlayedReader.ReadLine()); } } using (FileStream timePlayedStream = File.OpenWrite(System.IO.Path.Combine(savePath, "TimePlayed.dat"))) { using (StreamWriter timePlayedWriter = new StreamWriter(timePlayedStream)) { timePlayedWriter.WriteLine(currentPlayTime + Math.Round(DateTime.UtcNow.Subtract(startTime).TotalSeconds, MidpointRounding.AwayFromZero)); } } } } } catch (ArgumentNullException) { Logger.PrintWarning(LogClass.Application, $"Could not access save path to retrieve time/last played data using: UserID: {_userId}, TitleID: {_device.System.TitleID}"); } } Profile.FinishProfiling(); _device.Dispose(); _audioOut.Dispose(); DiscordClient?.Dispose(); Logger.Shutdown(); Environment.Exit(0); }
static void Main(string[] args) { Console.Title = "Ryujinx Console"; IGalRenderer renderer = new OglRenderer(); IAalOutput audioOut = InitializeAudioEngine(); Switch device = new Switch(renderer, audioOut); Configuration.Load(Path.Combine(ApplicationDirectory, "Config.jsonc")); Configuration.Configure(device); Profile.Initalize(); AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; AppDomain.CurrentDomain.ProcessExit += CurrentDomain_ProcessExit; if (device.System.State.DiscordIntergrationEnabled == true) { DiscordClient = new DiscordRpcClient("568815339807309834"); DiscordPresence = new RichPresence { Assets = new Assets { LargeImageKey = "ryujinx", LargeImageText = "Ryujinx is an emulator for the Nintendo Switch" } }; DiscordClient.Initialize(); DiscordClient.SetPresence(DiscordPresence); } if (args.Length == 1) { if (Directory.Exists(args[0])) { string[] romFsFiles = Directory.GetFiles(args[0], "*.istorage"); if (romFsFiles.Length == 0) { romFsFiles = Directory.GetFiles(args[0], "*.romfs"); } if (romFsFiles.Length > 0) { Logger.PrintInfo(LogClass.Application, "Loading as cart with RomFS."); device.LoadCart(args[0], romFsFiles[0]); } else { Logger.PrintInfo(LogClass.Application, "Loading as cart WITHOUT RomFS."); device.LoadCart(args[0]); } } else if (File.Exists(args[0])) { switch (Path.GetExtension(args[0]).ToLowerInvariant()) { case ".xci": Logger.PrintInfo(LogClass.Application, "Loading as XCI."); device.LoadXci(args[0]); break; case ".nca": Logger.PrintInfo(LogClass.Application, "Loading as NCA."); device.LoadNca(args[0]); break; case ".nsp": case ".pfs0": Logger.PrintInfo(LogClass.Application, "Loading as NSP."); device.LoadNsp(args[0]); break; default: Logger.PrintInfo(LogClass.Application, "Loading as homebrew."); device.LoadProgram(args[0]); break; } } else { Logger.PrintWarning(LogClass.Application, "Please specify a valid XCI/NCA/NSP/PFS0/NRO file"); } } else { Logger.PrintWarning(LogClass.Application, "Please specify the folder with the NSOs/IStorage or a NSO/NRO."); } if (device.System.State.DiscordIntergrationEnabled == true) { if (File.ReadAllLines(Path.Combine(ApplicationDirectory, "RPsupported.dat")).Contains(device.System.TitleID)) { DiscordPresence.Assets.LargeImageKey = device.System.TitleID; } DiscordPresence.Details = $"Playing {device.System.TitleName}"; DiscordPresence.State = device.System.TitleID.ToUpper(); DiscordPresence.Assets.LargeImageText = device.System.TitleName; DiscordPresence.Assets.SmallImageKey = "ryujinx"; DiscordPresence.Assets.SmallImageText = "Ryujinx is an emulator for the Nintendo Switch"; DiscordPresence.Timestamps = new Timestamps(DateTime.UtcNow); DiscordClient.SetPresence(DiscordPresence); } using (GlScreen screen = new GlScreen(device, renderer)) { screen.MainLoop(); Profile.FinishProfiling(); device.Dispose(); } audioOut.Dispose(); Logger.Shutdown(); DiscordClient.Dispose(); }
static void Main(string[] args) { Console.Title = "Ryujinx Console"; IGalRenderer renderer = new OGLRenderer(); IAalOutput audioOut = InitializeAudioEngine(); Switch device = new Switch(renderer, audioOut); Configuration.Load(Path.Combine(ApplicationDirectory, "Config.jsonc")); Configuration.Configure(device); AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; AppDomain.CurrentDomain.ProcessExit += CurrentDomain_ProcessExit; if (args.Length == 1) { if (Directory.Exists(args[0])) { string[] romFsFiles = Directory.GetFiles(args[0], "*.istorage"); if (romFsFiles.Length == 0) { romFsFiles = Directory.GetFiles(args[0], "*.romfs"); } if (romFsFiles.Length > 0) { Logger.PrintInfo(LogClass.Application, "Loading as cart with RomFS."); device.LoadCart(args[0], romFsFiles[0]); } else { Logger.PrintInfo(LogClass.Application, "Loading as cart WITHOUT RomFS."); device.LoadCart(args[0]); } } else if (File.Exists(args[0])) { switch (Path.GetExtension(args[0]).ToLowerInvariant()) { case ".xci": Logger.PrintInfo(LogClass.Application, "Loading as XCI."); device.LoadXci(args[0]); break; case ".nca": Logger.PrintInfo(LogClass.Application, "Loading as NCA."); device.LoadNca(args[0]); break; case ".nsp": case ".pfs0": Logger.PrintInfo(LogClass.Application, "Loading as NSP."); device.LoadNsp(args[0]); break; default: Logger.PrintInfo(LogClass.Application, "Loading as homebrew."); device.LoadProgram(args[0]); break; } } else { Logger.PrintWarning(LogClass.Application, "Please specify a valid XCI/NCA/NSP/PFS0/NRO file"); } } else { Logger.PrintWarning(LogClass.Application, "Please specify the folder with the NSOs/IStorage or a NSO/NRO."); } using (GlScreen screen = new GlScreen(device, renderer)) { screen.MainLoop(); device.Dispose(); } audioOut.Dispose(); Logger.Shutdown(); }
static void Main(string[] args) { Console.Title = "Ryujinx Console"; IGalRenderer renderer = new OGLRenderer(); IAalOutput audioOut = InitializeAudioEngine(); Switch device = new Switch(renderer, audioOut); Config.Read(device); Logger.Updated += Log.LogMessage; AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; AppDomain.CurrentDomain.ProcessExit += CurrentDomain_ProcessExit; if (args.Length == 1) { if (Directory.Exists(args[0])) { string[] romFsFiles = Directory.GetFiles(args[0], "*.istorage"); if (romFsFiles.Length == 0) { romFsFiles = Directory.GetFiles(args[0], "*.romfs"); } if (romFsFiles.Length > 0) { Console.WriteLine("Loading as cart with RomFS."); device.LoadCart(args[0], romFsFiles[0]); } else { Console.WriteLine("Loading as cart WITHOUT RomFS."); device.LoadCart(args[0]); } } else if (File.Exists(args[0])) { switch (Path.GetExtension(args[0]).ToLowerInvariant()) { case ".xci": Console.WriteLine("Loading as XCI."); device.LoadXci(args[0]); break; case ".nca": Console.WriteLine("Loading as NCA."); device.LoadNca(args[0]); break; case ".nsp": case ".pfs0": Console.WriteLine("Loading as NSP."); device.LoadNsp(args[0]); break; default: Console.WriteLine("Loading as homebrew."); device.LoadProgram(args[0]); break; } } } else { Console.WriteLine("Please specify the folder with the NSOs/IStorage or a NSO/NRO."); } using (GlScreen screen = new GlScreen(device, renderer)) { screen.MainLoop(); device.Dispose(); } audioOut.Dispose(); }