aboutsummaryrefslogtreecommitdiff
path: root/ShiftOS_TheReturn/CrashHandler.cs
diff options
context:
space:
mode:
authorMichael VanOverbeek <[email protected]>2017-05-21 13:05:31 +0000
committerMichael VanOverbeek <[email protected]>2017-05-21 13:05:31 +0000
commit68785f73f027b9dd4555b9f1ab7a22a1ca8794f8 (patch)
treef0c6dea13195bc516f90c2aa29cf85fa1488f6cf /ShiftOS_TheReturn/CrashHandler.cs
parent76b54853ba726179f9fddb30c6f838991b7aa71a (diff)
parent9999324bd7751f536741c108322766421dae1a52 (diff)
downloadshiftos_thereturn-68785f73f027b9dd4555b9f1ab7a22a1ca8794f8.tar.gz
shiftos_thereturn-68785f73f027b9dd4555b9f1ab7a22a1ca8794f8.tar.bz2
shiftos_thereturn-68785f73f027b9dd4555b9f1ab7a22a1ca8794f8.zip
Merge branch 'master' of https://github.com/shiftos-game/ShiftOS
I should hire Ash Ketchum to do this for me. He'd do a better job.
Diffstat (limited to 'ShiftOS_TheReturn/CrashHandler.cs')
-rw-r--r--ShiftOS_TheReturn/CrashHandler.cs225
1 files changed, 225 insertions, 0 deletions
diff --git a/ShiftOS_TheReturn/CrashHandler.cs b/ShiftOS_TheReturn/CrashHandler.cs
new file mode 100644
index 0000000..48eaf1f
--- /dev/null
+++ b/ShiftOS_TheReturn/CrashHandler.cs
@@ -0,0 +1,225 @@
+/*
+ * MIT License
+ *
+ * Copyright (c) 2017 Michael VanOverbeek and ShiftOS devs
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Reflection;
+using System.Management;
+using System.Windows.Forms;
+using Newtonsoft.Json;
+using System.Threading;
+using System.IO;
+
+namespace ShiftOS.Engine
+{
+ public class GetHardwareInfo
+ {
+ // returns the processor's name for the crash
+ public static string GetProcessorName()
+ {
+ string ProcessorName = ""; // put the processors name in here sometime later
+ ManagementObjectSearcher mos
+ = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Processor"); // OI CPU TELL ME YOUR NAME PLZ
+
+ foreach (ManagementObject mo in mos.Get())
+ ProcessorName = mo["Name"].ToString(); // see told you it puts in it there
+
+ return ProcessorName;
+ }
+ // same as above but instead for the gpu's name for the crash as well
+ public static string GetGPUName()
+ {
+ string GPUName = "";
+ ManagementObjectSearcher mos
+ = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_VideoController"); //now can you tell me your name cpu kthx
+
+ foreach (ManagementObject mo in mos.Get())
+ GPUName = mo["Name"].ToString();
+
+ return GPUName;
+ }
+ // oh wow even more same, but this time its RAM AMOUNT oooh nice
+ public static string GetRAMAmount()
+ {
+ var RAMAmount = "";
+ ManagementObjectSearcher mos
+ = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_PhysicalMemory"); //ram you too how much of you exists
+
+ foreach (ManagementObject mo in mos.Get())
+ RAMAmount = mo["Capacity"].ToString();
+
+ RAMAmount = (RAMAmount + " B"); // ooh and now we add "bytes" to the end
+
+ return RAMAmount;
+ }
+ }
+
+
+ public partial class CrashHandler : Form
+ {
+ //fuck it crashed
+ public CrashHandler()
+ {
+ InitializeComponent();
+
+
+ //Send the bug to Unite as a bug report
+ // or alternatively, send to [email protected]
+ // or just on the discord that works too
+
+ }
+
+ public static Exception HandledException = null; // this value determines if we can try to set the game back on track or we cant do anything about it
+
+ public static void Start(Exception e)
+ {
+ if(SaveSystem.CurrentSave != null)
+ TerminalBackend.InvokeCommand("sos.save"); // SAVE BEFORE CRASHING
+ ServerManager.Disconnect();
+
+ while (Application.OpenForms.Count > 0)
+ Application.OpenForms[0].Close();
+
+ //Set our global exception variable, and show the exception dialog.
+ HandledException = e;
+ System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
+ System.IO.FileInfo fileInfo = new System.IO.FileInfo(assembly.Location);
+ DateTime lastModified = fileInfo.LastWriteTime;
+
+ // put all this in a text document
+ string rtbcrash_Text = $@" === {AssemblyName} has crashed. ===
+
+Game: {AssemblyName}
+Description: {AssemblyDescription}
+
+Basic Information For User:
+---------------------------------
+
+When: {DateTime.Now.ToString()}
+Why: {HandledException.Message}
+What: {HandledException.GetType().Name}
+
+We, at the ShiftOS Development Team, apologise for your game crash,
+we will take this bug report seriously - and it has been emailed
+to the development team of ShiftOS, thank you for enjoying our game!
+
+Advanced Information (for experts and developers):
+----------------------------------------------------
+
+Host system information:
+---------------------------------
+
+Operating system: {Environment.OSVersion.Platform.ToString()}
+Version: {Environment.OSVersion.VersionString}
+Is 64-bit: {Environment.Is64BitOperatingSystem}
+ShiftOS exec path: {Application.ExecutablePath}
+
+Advanced Host Information:
+---------------------------------
+
+CPU Name: {GetHardwareInfo.GetProcessorName()}
+Physical RAM Installed: {GetHardwareInfo.GetRAMAmount()}
+GPU Name: {GetHardwareInfo.GetGPUName()}
+
+ShiftOS basic information:
+---------------------------------
+
+ShiftOS Version: {Assembly.GetExecutingAssembly().GetName().Version}
+ShiftOS Date: {lastModified.ToString()}
+
+ShiftOS environment information:
+---------------------------------
+
+Is Save loaded: {(SaveSystem.CurrentSave != null)}
+Paths loaded in system: {JsonConvert.SerializeObject(Paths.GetAll())}
+
+
+Crash: {HandledException.GetType().Name}
+--------------------------------------------
+
+Exception message: {HandledException.Message}
+HResult (this is technical): {HandledException.HResult}
+Has inner exception: {(HandledException.InnerException != null)}
+Stack trace:
+{HandledException.StackTrace}";
+
+ if (HandledException.InnerException != null)
+ {
+ var i = HandledException.InnerException;
+ rtbcrash_Text += $@"
+
+Inner: {i.GetType().Name}
+--------------------------------------------
+
+Exception message: {i.Message}
+HResult (this is technical): {i.HResult}
+Stack trace:
+{i.StackTrace}";
+
+ }
+
+ File.WriteAllText("crash.txt", rtbcrash_Text); // make that text document and put above super long string in it
+ var result = MessageBox.Show(caption: "ShiftOS - Fatal error", text: "ShiftOS has encountered a fatal error and has been shut down. Info about the error has been saved to a file called crash.txt in the same folder as the active executable. Would you like to try and recover the game session?", buttons: MessageBoxButtons.YesNo);
+ if(result == DialogResult.Yes)
+ {
+ Application.Restart(); // tries to restart if user clicks yes, who wouldve guessed
+ }
+ }
+
+ private void button1_Click(object sender, EventArgs e)
+ {
+ this.Close();
+ }
+
+ private void btnjump_Click(object sender, EventArgs e)
+ {
+ this.Close();
+ Application.Restart();
+ }
+
+ // make both of those variables that appear in the long string above
+ public static string AssemblyName { get; private set; }
+ public static string AssemblyDescription { get; private set; }
+
+ // get info about the game itself
+ public static void SetGameMetadata(Assembly assembly)
+ {
+ AssemblyName = assembly.GetName().Name; // name of game
+ foreach(var attr in assembly.GetCustomAttributes(true))
+ {
+ if(attr is AssemblyDescriptionAttribute)
+ {
+ AssemblyDescription = (attr as AssemblyDescriptionAttribute).Description; // description of the game
+ }
+ }
+
+ }
+ }
+}