Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of ValheimReporter v1.1.0
ValheimReporter.dll
Decompiled 2 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.Networking; using UnityEngine.SceneManagement; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace ValheimReporter { public static class CategoryLoader { public static CategoriesRoot Load(string fileName) { try { string path = Path.Combine(ValheimReporter.DataPath, fileName); if (!File.Exists(path)) { Utils.LogSystem("CategoryLoader", "Load", "JSON file missing: " + fileName, "error", 1); return null; } string text = File.ReadAllText(path); Dictionary<string, Category> categories = JsonConvert.DeserializeObject<Dictionary<string, Category>>(text); return new CategoriesRoot { Categories = categories }; } catch (Exception ex) { Utils.LogSystem("CategoryLoader", "Load", "Error parsing categories: " + ex.Message, "error", 1); return null; } } } public class CategoriesRoot { public Dictionary<string, Category> Categories { get; set; } = new Dictionary<string, Category>(); public Category GetCategory(string id) { Category value; return Categories.TryGetValue(id, out value) ? value : null; } public Category GetCategoryByName(string name) { foreach (Category value in Categories.Values) { if (value.Name == name) { Utils.LogSystem("CategoryLoader", "GetCategoryByName", "Found category: " + value.Name, "log", 4); return value; } } Utils.LogSystem("CategoryLoader", "GetCategoryByName", "Category not found: " + name, "error", 4); return null; } public Subcategory GetSubcategory(string id) { foreach (Category value2 in Categories.Values) { if (value2.HasSubcategories && value2.Subcategories.TryGetValue(id, out var value)) { Utils.LogSystem("CategoryLoader", "GetSubcategory", "Found subcategory: " + value.Name, "log", 4); return value; } } Utils.LogSystem("CategoryLoader", "GetSubcategory", "Subcategory not found: " + id, "error", 4); return null; } public Subcategory GetSubcategoryByName(string name) { foreach (Category value in Categories.Values) { if (!value.HasSubcategories) { continue; } foreach (Subcategory value2 in value.Subcategories.Values) { if (value2.Name == name) { Utils.LogSystem("CategoryLoader", "GetSubcategoryByName", "Found subcategory: " + value2.Name, "log", 4); return value2; } } } Utils.LogSystem("CategoryLoader", "GetSubcategoryByName", "Subcategory not found: " + name, "error", 4); return null; } public List<Category> GetList() { return new List<Category>(Categories.Values); } } public class Category { [JsonProperty("name")] public string Name { get; set; } [JsonProperty("webhook")] public string Webhook { get; set; } [JsonProperty("required")] public Requirements Required { get; set; } [JsonProperty("subcategories")] public Dictionary<string, Subcategory> Subcategories { get; set; } = new Dictionary<string, Subcategory>(); [JsonIgnore] public bool HasSubcategories => Subcategories != null && Subcategories.Count > 0; } public class Subcategory { [JsonProperty("name")] public string Name { get; set; } [JsonProperty("webhook")] public string Webhook { get; set; } [JsonProperty("required")] public Requirements Required { get; set; } } public class Requirements { [JsonProperty("pictures")] public bool Pictures { get; set; } [JsonProperty("subject")] public bool Subject { get; set; } [JsonProperty("description")] public bool Description { get; set; } } public class Report { [CompilerGenerated] private sealed class <SendReportCoroutine>d__59 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public Report <>4__this; private List<string>.Enumerator <>s__1; private string <webhook>5__2; private List<IMultipartFormSection> <formData>5__3; private string <safeCategory>5__4; private string <safeSubCategory>5__5; private string <safeSubject>5__6; private string <safeDescription>5__7; private string <embedJson>5__8; private UnityWebRequest <www>5__9; private string <errorResponse>5__10; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <SendReportCoroutine>d__59(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if ((uint)(num - -4) <= 1u || num == 1) { try { if (num == -4 || num == 1) { try { } finally { <>m__Finally2(); } } } finally { <>m__Finally1(); } } <>s__1 = default(List<string>.Enumerator); <webhook>5__2 = null; <formData>5__3 = null; <safeCategory>5__4 = null; <safeSubCategory>5__5 = null; <safeSubject>5__6 = null; <safeDescription>5__7 = null; <embedJson>5__8 = null; <www>5__9 = null; <errorResponse>5__10 = null; <>1__state = -2; } private bool MoveNext() { //IL_03b0: Unknown result type (might be due to invalid IL or missing references) //IL_03b6: Invalid comparison between Unknown and I4 //IL_02aa: Unknown result type (might be due to invalid IL or missing references) //IL_02b4: Expected O, but got Unknown //IL_02f1: Unknown result type (might be due to invalid IL or missing references) //IL_02fb: Expected O, but got Unknown //IL_033a: Unknown result type (might be due to invalid IL or missing references) //IL_0344: Expected O, but got Unknown try { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>4__this.GenerateReportID(); <>4__this.SaveToLocalLogs(); <>s__1 = <>4__this.Webhook.GetEnumerator(); <>1__state = -3; break; case 1: <>1__state = -4; if ((int)<www>5__9.result != 1) { <errorResponse>5__10 = ((<www>5__9.downloadHandler != null) ? <www>5__9.downloadHandler.text : "No response body"); Utils.LogSystem("Report", "Send", "Discord Webhook Error: " + <www>5__9.error + " | Details: " + <errorResponse>5__10, "error", 1); <errorResponse>5__10 = null; } else { ValheimReporter.playSoundFlag = true; Utils.LogSystem("Report", "Send", "Report successfully sent to Discord.", "success", 3); } <>m__Finally2(); <www>5__9 = null; <formData>5__3 = null; <safeCategory>5__4 = null; <safeSubCategory>5__5 = null; <safeSubject>5__6 = null; <safeDescription>5__7 = null; <embedJson>5__8 = null; <webhook>5__2 = null; break; } while (<>s__1.MoveNext()) { <webhook>5__2 = <>s__1.Current; if (string.IsNullOrEmpty(<webhook>5__2)) { Utils.LogSystem("Report", "Send", "Webhook URL is empty!", "error", 1); continue; } <formData>5__3 = new List<IMultipartFormSection>(); <safeCategory>5__4 = <>4__this.Category ?? "Not Specified"; <safeSubCategory>5__5 = <>4__this.SubCategory ?? "Not Specified"; <safeSubject>5__6 = (string.IsNullOrEmpty(<>4__this.Subject) ? "Not Specified" : <>4__this.Subject); <safeDescription>5__7 = (string.IsNullOrEmpty(<>4__this.Description) ? "Not Specified" : <>4__this.Description); <embedJson>5__8 = JsonConvert.SerializeObject((object)new { username = "Valheim Reporter", avatar_url = "https://i.ibb.co/KpNZ88cv/Gemini-Generated-Image-wk1a8fwk1a8fwk1a.png", webhook = (<webhook>5__2.StartsWith(Utils.ENCRIPTION_HEADER) ? <webhook>5__2 : null), embeds = new[] { new { title = "New Report: " + <>4__this.ReportID, color = 15105570, fields = new[] { new { name = "Player", value = <>4__this.PlayerName, inline = true }, new { name = "Steam ID", value = <>4__this.SteamID, inline = true }, new { name = "Discord ID", value = "<@" + <>4__this.DiscordID + ">", inline = true }, new { name = "Coordinates", value = <>4__this.Coordinates, inline = false }, new { name = "Timestamp", value = <>4__this.Date + " | " + <>4__this.Time, inline = false }, new { name = "Category", value = <safeCategory>5__4, inline = true }, new { name = "Subcategory", value = <safeSubCategory>5__5, inline = true }, new { name = "Subject", value = <safeSubject>5__6, inline = false }, new { name = "Description", value = <safeDescription>5__7, inline = false } }, footer = new { text = "Valheim Reporter System" } } } }); <formData>5__3.Add((IMultipartFormSection)new MultipartFormDataSection("payload_json", <embedJson>5__8)); if ((Object)(object)<>4__this.Image1 != (Object)null) { <formData>5__3.Add((IMultipartFormSection)new MultipartFormFileSection("file", ImageConversion.EncodeToJPG(<>4__this.Image1, 75), "screenshot1.jpg", "image/jpeg")); } if ((Object)(object)<>4__this.Image2 != (Object)null) { <formData>5__3.Add((IMultipartFormSection)new MultipartFormFileSection("file2", ImageConversion.EncodeToJPG(<>4__this.Image2, 75), "screenshot2.jpg", "image/jpeg")); } <www>5__9 = UnityWebRequest.Post(<webhook>5__2.StartsWith(Utils.ENCRIPTION_HEADER) ? ValheimReporter.ConfigAPIKey.Value : <webhook>5__2, <formData>5__3); <>1__state = -4; <>2__current = <www>5__9.SendWebRequest(); <>1__state = 1; return true; } <>m__Finally1(); <>s__1 = default(List<string>.Enumerator); return false; } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; ((IDisposable)<>s__1).Dispose(); } private void <>m__Finally2() { <>1__state = -3; if (<www>5__9 != null) { ((IDisposable)<www>5__9).Dispose(); } } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } public string Date { get; set; } public string Time { get; set; } public Texture2D Image1 { get; set; } public Texture2D Image2 { get; set; } public string PlayerName { get; set; } public string SteamID { get; set; } public string DiscordID { get; set; } public string Coordinates { get; set; } public List<string> Webhook { get; set; } public string Category { get; set; } public string SubCategory { get; set; } public string Subject { get; set; } public string Description { get; set; } public string ReportID { get; private set; } public Report() { DateTime now = DateTime.Now; Date = now.ToString("yyyy-MM-dd"); Time = now.ToString("HH-mm-ss"); } public void GenerateReportID() { ReportID = "[" + PlayerName + "] - " + Date + "_" + Time; } private void SaveToLocalLogs() { try { string path = Date + "_" + Time; string text = Path.Combine(ValheimReporter.LogsPath, path); if (!Directory.Exists(text)) { Directory.CreateDirectory(text); } string text2 = Path.Combine(text, Date + "_log.json"); var anon = new { ReportID, Date, Time, PlayerName, SteamID, DiscordID, Coordinates, Webhook, Category, SubCategory, Subject, Description }; string contents = JsonConvert.SerializeObject((object)anon, (Formatting)1); File.WriteAllText(text2, contents); if ((Object)(object)Image1 != (Object)null) { Utils.Screen.SaveTextureToFile(Image1, Path.Combine(text, "world_view")); } if ((Object)(object)Image2 != (Object)null) { Utils.Screen.SaveTextureToFile(Image2, Path.Combine(text, "map_view")); } Utils.LogSystem("Report", "SaveLocal", "Log saved to: " + text2, "success", 3); } catch (Exception ex) { Utils.LogSystem("Report", "SaveLocal", "Error saving log: " + ex.Message, "error", 1); } } [IteratorStateMachine(typeof(<SendReportCoroutine>d__59))] public IEnumerator SendReportCoroutine() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <SendReportCoroutine>d__59(0) { <>4__this = this }; } } public static class Utils { public static class Colors { public static class Text { public static readonly string RED = "\u001b[31m"; public static readonly string RED_BOLD = "\u001b[31;1m"; public static readonly string GREEN = "\u001b[32m"; public static readonly string GREEN_BOLD = "\u001b[32;1m"; public static readonly string YELLOW = "\u001b[33m"; public static readonly string YELLOW_BOLD = "\u001b[33;1m"; public static readonly string BLUE = "\u001b[34m"; public static readonly string BLUE_BOLD = "\u001b[34;1m"; public static readonly string MAGENTA = "\u001b[35m"; public static readonly string MAGENTA_BOLD = "\u001b[35;1m"; public static readonly string CYAN = "\u001b[36m"; public static readonly string CYAN_BOLD = "\u001b[36;1m"; public static readonly string WHITE = "\u001b[37m"; public static readonly string WHITE_BOLD = "\u001b[37;1m"; public static readonly string GRAY = "\u001b[90m"; public static readonly string GRAY_BOLD = "\u001b[90;1m"; public static readonly string BLACK = "\u001b[30m"; public static readonly string BLACK_BOLD = "\u001b[30;1m"; } public static class ForeGround { public static readonly string BLACK = "\u001b[40m"; public static readonly string RED = "\u001b[41m"; public static readonly string GREEN = "\u001b[42m"; public static readonly string YELLOW = "\u001b[43m"; public static readonly string BLUE = "\u001b[44m"; public static readonly string MAGENTA = "\u001b[45m"; public static readonly string CYAN = "\u001b[46m"; public static readonly string WHITE = "\u001b[47m"; } public static readonly string BOLD = "\u001b[1m"; public static readonly string UNDERLINED = "\u001b[4m"; public static readonly string RESET = "\u001b[0m"; } public static class PlayerUtils { private static Vector3 playerLastPosition = Vector3.zero; public static Vector3 GetPlayerPosition() { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) playerLastPosition = ((Component)Player.m_localPlayer).transform.position; return playerLastPosition; } public static Vector3 GetPlayerLastPosition() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) return playerLastPosition; } } public static class Screen { public static bool toggleCursorMode; public static bool preventPlayerMovement; public static void ToggleCursorMode(bool preventPlayerMovement = false) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) Scene activeScene = SceneManager.GetActiveScene(); if (!(((Scene)(ref activeScene)).name != "start") || !((Object)(object)Player.m_localPlayer != (Object)null)) { return; } if (toggleCursorMode) { Cursor.lockState = (CursorLockMode)1; Cursor.visible = false; toggleCursorMode = false; FieldInfo field = typeof(GameCamera).GetField("m_mouseCapture", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { field.SetValue(GameCamera.instance, true); } } else { Cursor.lockState = (CursorLockMode)0; Cursor.visible = true; toggleCursorMode = true; Screen.preventPlayerMovement = preventPlayerMovement; } } public static void SaveTextureToFile(Texture2D tex, string fileName) { if (!((Object)(object)tex == (Object)null)) { byte[] bytes = null; switch (ValheimReporter.ConfigImageFormat.Value) { case ValheimReporter.ImageFormat.JPG: fileName += ".jpg"; bytes = ImageConversion.EncodeToJPG(tex, 75); break; case ValheimReporter.ImageFormat.PNG: fileName += ".png"; bytes = ImageConversion.EncodeToPNG(tex); break; } File.WriteAllBytes(fileName, bytes); } } } public static bool debugMode = false; public static bool outputMode = false; private static bool hasInitializedLogFile = false; public static bool isReporterOpen = false; public static readonly string ENCRIPTION_HEADER = "[NH]-3247"; private static readonly ManualLogSource Logger = Logger.CreateLogSource("ValheimReporter"); public static string GetVersion() { return typeof(ValheimReporter).Assembly.GetName().Version.ToString(); } public static void LogSystem(string sender, string function, string message, string type = "log", int level = 10, bool forcedVerbose = false) { if (!(debugMode || forcedVerbose) && level >= 4) { return; } string text = ""; string text2 = Colors.Text.WHITE_BOLD + " || "; string text3 = Colors.Text.WHITE_BOLD + " ->> "; string text4 = Colors.Text.CYAN; string text5 = Colors.Text.RED; string text6 = Colors.Text.MAGENTA_BOLD; string text7 = Colors.Text.YELLOW; string wHITE_BOLD = Colors.Text.WHITE_BOLD; string wHITE_BOLD2 = Colors.Text.WHITE_BOLD; string text8 = type.ToLower(); string text9 = text8; if (!(text9 == "success")) { if (text9 == "error") { text = Colors.ForeGround.RED; text4 = Colors.Text.WHITE_BOLD; text5 = Colors.Text.WHITE_BOLD; text6 = Colors.Text.WHITE_BOLD; text7 = Colors.Text.WHITE_BOLD; wHITE_BOLD = Colors.Text.WHITE_BOLD; wHITE_BOLD2 = Colors.Text.WHITE_BOLD; } } else { text = Colors.ForeGround.GREEN; text4 = Colors.Text.WHITE_BOLD; text5 = Colors.Text.WHITE_BOLD; text6 = Colors.Text.WHITE_BOLD; text7 = Colors.Text.WHITE_BOLD; wHITE_BOLD = Colors.Text.WHITE_BOLD; wHITE_BOLD2 = Colors.Text.WHITE_BOLD; } string text10 = text4 + "#### [NH]" + text2 + text5 + "[VALHEIM REPORTER]"; string text11 = text6 + "< " + sender + " >"; string text12 = text7 + "{ " + function + " }"; string text13 = wHITE_BOLD + "[ " + type.ToUpper() + " ]"; string text14 = wHITE_BOLD2 + message; string text15 = text + text10 + text2; if (debugMode || level == 1) { text15 = text15 + text11 + text2 + text12 + text2 + text13; } else { switch (level) { case 2: text15 = text15 + text11 + text2 + text13; break; case 3: text15 += text13; break; } } text15 = text15 + text3 + text14 + Colors.RESET; Logger.LogMessage((object)text15); if (!outputMode) { return; } text2 = " || "; text3 = " ->> "; text10 = "#### [NH]" + text2 + "[VALHEIM REPORTER]"; text11 = "< " + sender + " >"; text12 = "{ " + function + " }"; text13 = "[ " + type.ToUpper() + " ]"; text14 = text3 + message; text15 = text10 + text2 + text11 + text2 + text12 + text2 + text13 + text2 + text14; try { string path = Path.Combine(ValheimReporter.RootConfigValheimPath, "NH-ValheimReporter.log"); if (!hasInitializedLogFile) { File.WriteAllText(path, text15 + Environment.NewLine); hasInitializedLogFile = true; } else { File.AppendAllText(path, text15 + Environment.NewLine); } } catch (Exception ex) { LogSystem("ValheimReporter", "LogSystem", "Failed to write log file: " + ex.Message, "error"); } } public static void DeleteOldLogs() { try { if (!Directory.Exists(ValheimReporter.LogsPath)) { return; } DirectoryInfo directoryInfo = new DirectoryInfo(ValheimReporter.LogsPath); DirectoryInfo[] directories = directoryInfo.GetDirectories(); int value = ValheimReporter.ConfigMaxLogs.Value; if (directories.Length <= value) { return; } IEnumerable<DirectoryInfo> enumerable = directories.OrderBy((DirectoryInfo f) => f.Name).Take(directories.Length - value); foreach (DirectoryInfo item in enumerable) { try { item.Delete(recursive: true); LogSystem("LogManager", "DeleteOldLogs", "Deleted old log folder: " + item.Name, "log", 3); } catch (Exception ex) { LogSystem("LogManager", "DeleteOldLogs", "Failed to delete " + item.Name + ": " + ex.Message, "error", 1); } } } catch (Exception ex2) { LogSystem("LogManager", "DeleteOldLogs", "Critical error managing logs: " + ex2.Message, "error", 1); } } } [HarmonyPatch(typeof(GameCamera), "UpdateCamera")] public static class GameCamera_Patch { private static bool Prefix() { if (Utils.Screen.toggleCursorMode) { FieldInfo field = typeof(GameCamera).GetField("m_mouseCapture", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { field.SetValue(GameCamera.instance, false); } return false; } return true; } } [HarmonyPatch(typeof(Player), "CanMove")] public static class Player_Movement { private static bool Prefix() { if (Utils.Screen.toggleCursorMode && Utils.Screen.preventPlayerMovement) { return false; } return true; } } [HarmonyPatch(typeof(Character), "Jump")] public static class Player_Jump { private static bool Prefix(Character __instance) { Player val = (Player)(object)((__instance is Player) ? __instance : null); if (val != null && ((Character)val).IsPlayer() && Utils.Screen.toggleCursorMode && Utils.Screen.preventPlayerMovement) { return false; } return true; } } [HarmonyPatch(typeof(Player), "TakeInput")] internal static class BlockInputPatch { private static bool Prefix() { if (Utils.isReporterOpen) { return false; } return true; } } [BepInPlugin("n1h1lius.valheimreporter", "Valheim Reporter", "1.0.0")] public class ValheimReporter : BaseUnityPlugin { public enum ImageFormat { JPG, PNG } public static AssetBundle MainAssetBundle; public static CategoriesRoot ReportCategories; private static GameObject _instanciaUI; private static ValheimReporterController _controller; public static bool playSoundFlag = false; public static ConfigEntry<KeyCode> ConfigOpenKey; public static ConfigEntry<bool> ConfigCloseOnSend; public static ConfigEntry<float> ConfigFadeDuration; public static ConfigEntry<bool> ConfigRequirementsRemark; public static ConfigEntry<bool> ConfigConfirmationSound; public static ConfigEntry<string> ConfigDiscordID; public static ConfigEntry<string> ConfigAPIKey; public static ConfigEntry<string> ConfigWorldName; public static ConfigEntry<bool> ConfigDeleteLogs; public static ConfigEntry<int> ConfigMaxLogs; public static ConfigEntry<float> ConfigMapZoom; public static ConfigEntry<ImageFormat> ConfigImageFormat; public static ConfigEntry<bool> ConfigDebugMode; public static ConfigEntry<bool> ConfigOutputMode; public static readonly string RootConfigValheimPath = Path.Combine(Paths.ConfigPath, "ValheimReporter"); public static readonly string DataPath = Path.Combine(RootConfigValheimPath, "Data"); public static readonly string AssetsPath = Path.Combine(DataPath, "Assets"); public static readonly string ImagesPath = Path.Combine(DataPath, "Images"); public static readonly string LogsPath = Path.Combine(RootConfigValheimPath, "Logs"); private readonly Harmony harmony = new Harmony("com.n1h1lius.valheimreporter"); private void Awake() { EnsurePluginFoldersAndFiles(); harmony.PatchAll(); Init(); } private void Update() { if (HandleOpenManager()) { if ((Object)(object)_instanciaUI == (Object)null) { Utils.LogSystem("ValheimReporter", "Update", "INIT UI...", "log", 3); GameObject val = MainAssetBundle.LoadAsset<GameObject>("ReporterCanvas"); _instanciaUI = Object.Instantiate<GameObject>(val); Object.DontDestroyOnLoad((Object)(object)_instanciaUI); _controller = _instanciaUI.AddComponent<ValheimReporterController>(); _controller.StartReporter(); } if ((Object)(object)_controller != (Object)null) { Utils.LogSystem("ValheimReporter", "Update", "Toggle Main Manager...", "log", 4); _controller.ToggleMainManager(); } } if ((Object)(object)_instanciaUI != (Object)null && (Object)(object)_controller != (Object)null && _controller.getIsReporterOpen()) { _controller.UpdateFooterInfo(); } } private void OnDestroy() { harmony.UnpatchSelf(); } private void Init() { string text = Path.Combine(AssetsPath, "valheim_reporter_bundle"); if (File.Exists(text)) { MainAssetBundle = AssetBundle.LoadFromFile(text); Utils.LogSystem("ValheimReporter", "Awake", "Bundle Loaded Successfully.", "success", 3); } else { Utils.LogSystem("ValheimReporter", "Awake", "Bundle Not Found.", "error", 1); } ReportCategories = CategoryLoader.Load("categories.json"); if (ReportCategories != null) { Utils.LogSystem("ValheimReporter", "Awake", "Categories Loaded Successfully.", "success", 3); } ConfigOpenKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("General", "Open Key", (KeyCode)291, "The key to open the main manager. Default: F10"); ConfigCloseOnSend = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Close On Send", true, "Close the main manager when a report is sent. Default: true"); ConfigFadeDuration = ((BaseUnityPlugin)this).Config.Bind<float>("General", "Fade Duration", 0.09f, "The duration of the fade animation of the main manager. Default: 0.09"); ConfigRequirementsRemark = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Requirements Remark", true, "Show the requirements remark in Report Screen. It's just a visual aid to notice when some parameters are missing. Default: true"); ConfigConfirmationSound = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Confirmation Sound", true, "Play a confirmation sound when a report is sent. Default: true"); ConfigDiscordID = ((BaseUnityPlugin)this).Config.Bind<string>("ServerRequirements", "Discord ID", "Discord ID", "Your Discord ID. Default: Discord ID"); ConfigAPIKey = ((BaseUnityPlugin)this).Config.Bind<string>("ServerRequirements", "API Key", "API_KEY", "Server's API Key. Default: API_KEY"); ConfigWorldName = ((BaseUnityPlugin)this).Config.Bind<string>("ServerRequirements", "World Name", "WORLD_NAME", "Server's World Name. Default: WORLD_NAME"); ConfigMapZoom = ((BaseUnityPlugin)this).Config.Bind<float>("Screenshots", "Map Zoom", 0.5f, "The zoom level of the map on the screenshots. 0.5f - 1.0f is a balanced zoom for seeing the area. // 0.5f is a good value. The smaller the number, the closer (0.1 very close, 1.0 very far). Default: 0.5"); ConfigImageFormat = ((BaseUnityPlugin)this).Config.Bind<ImageFormat>("Screenshots", "Image Format", ImageFormat.JPG, "The format of the screenshots ouput. This is just client side. Reports will always send JPG high compression images. Default: JPG"); ConfigDeleteLogs = ((BaseUnityPlugin)this).Config.Bind<bool>("LogSystem", "Delete Reports", false, "Delete the report files when the maximum number of reports is reached. Default: false"); ConfigMaxLogs = ((BaseUnityPlugin)this).Config.Bind<int>("LogSystem", "Max Logs", 10, "The maximum number of report files to keep. Default: 10"); ConfigOutputMode = ((BaseUnityPlugin)this).Config.Bind<bool>("LogSystem", "Output Mode", false, "Enable output mode. It will output the logs a .log file. Default: false"); ConfigDebugMode = ((BaseUnityPlugin)this).Config.Bind<bool>("DebugMode", "Debug Mode", false, "Enable debug mode. For developers only. Default: false"); Utils.debugMode = ConfigDebugMode.Value; Utils.outputMode = ConfigOutputMode.Value; if (ConfigDeleteLogs.Value && ConfigMaxLogs.Value > 0) { Utils.DeleteOldLogs(); } Utils.LogSystem("ValheimReporter", "Awake", "Plugin Loaded Successfully.", "success", 3); } private bool HandleOpenManager() { //IL_0078: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)Player.m_localPlayer == (Object)null || (Object)(object)ZNetScene.instance == (Object)null) { return false; } if ((Object)(object)Chat.instance != (Object)null && Chat.instance.HasFocus()) { return false; } if (Console.IsVisible() || Menu.IsVisible() || TextInput.IsVisible()) { return false; } if (Game.IsPaused()) { return false; } if (Input.GetKeyDown(ConfigOpenKey.Value)) { return true; } return false; } public static GameObject GetInstance() { return _instanciaUI; } private void EnsurePluginFoldersAndFiles() { try { if (!Directory.Exists(AssetsPath)) { Directory.CreateDirectory(AssetsPath); } if (!Directory.Exists(ImagesPath)) { Directory.CreateDirectory(ImagesPath); } if (!Directory.Exists(LogsPath)) { Directory.CreateDirectory(LogsPath); } Dictionary<string, string> dictionary = new Dictionary<string, string> { { Path.Combine(AssetsPath, "confirm.ogg"), "ValheimReporter.ValheimReporter.Data.Assets.confirm.ogg" }, { Path.Combine(AssetsPath, "valheim_reporter_bundle"), "ValheimReporter.ValheimReporter.Data.Assets.valheim_reporter_bundle" }, { Path.Combine(ImagesPath, "NoPicture.png"), "ValheimReporter.ValheimReporter.Data.Images.NoPicture.png" }, { Path.Combine(DataPath, "samples_categories.json"), "ValheimReporter.ValheimReporter.Data.samples_categories.json" }, { Path.Combine(DataPath, "categories.json"), "ValheimReporter.ValheimReporter.Data.categories.json" } }; foreach (KeyValuePair<string, string> item in dictionary) { string key = item.Key; string value = item.Value; if (!File.Exists(key)) { Utils.LogSystem("ValheimReporter", "EnsurePluginFoldersAndFiles", "Extracting missing file: " + Path.GetFileName(key), "success", 1); ExtractEmbeddedResource(value, key); } } } catch (Exception ex) { Utils.LogSystem("ValheimReporter", "EnsurePluginFoldersAndFiles", "Error during folder/file setup: " + ex.Message, "error", 1); } } private void ExtractEmbeddedResource(string resourceName, string outputPath) { Assembly executingAssembly = Assembly.GetExecutingAssembly(); using Stream stream = executingAssembly.GetManifestResourceStream(resourceName); if (stream == null) { ((BaseUnityPlugin)this).Logger.LogError((object)("Resource not found: " + resourceName)); return; } using FileStream destination = new FileStream(outputPath, FileMode.Create, FileAccess.Write); stream.CopyTo(destination); } } public class ValheimReporterController : MonoBehaviour { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static UnityAction <>9__59_10; public static UnityAction <>9__59_11; internal void <BindUIEvents>b__59_10() { Application.OpenURL("https://github.com/n1h1lius"); } internal void <BindUIEvents>b__59_11() { Application.OpenURL("https://github.com/n1h1lius/Valheim-Reporter"); } } [CompilerGenerated] private sealed class <CaptureCleanScreenshot>d__76 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ValheimReporterController <>4__this; private bool <hudWasActive>5__1; private bool <mapWasOpen>5__2; private FieldInfo <zoomField>5__3; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <CaptureCleanScreenshot>d__76(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <zoomField>5__3 = null; <>1__state = -2; } private bool MoveNext() { //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Invalid comparison between Unknown and I4 //IL_0189: Unknown result type (might be due to invalid IL or missing references) //IL_0193: Expected O, but got Unknown //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <hudWasActive>5__1 = (Object)(object)Hud.instance != (Object)null && (Object)(object)Hud.instance.m_rootObject != (Object)null && Hud.instance.m_rootObject.activeSelf; if ((Object)(object)Hud.instance != (Object)null && (Object)(object)Hud.instance.m_rootObject != (Object)null) { Hud.instance.m_rootObject.SetActive(false); } if ((Object)(object)<>4__this.mainCanvas != (Object)null) { ((Behaviour)<>4__this.mainCanvas).enabled = false; } <>2__current = (object)new WaitForEndOfFrame(); <>1__state = 1; return true; case 1: <>1__state = -1; <>4__this.screenshotImage1.texture = (Texture)(object)ScreenCapture.CaptureScreenshotAsTexture(); if ((Object)(object)Minimap.instance != (Object)null) { Hud.instance.m_rootObject.SetActive(true); <mapWasOpen>5__2 = (int)Minimap.instance.m_mode == 2; Minimap.instance.SetMapMode((MapMode)2); <zoomField>5__3 = typeof(Minimap).GetField("m_largeZoom", BindingFlags.Instance | BindingFlags.NonPublic); if (<zoomField>5__3 != null) { <zoomField>5__3.SetValue(Minimap.instance, ValheimReporter.ConfigMapZoom.Value); } <>2__current = (object)new WaitForEndOfFrame(); <>1__state = 2; return true; } break; case 2: <>1__state = -1; <>4__this.screenshotImage2.texture = (Texture)(object)ScreenCapture.CaptureScreenshotAsTexture(); if (!<mapWasOpen>5__2) { Minimap.instance.SetMapMode((MapMode)1); } <zoomField>5__3 = null; break; } <>4__this.screenshotTaken = true; if ((Object)(object)<>4__this.mainCanvas != (Object)null) { ((Behaviour)<>4__this.mainCanvas).enabled = true; } if (((Object)(object)Hud.instance != (Object)null && (Object)(object)Hud.instance.m_rootObject != (Object)null) & <hudWasActive>5__1) { Hud.instance.m_rootObject.SetActive(true); } return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <Fade>d__67 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public CanvasGroup group; public float startAlpha; public float endAlpha; public Action onComplete; public ValheimReporterController <>4__this; private float <elapsedTime>5__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <Fade>d__67(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <elapsedTime>5__1 = 0f; group.alpha = startAlpha; if (endAlpha > 0f) { group.blocksRaycasts = true; group.interactable = true; } else { group.blocksRaycasts = false; group.interactable = false; } break; case 1: <>1__state = -1; break; } if (<elapsedTime>5__1 < <>4__this.fadeDuration) { <elapsedTime>5__1 += Time.unscaledDeltaTime; group.alpha = Mathf.Lerp(startAlpha, endAlpha, <elapsedTime>5__1 / <>4__this.fadeDuration); <>2__current = null; <>1__state = 1; return true; } group.alpha = endAlpha; onComplete?.Invoke(); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <FetchStanza>d__74 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ValheimReporterController <>4__this; private UnityWebRequest <webRequest>5__1; private string <jsonResult>5__2; private string <cleanJson>5__3; private string[] <parts>5__4; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <FetchStanza>d__74(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if (num == -3 || num == 1) { try { } finally { <>m__Finally1(); } } <webRequest>5__1 = null; <jsonResult>5__2 = null; <cleanJson>5__3 = null; <parts>5__4 = null; <>1__state = -2; } private bool MoveNext() { //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Invalid comparison between Unknown and I4 //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Invalid comparison between Unknown and I4 try { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <webRequest>5__1 = UnityWebRequest.Get(<>4__this.apiUrl); <>1__state = -3; <>2__current = <webRequest>5__1.SendWebRequest(); <>1__state = 1; return true; case 1: <>1__state = -3; if ((int)<webRequest>5__1.result == 2 || (int)<webRequest>5__1.result == 3) { Debug.LogError((object)("FETCHING API ERROR: " + <webRequest>5__1.error)); } else { <jsonResult>5__2 = <webRequest>5__1.downloadHandler.text; <cleanJson>5__3 = <jsonResult>5__2.Trim('[', ']'); <parts>5__4 = <cleanJson>5__3.Split(new string[1] { "\",\"" }, StringSplitOptions.None); if (<parts>5__4.Length >= 2) { ((TMP_Text)<>4__this.stanzaText).text = <parts>5__4[0].Replace("\"", ""); ((TMP_Text)<>4__this.referenceText).text = "Hávamál - " + <parts>5__4[1].Replace("\"", ""); } <jsonResult>5__2 = null; <cleanJson>5__3 = null; <parts>5__4 = null; } <>m__Finally1(); <webRequest>5__1 = null; return false; } } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<webRequest>5__1 != null) { ((IDisposable)<webRequest>5__1).Dispose(); } } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <LoadAndPlay>d__83 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public string path; public ValheimReporterController <>4__this; private string <url>5__1; private UnityWebRequest <www>5__2; private AudioClip <clip>5__3; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <LoadAndPlay>d__83(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if (num == -3 || num == 1) { try { } finally { <>m__Finally1(); } } <url>5__1 = null; <www>5__2 = null; <clip>5__3 = null; <>1__state = -2; } private bool MoveNext() { //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Invalid comparison between Unknown and I4 //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) try { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <url>5__1 = "file://" + path; <www>5__2 = UnityWebRequestMultimedia.GetAudioClip(<url>5__1, (AudioType)14); <>1__state = -3; <>2__current = <www>5__2.SendWebRequest(); <>1__state = 1; return true; case 1: <>1__state = -3; if ((int)<www>5__2.result == 1) { <clip>5__3 = DownloadHandlerAudioClip.GetContent(<www>5__2); if ((Object)(object)Player.m_localPlayer != (Object)null) { AudioSource.PlayClipAtPoint(<clip>5__3, ((Component)Player.m_localPlayer).transform.position, 1f); Utils.LogSystem("ValheimReporterController", "LoadAndPlay", $"Audio played at: {((Component)Player.m_localPlayer).transform.position}", "log", 4); } <clip>5__3 = null; } else { Utils.LogSystem("Audio", "Error", "Cannot load audio: " + <www>5__2.error, "error", 1); } <>m__Finally1(); <www>5__2 = null; return false; } } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<www>5__2 != null) { ((IDisposable)<www>5__2).Dispose(); } } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <TransitionSequence>d__66 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public Canvas nextCanvas; public CanvasGroup nextGroup; public string mode; public ValheimReporterController <>4__this; private string <>s__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <TransitionSequence>d__66(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>s__1 = null; <>1__state = -2; } private bool MoveNext() { string text; switch (<>1__state) { default: return false; case 0: <>1__state = -1; if ((Object)(object)<>4__this.currentActiveSubModal != (Object)null && ((Component)<>4__this.currentActiveSubModal).gameObject.activeSelf) { <>2__current = ((MonoBehaviour)<>4__this).StartCoroutine(<>4__this.Fade(<>4__this.currentActiveSubModalGroup, 1f, 0f)); <>1__state = 1; return true; } goto IL_00b8; case 1: <>1__state = -1; ((Component)<>4__this.currentActiveSubModal).gameObject.SetActive(false); goto IL_00b8; case 2: { <>1__state = -1; <>4__this.currentActiveSubModal = nextCanvas; <>4__this.currentActiveSubModalGroup = nextGroup; return false; } IL_00b8: text = mode; <>s__1 = text; switch (<>s__1) { case "reporter": <>4__this.isReporterOpen = true; <>4__this.HandleDropdown(<>4__this.reportTypeDropdown, "type"); <>4__this.HandleDropdown(<>4__this.reportSubTypeDropdown, "subtype"); break; case "help": <>4__this.isReporterOpen = false; <>4__this.stanzaText = <>4__this.helpStanzaText; <>4__this.referenceText = <>4__this.helpStanzaReference; break; case "about": <>4__this.isReporterOpen = false; <>4__this.stanzaText = <>4__this.aboutStanzaText; <>4__this.referenceText = <>4__this.aboutStanzaReference; break; } <>s__1 = null; ((Component)nextCanvas).gameObject.SetActive(true); if (<>4__this.finishedReport) { <>4__this.ResetReporterModal(); } if (mode != "reporter") { <>4__this.RequestNewStanza(); } <>2__current = ((MonoBehaviour)<>4__this).StartCoroutine(<>4__this.Fade(nextGroup, 0f, 1f)); <>1__state = 2; return true; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [Header("Status")] private bool isReporterOpen = false; private bool isMainReporterOpen = false; [Header("Main Settings")] private float fadeDuration = ValheimReporter.ConfigFadeDuration.Value; private Canvas mainCanvas; private CanvasGroup mainCanvasGroup; [Header("Navigation Buttons")] private Button openReportsModalButton; private Button helpButton; private Button aboutButton; [Header("Reports Modal")] private Canvas reportsModalCanvas; private CanvasGroup reportsModalCanvasGroup; private TextMeshProUGUI modalSectionTitle; private TextMeshProUGUI modalSectionType; private TextMeshProUGUI modalSectionSubType; [Header("Reports Body Content")] private Canvas reportsModalBodyCanvas; private Button generateScreenshotsButton; private Button submitReportButton; private RawImage screenshotImage1; private RawImage screenshotImage2; private TMP_Dropdown reportTypeDropdown; private TMP_Dropdown reportSubTypeDropdown; private TMP_InputField reportAboutInput; private TMP_InputField reportContentInput; [Header("Help Modal")] private Canvas helpModalCanvas; private CanvasGroup helpModalCanvasGroup; private TextMeshProUGUI helpStanzaText; private TextMeshProUGUI helpStanzaReference; [Header("About Modal")] private Canvas aboutModalCanvas; private CanvasGroup aboutModalCanvasGroup; private TextMeshProUGUI aboutStanzaText; private TextMeshProUGUI aboutStanzaReference; private Button checkMyGithubButton; private Button checkModGithubButton; [Header("Footer Info")] private TextMeshProUGUI footerDateLabel; private TextMeshProUGUI footerTimeLabel; private TextMeshProUGUI footerCoorLabel; [Header("Transition Tracking")] private Canvas currentActiveSubModal = null; private CanvasGroup currentActiveSubModalGroup = null; [Header("Warning Modal")] private Canvas warningModalCanvas; private CanvasGroup warningModalCanvasGroup; private TextMeshProUGUI warningTextReason; private Button warningAcceptButton; private TextMeshProUGUI stanzaText; private TextMeshProUGUI referenceText; private Texture2D defaultTexture; private Category currentCategory; private Subcategory currentSubcategory; private bool aboutIsRequired = false; private bool aboutIsRequiredAnimationFlag = false; private bool contentIsRequiredAnimationFlag = false; private bool pulsatingIsRequired = false; private int stoppedPulsating = 0; private bool contentIsRequired = false; public bool finishedReport = false; public bool screenshotTaken = false; private string apiUrl = "https://odin-api.orlog.workers.dev/havamal/english/random"; private void Awake() { mainCanvasGroup = ((Component)this).GetComponent<CanvasGroup>(); } private void Update() { if (ValheimReporter.ConfigRequirementsRemark.Value) { if (aboutIsRequired) { RequiredAnimation(reportAboutInput, ref aboutIsRequiredAnimationFlag); } if (contentIsRequired) { RequiredAnimation(reportContentInput, ref contentIsRequiredAnimationFlag); } if (stoppedPulsating < 2) { RequiredImageAnimation(screenshotImage1, pulsatingIsRequired); RequiredImageAnimation(screenshotImage2, pulsatingIsRequired); } } if (ValheimReporter.ConfigConfirmationSound.Value && ValheimReporter.playSoundFlag) { PlayConfirmSound(); ValheimReporter.playSoundFlag = false; if (ValheimReporter.ConfigCloseOnSend.Value) { ToggleMainManager(); } } } public void StartReporter() { Utils.LogSystem("ValheimReporterController", "StartReporter", "Initializing Valheim Reporter...", "log", 4); InitializeReferences(); BindUIEvents(); SetupInitialState(); ((Component)mainCanvas).gameObject.SetActive(false); Utils.LogSystem("ValheimReporterController", "StartReporter", "Valheim Reporter initialized.", "success", 3); } private void InitializeReferences() { Utils.LogSystem("ValheimReporterController", "InitializeReferences", "Initializing Valheim Reporter references...", "log", 4); mainCanvas = ((Component)this).GetComponent<Canvas>(); Utils.LogSystem("ValheimReporterController", "InitializeReferences", "Initializing Navigation references...", "log", 4); openReportsModalButton = GameObject.Find("ReporterFrameOpenReportsModalButton").GetComponent<Button>(); helpButton = GameObject.Find("ReporterFrameHelpButton").GetComponent<Button>(); aboutButton = GameObject.Find("ReporterFrameAboutButton").GetComponent<Button>(); Utils.LogSystem("ValheimReporterController", "InitializeReferences", "Initializing Reports Modal & Header references...", "log", 4); reportsModalCanvas = GameObject.Find("ReporterModalCanvas").GetComponent<Canvas>(); reportsModalCanvasGroup = ((Component)reportsModalCanvas).GetComponent<CanvasGroup>(); modalSectionTitle = GameObject.Find("ReporterModalSectionTitle").GetComponent<TextMeshProUGUI>(); modalSectionType = GameObject.Find("ReporterModalSectionType").GetComponent<TextMeshProUGUI>(); modalSectionSubType = GameObject.Find("ReporterModalSectionSubType").GetComponent<TextMeshProUGUI>(); Utils.LogSystem("ValheimReporterController", "InitializeReferences", "Initializing Reports Body references...", "log", 4); Texture2D val = LoadTextureFromFile(Path.Combine(ValheimReporter.ImagesPath, "NoPicture.png")); defaultTexture = val; reportsModalBodyCanvas = GameObject.Find("ReporterModalBody").GetComponent<Canvas>(); generateScreenshotsButton = GameObject.Find("GenerateScreenshotsButton").GetComponent<Button>(); submitReportButton = GameObject.Find("SubmitReportButton").GetComponent<Button>(); screenshotImage1 = GameObject.Find("ScreenshotImage1").GetComponent<RawImage>(); screenshotImage2 = GameObject.Find("ScreenshotImage2").GetComponent<RawImage>(); reportTypeDropdown = GameObject.Find("ReportInfoTypeDropdown").GetComponent<TMP_Dropdown>(); reportSubTypeDropdown = GameObject.Find("ReportInfoSubTypeDropdown").GetComponent<TMP_Dropdown>(); reportAboutInput = GameObject.Find("ReportInfoAboutInput").GetComponent<TMP_InputField>(); reportContentInput = GameObject.Find("ReportInfoContentInput").GetComponent<TMP_InputField>(); ResetReporterModal(); Utils.LogSystem("ValheimReporterController", "InitializeReferences", "Initializing Help Modal references...", "log", 4); helpModalCanvas = GameObject.Find("HelpModalCanvas").GetComponent<Canvas>(); helpModalCanvasGroup = ((Component)helpModalCanvas).GetComponent<CanvasGroup>(); helpStanzaText = GameObject.Find("HelpStanzaText").GetComponent<TextMeshProUGUI>(); helpStanzaReference = GameObject.Find("HelpStanzaReference").GetComponent<TextMeshProUGUI>(); Utils.LogSystem("ValheimReporterController", "InitializeReferences", "Initializing About Modal references...", "log", 4); aboutModalCanvas = GameObject.Find("AboutModalCanvas").GetComponent<Canvas>(); aboutModalCanvasGroup = ((Component)aboutModalCanvas).GetComponent<CanvasGroup>(); aboutStanzaText = GameObject.Find("AboutStanzaText").GetComponent<TextMeshProUGUI>(); aboutStanzaReference = GameObject.Find("AboutStanzaReference").GetComponent<TextMeshProUGUI>(); checkMyGithubButton = GameObject.Find("CheckMyGithubButton").GetComponent<Button>(); checkModGithubButton = GameObject.Find("CheckModGithubButton").GetComponent<Button>(); Utils.LogSystem("ValheimReporterController", "InitializeReferences", "Initializing Footer references...", "log", 4); footerDateLabel = GameObject.Find("ReporterModalFooterDateLabel").GetComponent<TextMeshProUGUI>(); footerTimeLabel = GameObject.Find("ReporterModalFooterTimeLabel").GetComponent<TextMeshProUGUI>(); footerCoorLabel = GameObject.Find("ReporterModalFooterCoorLabel").GetComponent<TextMeshProUGUI>(); Utils.LogSystem("ValheimReporterController", "InitializeReferences", "Initializing Warning Modal references...", "log", 4); warningModalCanvas = GameObject.Find("WarningModalCanvas").GetComponent<Canvas>(); warningModalCanvasGroup = ((Component)warningModalCanvas).GetComponent<CanvasGroup>(); warningTextReason = GameObject.Find("WarningTextReason").GetComponent<TextMeshProUGUI>(); warningAcceptButton = GameObject.Find("WarningAcceptButton").GetComponent<Button>(); Utils.LogSystem("ValheimReporterController", "InitializeReferences", "Valheim Reporter references initialized.", "success", 4); } private void BindUIEvents() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Expected O, but got Unknown //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Expected O, but got Unknown //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Expected O, but got Unknown //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Expected O, but got Unknown //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Expected O, but got Unknown //IL_018e: Unknown result type (might be due to invalid IL or missing references) //IL_0193: Unknown result type (might be due to invalid IL or missing references) //IL_0199: Expected O, but got Unknown Utils.LogSystem("ValheimReporterController", "BindUIEvents", "Binding Valheim Reporter UI events...", "log", 4); ((UnityEvent)openReportsModalButton.onClick).AddListener((UnityAction)delegate { SwitchSubModal(reportsModalCanvas, reportsModalCanvasGroup, "reporter"); }); ((UnityEvent)helpButton.onClick).AddListener((UnityAction)delegate { SwitchSubModal(helpModalCanvas, helpModalCanvasGroup, "help"); }); ((UnityEvent)aboutButton.onClick).AddListener((UnityAction)delegate { SwitchSubModal(aboutModalCanvas, aboutModalCanvasGroup, "about"); }); ((UnityEvent<string>)(object)reportAboutInput.onValueChanged).AddListener((UnityAction<string>)delegate { SetRequiredFlags(); }); ((UnityEvent<string>)(object)reportContentInput.onValueChanged).AddListener((UnityAction<string>)delegate { SetRequiredFlags(); }); ((UnityEvent)generateScreenshotsButton.onClick).AddListener((UnityAction)delegate { TakeScreenshot(); }); ((UnityEvent)submitReportButton.onClick).AddListener((UnityAction)delegate { SubmitReport(); }); ((UnityEvent)warningAcceptButton.onClick).AddListener((UnityAction)delegate { ((MonoBehaviour)this).StartCoroutine(Fade(warningModalCanvasGroup, 1f, 0f, delegate { ((Component)warningModalCanvas).gameObject.SetActive(false); })); }); ((UnityEvent<int>)(object)reportTypeDropdown.onValueChanged).AddListener((UnityAction<int>)delegate { HandleDropdown(reportTypeDropdown, "type"); }); ((UnityEvent<int>)(object)reportSubTypeDropdown.onValueChanged).AddListener((UnityAction<int>)delegate { HandleDropdown(reportSubTypeDropdown, "subtype"); }); ButtonClickedEvent onClick = checkMyGithubButton.onClick; object obj = <>c.<>9__59_10; if (obj == null) { UnityAction val = delegate { Application.OpenURL("https://github.com/n1h1lius"); }; <>c.<>9__59_10 = val; obj = (object)val; } ((UnityEvent)onClick).AddListener((UnityAction)obj); ButtonClickedEvent onClick2 = checkModGithubButton.onClick; object obj2 = <>c.<>9__59_11; if (obj2 == null) { UnityAction val2 = delegate { Application.OpenURL("https://github.com/n1h1lius/Valheim-Reporter"); }; <>c.<>9__59_11 = val2; obj2 = (object)val2; } ((UnityEvent)onClick2).AddListener((UnityAction)obj2); Utils.LogSystem("ValheimReporterController", "BindUIEvents", "Valheim Reporter UI events bound.", "log", 4); } private void SetupInitialState() { Utils.LogSystem("ValheimReporterController", "SetupInitialState", "Setting Valheim Reporter initial state...", "log", 4); PopulateCategories(init: true); mainCanvasGroup.alpha = 0f; reportsModalCanvasGroup.alpha = 0f; helpModalCanvasGroup.alpha = 0f; aboutModalCanvasGroup.alpha = 0f; ((Component)reportsModalCanvas).gameObject.SetActive(false); ((Component)helpModalCanvas).gameObject.SetActive(false); ((Component)aboutModalCanvas).gameObject.SetActive(false); ((Component)warningModalCanvas).gameObject.SetActive(false); Utils.LogSystem("ValheimReporterController", "SetupInitialState", "Valheim Reporter initial state set.", "log", 4); } public void UpdateFooterInfo() { //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) ((TMP_Text)footerDateLabel).text = DateTime.Now.ToString("dd/MM/yyyy"); ((TMP_Text)footerTimeLabel).text = DateTime.Now.ToString("HH:mm:ss"); if ((Object)(object)Player.m_localPlayer != (Object)null) { Vector3 playerPosition = Utils.PlayerUtils.GetPlayerPosition(); ((TMP_Text)footerCoorLabel).text = $"({playerPosition.x:F0}, {playerPosition.y:F0}, {playerPosition.z:F0})"; } } public void ToggleMainManager() { if (((Component)mainCanvas).gameObject.activeSelf && mainCanvasGroup.alpha >= 0.9f) { Utils.LogSystem("ValheimReporterController", "ToggleMainManager", "Closing Valheim Reporter...", "log", 4); isReporterOpen = false; Utils.isReporterOpen = false; isMainReporterOpen = false; Utils.isReporterOpen = false; reportTypeDropdown.value = 0; reportSubTypeDropdown.value = 0; HandleDropdown(reportTypeDropdown, "type"); ((MonoBehaviour)this).StartCoroutine(Fade(mainCanvasGroup, 1f, 0f, delegate { ((Component)mainCanvas).gameObject.SetActive(false); })); Utils.Screen.ToggleCursorMode(preventPlayerMovement: true); } else if (!((Component)mainCanvas).gameObject.activeSelf) { Utils.LogSystem("ValheimReporterController", "ToggleMainManager", "Opening Valheim Reporter...", "log", 4); CloseAllModals(); isMainReporterOpen = true; Utils.isReporterOpen = true; ((Component)mainCanvas).gameObject.SetActive(true); ((MonoBehaviour)this).StartCoroutine(Fade(mainCanvasGroup, 0f, 1f)); Utils.Screen.ToggleCursorMode(preventPlayerMovement: true); } } public void CloseAllModals() { if (((Component)reportsModalCanvas).gameObject.activeSelf && finishedReport) { ((MonoBehaviour)this).StartCoroutine(Fade(reportsModalCanvasGroup, 1f, 0f, delegate { ((Component)reportsModalCanvas).gameObject.SetActive(false); })); } if (((Component)helpModalCanvas).gameObject.activeSelf) { ((MonoBehaviour)this).StartCoroutine(Fade(helpModalCanvasGroup, 1f, 0f, delegate { ((Component)helpModalCanvas).gameObject.SetActive(false); })); } if (((Component)aboutModalCanvas).gameObject.activeSelf) { ((MonoBehaviour)this).StartCoroutine(Fade(aboutModalCanvasGroup, 1f, 0f, delegate { ((Component)aboutModalCanvas).gameObject.SetActive(false); })); } Utils.LogSystem("ValheimReporterController", "CloseAllModals", "All Valheim Reporter modals closed.", "log", 4); } private void ResetReporterModal() { screenshotImage1.texture = (Texture)(object)defaultTexture; screenshotImage2.texture = (Texture)(object)defaultTexture; reportAboutInput.text = ""; reportContentInput.text = ""; finishedReport = false; Utils.LogSystem("ValheimReporterController", "ResetReporterModal", "Valheim Reporter modal reset.", "log", 4); } private void SwitchSubModal(Canvas targetCanvas, CanvasGroup targetGroup, string mode) { ((MonoBehaviour)this).StartCoroutine(TransitionSequence(targetCanvas, targetGroup, mode)); } [IteratorStateMachine(typeof(<TransitionSequence>d__66))] private IEnumerator TransitionSequence(Canvas nextCanvas, CanvasGroup nextGroup, string mode) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <TransitionSequence>d__66(0) { <>4__this = this, nextCanvas = nextCanvas, nextGroup = nextGroup, mode = mode }; } [IteratorStateMachine(typeof(<Fade>d__67))] private IEnumerator Fade(CanvasGroup group, float startAlpha, float endAlpha, Action onComplete = null) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <Fade>d__67(0) { <>4__this = this, group = group, startAlpha = startAlpha, endAlpha = endAlpha, onComplete = onComplete }; } private void HandleDropdown(TMP_Dropdown dropdown, string mode) { if (dropdown.options.Count == 0) { return; } SetRequiredFlags(reset: true); string text = dropdown.options[dropdown.value].text; if (!(mode == "type")) { if (mode == "subtype") { ((TMP_Text)modalSectionSubType).text = text; currentSubcategory = ValheimReporter.ReportCategories.GetSubcategoryByName(text); } } else { ((TMP_Text)modalSectionType).text = text; currentCategory = ValheimReporter.ReportCategories.GetCategoryByName(text); PopulateCategories(); } SetRequiredFlags(); } private void SetRequiredFlags(bool reset = false) { if (!ValheimReporter.ConfigRequirementsRemark.Value) { return; } Outline val = ((Component)reportAboutInput).GetComponent<Outline>(); Outline val2 = ((Component)reportContentInput).GetComponent<Outline>(); if ((Object)(object)val == (Object)null) { val = ((Component)reportAboutInput).gameObject.AddComponent<Outline>(); } if ((Object)(object)val2 == (Object)null) { val2 = ((Component)reportContentInput).gameObject.AddComponent<Outline>(); } if (reset) { ApplyOutlineEffect(status: false, val); ApplyOutlineEffect(status: false, val2); RequiredImageAnimation(screenshotImage1, flag: false); RequiredImageAnimation(screenshotImage2, flag: false); } else if (currentSubcategory != null) { if ((currentSubcategory.Required.Pictures && !screenshotTaken) || (currentSubcategory.Required.Pictures && currentCategory.Required.Pictures && !screenshotTaken)) { pulsatingIsRequired = true; stoppedPulsating = 0; } if (currentSubcategory.Required.Subject || (currentSubcategory.Required.Subject && currentCategory.Required.Subject)) { aboutIsRequired = ApplyOutlineEffect(reportAboutInput.text == "", val); } if (currentSubcategory.Required.Description || (currentSubcategory.Required.Description && currentCategory.Required.Description)) { contentIsRequired = ApplyOutlineEffect(reportContentInput.text == "", val2); } } else { if (currentCategory.Required.Pictures && !screenshotTaken) { pulsatingIsRequired = true; stoppedPulsating = 0; } if (currentCategory.Required.Subject) { aboutIsRequired = ApplyOutlineEffect(reportAboutInput.text == "", val); } if (currentCategory.Required.Description) { contentIsRequired = ApplyOutlineEffect(reportContentInput.text == "", val2); } } } private bool ApplyOutlineEffect(bool status, Outline outline) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) if (ValheimReporter.ConfigRequirementsRemark.Value) { if (status) { ((Shadow)outline).effectColor = Color.red; ((Shadow)outline).effectDistance = new Vector2(5f, -5f); ((Behaviour)outline).enabled = true; } else { ((Behaviour)outline).enabled = false; } return status; } return false; } private void RequiredAnimation(TMP_InputField inputField, ref bool flag) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) Outline component = ((Component)inputField).GetComponent<Outline>(); if (((Shadow)component).effectDistance.x < 10f && !flag) { ((Shadow)component).effectDistance = ((Shadow)component).effectDistance + new Vector2(25f * Time.deltaTime, 25f * Time.deltaTime * -1f); if (((Shadow)component).effectDistance.x >= 10f) { flag = true; } } else if (flag) { ((Shadow)component).effectDistance = ((Shadow)component).effectDistance + new Vector2(25f * Time.deltaTime * -1f, 25f * Time.deltaTime); if (((Shadow)component).effectDistance.x <= 0f) { flag = false; } } } private void RequiredImageAnimation(RawImage image, bool flag) { //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) if (flag) { float num = Mathf.PingPong(Time.time * 2f, 0.5f) + 0.5f; ((Graphic)image).color = new Color(1f, num, num, 1f); } else { ((Graphic)image).color = Color.white; stoppedPulsating++; } } public void RequestNewStanza() { ((MonoBehaviour)this).StartCoroutine(FetchStanza()); } [IteratorStateMachine(typeof(<FetchStanza>d__74))] private IEnumerator FetchStanza() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <FetchStanza>d__74(0) { <>4__this = this }; } public void TakeScreenshot() { ((MonoBehaviour)this).StartCoroutine(CaptureCleanScreenshot()); pulsatingIsRequired = false; } [IteratorStateMachine(typeof(<CaptureCleanScreenshot>d__76))] private IEnumerator CaptureCleanScreenshot() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <CaptureCleanScreenshot>d__76(0) { <>4__this = this }; } public void SubmitReport() { if (ValheimReporter.ConfigWorldName.Value == "WORLD_NAME" || ValheimReporter.ConfigWorldName.Value != ZNet.instance.GetWorldName()) { ShowDefaultWarning(4); return; } Utils.LogSystem("ValheimReporterController", "SubmitReport", "Checking Category + Subcategory requirements...", "log", 4); Category categoryByName = ValheimReporter.ReportCategories.GetCategoryByName(reportTypeDropdown.options[reportTypeDropdown.value].text); Subcategory subcategoryByName = ValheimReporter.ReportCategories.GetSubcategoryByName(reportSubTypeDropdown.options[reportSubTypeDropdown.value].text); if (categoryByName.Webhook.StartsWith(Utils.ENCRIPTION_HEADER)) { if (ValheimReporter.ConfigDiscordID.Value == "Discord ID") { ShowDefaultWarning(5); return; } if (string.IsNullOrEmpty(ValheimReporter.ConfigDiscordID.Value) || !char.IsDigit(ValheimReporter.ConfigDiscordID.Value[0])) { ShowDefaultWarning(5); return; } } if (subcategoryByName != null) { Utils.LogSystem("ValheimReporterController", "SubmitReport", "Subcategory exists. Checking Subcategory requirements...", "log", 4); if (!screenshotTaken && subcategoryByName.Required.Pictures) { ShowDefaultWarning(1); return; } if (subcategoryByName.Required.Subject && reportAboutInput.text == "") { ShowDefaultWarning(2); return; } if (subcategoryByName.Required.Description && reportContentInput.text == "") { ShowDefaultWarning(3); return; } if (!screenshotTaken && categoryByName.Required.Pictures && subcategoryByName.Required.Pictures) { ShowDefaultWarning(1); return; } if (categoryByName.Required.Subject && subcategoryByName.Required.Subject && reportAboutInput.text == "") { ShowDefaultWarning(2); return; } if (categoryByName.Required.Description && subcategoryByName.Required.Description && reportContentInput.text == "") { ShowDefaultWarning(3); return; } Utils.LogSystem("ValheimReporterController", "SubmitReport", "Subcategory requirements met.", "success", 4); } else { Utils.LogSystem("ValheimReporterController", "SubmitReport", "Subcategory does not exist. Checking Category requirements...", "log", 4); if (!screenshotTaken && categoryByName.Required.Pictures) { ShowDefaultWarning(1); return; } if (categoryByName.Required.Subject && reportAboutInput.text == "") { ShowDefaultWarning(2); return; } if (categoryByName.Required.Description && reportContentInput.text == "") { ShowDefaultWarning(3); return; } Utils.LogSystem("ValheimReporterController", "SubmitReport", "Category requirements met.", "success", 4); } Utils.LogSystem("ValheimReporterController", "SubmitReport", "Generating Report...", "log", 4); Report report = new Report(); report.PlayerName = Player.m_localPlayer.GetPlayerName(); report.SteamID = Player.m_localPlayer.GetPlayerID().ToString(); report.DiscordID = ValheimReporter.ConfigDiscordID.Value; report.Coordinates = ((TMP_Text)footerCoorLabel).text; Utils.LogSystem("ValheimReporterController", "SubmitReport", "Basic Data Fetched -> Name: " + report.PlayerName + ", SteamID: " + report.SteamID + ", DiscordID: " + report.DiscordID + ", Coordinates: " + report.Coordinates, "success", 4); Utils.LogSystem("ValheimReporterController", "SubmitReport", "Trying to Fetch Raw Images", "log", 4); if (screenshotTaken) { Utils.LogSystem("ValheimReporterController", "SubmitReport", "Raw Image 1 -> Fetching", "success", 4); Texture texture = screenshotImage1.texture; report.Image1 = (Texture2D)(object)((texture is Texture2D) ? texture : null); Utils.LogSystem("ValheimReporterController", "SubmitReport", "Raw Image 2 -> Fetching", "success", 4); Texture texture2 = screenshotImage2.texture; report.Image2 = (Texture2D)(object)((texture2 is Texture2D) ? texture2 : null); } else { report.Image1 = null; report.Image2 = null; } report.Category = categoryByName.Name; if (subcategoryByName != null) { report.SubCategory = subcategoryByName.Name; } else { report.SubCategory = "None"; } report.Subject = reportAboutInput.text; report.Description = reportContentInput.text; List<string> list = new List<string> { categoryByName.Webhook }; if (subcategoryByName != null && ((subcategoryByName.Webhook != "" && subcategoryByName.Webhook != null && subcategoryByName.Webhook != " " && subcategoryByName.Webhook != "None" && subcategoryByName.Webhook != "none" && subcategoryByName.Webhook != "NONE" && subcategoryByName.Webhook != "Null" && subcategoryByName.Webhook != "null" && subcategoryByName.Webhook != "NULL" && !subcategoryByName.Webhook.Equals(categoryByName.Webhook)) || subcategoryByName.Webhook.StartsWith("[NH]-3247"))) { list.Add(subcategoryByName.Webhook); } report.Webhook = list; ((MonoBehaviour)this).StartCoroutine(report.SendReportCoroutine()); finishedReport = true; screenshotTaken = false; CloseAllModals(); } public void PopulateCategories(bool init = false) { //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Expected O, but got Unknown //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Expected O, but got Unknown if (init) { reportTypeDropdown.ClearOptions(); reportSubTypeDropdown.ClearOptions(); bool flag = false; { foreach (Category item in ValheimReporter.ReportCategories.GetList()) { reportTypeDropdown.options.Add(new OptionData(item.Name)); if (flag) { continue; } foreach (Subcategory value in item.Subcategories.Values) { reportSubTypeDropdown.options.Add(new OptionData(value.Name)); } flag = true; } return; } } Utils.LogSystem("ValheimReporterController", "PopulateCategories", "Clear Subtype Dropdown", "log", 4); reportSubTypeDropdown.ClearOptions(); Utils.LogSystem("ValheimReporterController", "PopulateCategories", "Fetching Category", "log", 4); string text = reportTypeDropdown.options[reportTypeDropdown.value].text; Category categoryByName = ValheimReporter.ReportCategories.GetCategoryByName(text); if (categoryByName.HasSubcategories) { Utils.LogSystem("ValheimReporterController", "PopulateCategories", "Filling Subtype Dropdown", "log", 4); List<string> list = new List<string>(); foreach (Subcategory value2 in categoryByName.Subcategories.Values) { list.Add(value2.Name); } reportSubTypeDropdown.AddOptions(list); } else { reportSubTypeDropdown.AddOptions(new List<string> { "------" }); Utils.LogSystem("ValheimReporterController", "PopulateCategories", "No Subcategories found in Category [" + text + "]", "log", 4); } HandleDropdown(reportSubTypeDropdown, "subtype"); } public void ShowWarning(string reason) { ((Component)warningModalCanvas).gameObject.SetActive(true); ((TMP_Text)warningTextReason).text = reason; ((MonoBehaviour)this).StartCoroutine(Fade(warningModalCanvasGroup, 0f, 1f)); } public void ShowDefaultWarning(int mode) { switch (mode) { case 1: ShowWarning("You haven't taken a screenshot yet! Please take a screenshot and try again."); break; case 2: ShowWarning("A subject is required for this category. Please enter a subject and try again."); break; case 3: ShowWarning("A description is required for this category. Please enter a description and try again."); break; case 4: ShowWarning("Your world name [ " + ValheimReporter.ConfigWorldName.Value + " ] does not match Server's World Name [ " + ZNet.instance.GetWorldName() + " ]. Make sure you have entered the correct world name / Make sure you are in the correct server and try again."); break; case 5: ShowWarning("Your Discord ID is invalid. Please enter a valid Discord ID and try again."); break; } } public static Texture2D LoadTextureFromFile(string filePath) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown if (File.Exists(filePath)) { byte[] array = File.ReadAllBytes(filePath); Texture2D val = new Texture2D(2, 2); if (ImageConversion.LoadImage(val, array)) { return val; } } Utils.LogSystem("Utils", "LoadTexture", "Failed to load texture at: " + filePath, "error", 1); return null; } public void PlayConfirmSound() { string text = Path.Combine(ValheimReporter.AssetsPath, "confirm.ogg"); if (!File.Exists(text)) { Utils.LogSystem("Audio", "Load", "Audio is not present in: " + text, "error", 1); } else { ((MonoBehaviour)this).StartCoroutine(LoadAndPlay(text)); } } [IteratorStateMachine(typeof(<LoadAndPlay>d__83))] private IEnumerator LoadAndPlay(string path) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <LoadAndPlay>d__83(0) { <>4__this = this, path = path }; } public TMP_InputField getReportAboutInput() { return reportAboutInput; } public string getReportAboutInputText() { return reportAboutInput.text; } public TMP_InputField getReportContentInput() { return reportContentInput; } public string getReportContentInputText() { return reportContentInput.text; } public string getDateText() { return ((TMP_Text)footerDateLabel).text; } public string getTimeText() { return ((TMP_Text)footerTimeLabel).text; } public string getCoorText() { return ((TMP_Text)footerCoorLabel).text; } public TextMeshProUGUI getDateLabel() { return footerDateLabel; } public TextMeshProUGUI getTimeLabel() { return footerTimeLabel; } public TextMeshProUGUI getCoorLabel() { return footerCoorLabel; } public Canvas getMainCanvas() { return mainCanvas; } public CanvasGroup getMainCanvasGroup() { return mainCanvasGroup; } public bool getIsMainReporterOpen() { return isMainReporterOpen; } public bool getIsReporterOpen() { return isReporterOpen; } public float getFadeDuration() { return fadeDuration; } public RawImage getScreenshot1() { return screenshotImage1; } public RawImage getScreenshot2() { return screenshotImage2; } public Button getOpenReportsModalButton() { return openReportsModalButton; } public Button getHelpButton() { return helpButton; } public Button getAboutButton() { return aboutButton; } public Button getGenerateScreenshotsButton() { return generateScreenshotsButton; } public Button getSubmitReportButton() { return submitReportButton; } public TMP_Dropdown getReportTypeDropdown() { return reportTypeDropdown; } public TMP_Dropdown getReportSubTypeDropdown() { return reportSubTypeDropdown; } public void SetReportAboutInputText(string text) { reportAboutInput.text = text; } public void SetReportContentInputText(string text) { reportContentInput.text = text; } public void setDate(string date) { ((TMP_Text)footerDateLabel).text = date; } public void setTime(string time) { ((TMP_Text)footerTimeLabel).text = time; } public void setCoor(string coor) { ((TMP_Text)footerCoorLabel).text = coor; } public void setFadeDuration(float duration) { fadeDuration = duration; } public void setScreenshot1(Texture image) { screenshotImage1.texture = image; } public void setScreenshot2(Texture image) { screenshotImage2.texture = image; } } }
Newtonsoft.Json.dll
Decompiled 2 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.ComponentModel; using System.Data; using System.Data.SqlTypes; using System.Diagnostics; using System.Dynamic; using System.Globalization; using System.IO; using System.Linq; using System.Linq.Expressions; using System.Numerics; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters; using System.Runtime.Versioning; using System.Security; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Xml; using System.Xml.Linq; using Microsoft.CodeAnalysis; using Newtonsoft.Json.Bson; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq.JsonPath; using Newtonsoft.Json.Schema; using Newtonsoft.Json.Serialization; using Newtonsoft.Json.Utilities; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AllowPartiallyTrustedCallers] [assembly: InternalsVisibleTo("Newtonsoft.Json.Schema, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f561df277c6c0b497d629032b410cdcf286e537c054724f7ffa0164345f62b3e642029d7a80cc351918955328c4adc8a048823ef90b0cf38ea7db0d729caf2b633c3babe08b0310198c1081995c19029bc675193744eab9d7345b8a67258ec17d112cebdbbb2a281487dceeafb9d83aa930f32103fbe1d2911425bc5744002c7")] [assembly: InternalsVisibleTo("Newtonsoft.Json.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f561df277c6c0b497d629032b410cdcf286e537c054724f7ffa0164345f62b3e642029d7a80cc351918955328c4adc8a048823ef90b0cf38ea7db0d729caf2b633c3babe08b0310198c1081995c19029bc675193744eab9d7345b8a67258ec17d112cebdbbb2a281487dceeafb9d83aa930f32103fbe1d2911425bc5744002c7")] [assembly: InternalsVisibleTo("Newtonsoft.Json.Dynamic, PublicKey=0024000004800000940000000602000000240000525341310004000001000100cbd8d53b9d7de30f1f1278f636ec462cf9c254991291e66ebb157a885638a517887633b898ccbcf0d5c5ff7be85a6abe9e765d0ac7cd33c68dac67e7e64530e8222101109f154ab14a941c490ac155cd1d4fcba0fabb49016b4ef28593b015cab5937da31172f03f67d09edda404b88a60023f062ae71d0b2e4438b74cc11dc9")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("9ca358aa-317b-4925-8ada-4a29e943a363")] [assembly: CLSCompliant(true)] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = "")] [assembly: AssemblyCompany("Newtonsoft")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyCopyright("Copyright © James Newton-King 2008")] [assembly: AssemblyDescription("Json.NET is a popular high-performance JSON framework for .NET")] [assembly: AssemblyFileVersion("12.0.1.22727")] [assembly: AssemblyInformationalVersion("12.0.1+509643a8952ce731e0207710c429ad6e67dc43db")] [assembly: AssemblyProduct("Json.NET")] [assembly: AssemblyTitle("Json.NET .NET Standard 2.0")] [assembly: NeutralResourcesLanguage("en-US")] [assembly: AssemblyVersion("12.0.0.0")] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class IsReadOnlyAttribute : Attribute { } } namespace Newtonsoft.Json { public enum ConstructorHandling { Default, AllowNonPublicDefaultConstructor } public enum DateFormatHandling { IsoDateFormat, MicrosoftDateFormat } public enum DateParseHandling { None, DateTime, DateTimeOffset } public enum DateTimeZoneHandling { Local, Utc, Unspecified, RoundtripKind } public class DefaultJsonNameTable : JsonNameTable { private class Entry { internal readonly string Value; internal readonly int HashCode; internal Entry Next; internal Entry(string value, int hashCode, Entry next) { Value = value; HashCode = hashCode; Next = next; } } private static readonly int HashCodeRandomizer; private int _count; private Entry[] _entries; private int _mask = 31; static DefaultJsonNameTable() { HashCodeRandomizer = Environment.TickCount; } public DefaultJsonNameTable() { _entries = new Entry[_mask + 1]; } public override string Get(char[] key, int start, int length) { if (length == 0) { return string.Empty; } int num = length + HashCodeRandomizer; num += (num << 7) ^ key[start]; int num2 = start + length; for (int i = start + 1; i < num2; i++) { num += (num << 7) ^ key[i]; } num -= num >> 17; num -= num >> 11; num -= num >> 5; int num3 = num & _mask; for (Entry entry = _entries[num3]; entry != null; entry = entry.Next) { if (entry.HashCode == num && TextEquals(entry.Value, key, start, length)) { return entry.Value; } } return null; } public string Add(string key) { if (key == null) { throw new ArgumentNullException("key"); } int length = key.Length; if (length == 0) { return string.Empty; } int num = length + HashCodeRandomizer; for (int i = 0; i < key.Length; i++) { num += (num << 7) ^ key[i]; } num -= num >> 17; num -= num >> 11; num -= num >> 5; for (Entry entry = _entries[num & _mask]; entry != null; entry = entry.Next) { if (entry.HashCode == num && entry.Value.Equals(key)) { return entry.Value; } } return AddEntry(key, num); } private string AddEntry(string str, int hashCode) { int num = hashCode & _mask; Entry entry = new Entry(str, hashCode, _entries[num]); _entries[num] = entry; if (_count++ == _mask) { Grow(); } return entry.Value; } private void Grow() { Entry[] entries = _entries; int num = _mask * 2 + 1; Entry[] array = new Entry[num + 1]; for (int i = 0; i < entries.Length; i++) { Entry entry = entries[i]; while (entry != null) { int num2 = entry.HashCode & num; Entry next = entry.Next; entry.Next = array[num2]; array[num2] = entry; entry = next; } } _entries = array; _mask = num; } private static bool TextEquals(string str1, char[] str2, int str2Start, int str2Length) { if (str1.Length != str2Length) { return false; } for (int i = 0; i < str1.Length; i++) { if (str1[i] != str2[str2Start + i]) { return false; } } return true; } } [Flags] public enum DefaultValueHandling { Include = 0, Ignore = 1, Populate = 2, IgnoreAndPopulate = 3 } public enum FloatFormatHandling { String, Symbol, DefaultValue } public enum FloatParseHandling { Double, Decimal } public enum Formatting { None, Indented } public interface IArrayPool<T> { T[] Rent(int minimumLength); void Return(T[] array); } public interface IJsonLineInfo { int LineNumber { get; } int LinePosition { get; } bool HasLineInfo(); } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] public sealed class JsonArrayAttribute : JsonContainerAttribute { private bool _allowNullItems; public bool AllowNullItems { get { return _allowNullItems; } set { _allowNullItems = value; } } public JsonArrayAttribute() { } public JsonArrayAttribute(bool allowNullItems) { _allowNullItems = allowNullItems; } public JsonArrayAttribute(string id) : base(id) { } } [AttributeUsage(AttributeTargets.Constructor, AllowMultiple = false)] public sealed class JsonConstructorAttribute : Attribute { } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] public abstract class JsonContainerAttribute : Attribute { internal bool? _isReference; internal bool? _itemIsReference; internal ReferenceLoopHandling? _itemReferenceLoopHandling; internal TypeNameHandling? _itemTypeNameHandling; private Type _namingStrategyType; private object[] _namingStrategyParameters; public string Id { get; set; } public string Title { get; set; } public string Description { get; set; } public Type ItemConverterType { get; set; } public object[] ItemConverterParameters { get; set; } public Type NamingStrategyType { get { return _namingStrategyType; } set { _namingStrategyType = value; NamingStrategyInstance = null; } } public object[] NamingStrategyParameters { get { return _namingStrategyParameters; } set { _namingStrategyParameters = value; NamingStrategyInstance = null; } } internal NamingStrategy NamingStrategyInstance { get; set; } public bool IsReference { get { return _isReference ?? false; } set { _isReference = value; } } public bool ItemIsReference { get { return _itemIsReference ?? false; } set { _itemIsReference = value; } } public ReferenceLoopHandling ItemReferenceLoopHandling { get { return _itemReferenceLoopHandling ?? ReferenceLoopHandling.Error; } set { _itemReferenceLoopHandling = value; } } public TypeNameHandling ItemTypeNameHandling { get { return _itemTypeNameHandling ?? TypeNameHandling.None; } set { _itemTypeNameHandling = value; } } protected JsonContainerAttribute() { } protected JsonContainerAttribute(string id) { Id = id; } } public static class JsonConvert { public static readonly string True = "true"; public static readonly string False = "false"; public static readonly string Null = "null"; public static readonly string Undefined = "undefined"; public static readonly string PositiveInfinity = "Infinity"; public static readonly string NegativeInfinity = "-Infinity"; public static readonly string NaN = "NaN"; public static Func<JsonSerializerSettings> DefaultSettings { get; set; } public static string ToString(DateTime value) { return ToString(value, DateFormatHandling.IsoDateFormat, DateTimeZoneHandling.RoundtripKind); } public static string ToString(DateTime value, DateFormatHandling format, DateTimeZoneHandling timeZoneHandling) { DateTime value2 = DateTimeUtils.EnsureDateTime(value, timeZoneHandling); using StringWriter stringWriter = StringUtils.CreateStringWriter(64); stringWriter.Write('"'); DateTimeUtils.WriteDateTimeString(stringWriter, value2, format, null, CultureInfo.InvariantCulture); stringWriter.Write('"'); return stringWriter.ToString(); } public static string ToString(DateTimeOffset value) { return ToString(value, DateFormatHandling.IsoDateFormat); } public static string ToString(DateTimeOffset value, DateFormatHandling format) { using StringWriter stringWriter = StringUtils.CreateStringWriter(64); stringWriter.Write('"'); DateTimeUtils.WriteDateTimeOffsetString(stringWriter, value, format, null, CultureInfo.InvariantCulture); stringWriter.Write('"'); return stringWriter.ToString(); } public static string ToString(bool value) { if (!value) { return False; } return True; } public static string ToString(char value) { return ToString(char.ToString(value)); } public static string ToString(Enum value) { return value.ToString("D"); } public static string ToString(int value) { return value.ToString(null, CultureInfo.InvariantCulture); } public static string ToString(short value) { return value.ToString(null, CultureInfo.InvariantCulture); } [CLSCompliant(false)] public static string ToString(ushort value) { return value.ToString(null, CultureInfo.InvariantCulture); } [CLSCompliant(false)] public static string ToString(uint value) { return value.ToString(null, CultureInfo.InvariantCulture); } public static string ToString(long value) { return value.ToString(null, CultureInfo.InvariantCulture); } private static string ToStringInternal(BigInteger value) { return value.ToString(null, CultureInfo.InvariantCulture); } [CLSCompliant(false)] public static string ToString(ulong value) { return value.ToString(null, CultureInfo.InvariantCulture); } public static string ToString(float value) { return EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)); } internal static string ToString(float value, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable) { return EnsureFloatFormat(value, EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)), floatFormatHandling, quoteChar, nullable); } private static string EnsureFloatFormat(double value, string text, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable) { if (floatFormatHandling == FloatFormatHandling.Symbol || (!double.IsInfinity(value) && !double.IsNaN(value))) { return text; } if (floatFormatHandling == FloatFormatHandling.DefaultValue) { if (nullable) { return Null; } return "0.0"; } return quoteChar + text + quoteChar; } public static string ToString(double value) { return EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)); } internal static string ToString(double value, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable) { return EnsureFloatFormat(value, EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)), floatFormatHandling, quoteChar, nullable); } private static string EnsureDecimalPlace(double value, string text) { if (double.IsNaN(value) || double.IsInfinity(value) || text.IndexOf('.') != -1 || text.IndexOf('E') != -1 || text.IndexOf('e') != -1) { return text; } return text + ".0"; } private static string EnsureDecimalPlace(string text) { if (text.IndexOf('.') != -1) { return text; } return text + ".0"; } public static string ToString(byte value) { return value.ToString(null, CultureInfo.InvariantCulture); } [CLSCompliant(false)] public static string ToString(sbyte value) { return value.ToString(null, CultureInfo.InvariantCulture); } public static string ToString(decimal value) { return EnsureDecimalPlace(value.ToString(null, CultureInfo.InvariantCulture)); } public static string ToString(Guid value) { return ToString(value, '"'); } internal static string ToString(Guid value, char quoteChar) { string text = value.ToString("D", CultureInfo.InvariantCulture); string text2 = quoteChar.ToString(CultureInfo.InvariantCulture); return text2 + text + text2; } public static string ToString(TimeSpan value) { return ToString(value, '"'); } internal static string ToString(TimeSpan value, char quoteChar) { return ToString(value.ToString(), quoteChar); } public static string ToString(Uri value) { if (value == null) { return Null; } return ToString(value, '"'); } internal static string ToString(Uri value, char quoteChar) { return ToString(value.OriginalString, quoteChar); } public static string ToString(string value) { return ToString(value, '"'); } public static string ToString(string value, char delimiter) { return ToString(value, delimiter, StringEscapeHandling.Default); } public static string ToString(string value, char delimiter, StringEscapeHandling stringEscapeHandling) { if (delimiter != '"' && delimiter != '\'') { throw new ArgumentException("Delimiter must be a single or double quote.", "delimiter"); } return JavaScriptUtils.ToEscapedJavaScriptString(value, delimiter, appendDelimiters: true, stringEscapeHandling); } public static string ToString(object value) { if (value == null) { return Null; } return ConvertUtils.GetTypeCode(value.GetType()) switch { PrimitiveTypeCode.String => ToString((string)value), PrimitiveTypeCode.Char => ToString((char)value), PrimitiveTypeCode.Boolean => ToString((bool)value), PrimitiveTypeCode.SByte => ToString((sbyte)value), PrimitiveTypeCode.Int16 => ToString((short)value), PrimitiveTypeCode.UInt16 => ToString((ushort)value), PrimitiveTypeCode.Int32 => ToString((int)value), PrimitiveTypeCode.Byte => ToString((byte)value), PrimitiveTypeCode.UInt32 => ToString((uint)value), PrimitiveTypeCode.Int64 => ToString((long)value), PrimitiveTypeCode.UInt64 => ToString((ulong)value), PrimitiveTypeCode.Single => ToString((float)value), PrimitiveTypeCode.Double => ToString((double)value), PrimitiveTypeCode.DateTime => ToString((DateTime)value), PrimitiveTypeCode.Decimal => ToString((decimal)value), PrimitiveTypeCode.DBNull => Null, PrimitiveTypeCode.DateTimeOffset => ToString((DateTimeOffset)value), PrimitiveTypeCode.Guid => ToString((Guid)value), PrimitiveTypeCode.Uri => ToString((Uri)value), PrimitiveTypeCode.TimeSpan => ToString((TimeSpan)value), PrimitiveTypeCode.BigInteger => ToStringInternal((BigInteger)value), _ => throw new ArgumentException("Unsupported type: {0}. Use the JsonSerializer class to get the object's JSON representation.".FormatWith(CultureInfo.InvariantCulture, value.GetType())), }; } [DebuggerStepThrough] public static string SerializeObject(object value) { return SerializeObject(value, (Type)null, (JsonSerializerSettings)null); } [DebuggerStepThrough] public static string SerializeObject(object value, Formatting formatting) { return SerializeObject(value, formatting, (JsonSerializerSettings)null); } [DebuggerStepThrough] public static string SerializeObject(object value, params JsonConverter[] converters) { JsonSerializerSettings settings = ((converters != null && converters.Length != 0) ? new JsonSerializerSettings { Converters = converters } : null); return SerializeObject(value, null, settings); } [DebuggerStepThrough] public static string SerializeObject(object value, Formatting formatting, params JsonConverter[] converters) { JsonSerializerSettings settings = ((converters != null && converters.Length != 0) ? new JsonSerializerSettings { Converters = converters } : null); return SerializeObject(value, null, formatting, settings); } [DebuggerStepThrough] public static string SerializeObject(object value, JsonSerializerSettings settings) { return SerializeObject(value, null, settings); } [DebuggerStepThrough] public static string SerializeObject(object value, Type type, JsonSerializerSettings settings) { JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); return SerializeObjectInternal(value, type, jsonSerializer); } [DebuggerStepThrough] public static string SerializeObject(object value, Formatting formatting, JsonSerializerSettings settings) { return SerializeObject(value, null, formatting, settings); } [DebuggerStepThrough] public static string SerializeObject(object value, Type type, Formatting formatting, JsonSerializerSettings settings) { JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); jsonSerializer.Formatting = formatting; return SerializeObjectInternal(value, type, jsonSerializer); } private static string SerializeObjectInternal(object value, Type type, JsonSerializer jsonSerializer) { StringWriter stringWriter = new StringWriter(new StringBuilder(256), CultureInfo.InvariantCulture); using (JsonTextWriter jsonTextWriter = new JsonTextWriter(stringWriter)) { jsonTextWriter.Formatting = jsonSerializer.Formatting; jsonSerializer.Serialize(jsonTextWriter, value, type); } return stringWriter.ToString(); } [DebuggerStepThrough] public static object DeserializeObject(string value) { return DeserializeObject(value, (Type)null, (JsonSerializerSettings)null); } [DebuggerStepThrough] public static object DeserializeObject(string value, JsonSerializerSettings settings) { return DeserializeObject(value, null, settings); } [DebuggerStepThrough] public static object DeserializeObject(string value, Type type) { return DeserializeObject(value, type, (JsonSerializerSettings)null); } [DebuggerStepThrough] public static T DeserializeObject<T>(string value) { return JsonConvert.DeserializeObject<T>(value, (JsonSerializerSettings)null); } [DebuggerStepThrough] public static T DeserializeAnonymousType<T>(string value, T anonymousTypeObject) { return DeserializeObject<T>(value); } [DebuggerStepThrough] public static T DeserializeAnonymousType<T>(string value, T anonymousTypeObject, JsonSerializerSettings settings) { return DeserializeObject<T>(value, settings); } [DebuggerStepThrough] public static T DeserializeObject<T>(string value, params JsonConverter[] converters) { return (T)DeserializeObject(value, typeof(T), converters); } [DebuggerStepThrough] public static T DeserializeObject<T>(string value, JsonSerializerSettings settings) { return (T)DeserializeObject(value, typeof(T), settings); } [DebuggerStepThrough] public static object DeserializeObject(string value, Type type, params JsonConverter[] converters) { JsonSerializerSettings settings = ((converters != null && converters.Length != 0) ? new JsonSerializerSettings { Converters = converters } : null); return DeserializeObject(value, type, settings); } public static object DeserializeObject(string value, Type type, JsonSerializerSettings settings) { ValidationUtils.ArgumentNotNull(value, "value"); JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); if (!jsonSerializer.IsCheckAdditionalContentSet()) { jsonSerializer.CheckAdditionalContent = true; } using JsonTextReader reader = new JsonTextReader(new StringReader(value)); return jsonSerializer.Deserialize(reader, type); } [DebuggerStepThrough] public static void PopulateObject(string value, object target) { PopulateObject(value, target, null); } public static void PopulateObject(string value, object target, JsonSerializerSettings settings) { JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); using JsonReader jsonReader = new JsonTextReader(new StringReader(value)); jsonSerializer.Populate(jsonReader, target); if (settings == null || !settings.CheckAdditionalContent) { return; } while (jsonReader.Read()) { if (jsonReader.TokenType != JsonToken.Comment) { throw JsonSerializationException.Create(jsonReader, "Additional text found in JSON string after finishing deserializing object."); } } } public static string SerializeXmlNode(XmlNode node) { return SerializeXmlNode(node, Formatting.None); } public static string SerializeXmlNode(XmlNode node, Formatting formatting) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter(); return SerializeObject(node, formatting, xmlNodeConverter); } public static string SerializeXmlNode(XmlNode node, Formatting formatting, bool omitRootObject) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter { OmitRootObject = omitRootObject }; return SerializeObject(node, formatting, xmlNodeConverter); } public static XmlDocument DeserializeXmlNode(string value) { return DeserializeXmlNode(value, null); } public static XmlDocument DeserializeXmlNode(string value, string deserializeRootElementName) { return DeserializeXmlNode(value, deserializeRootElementName, writeArrayAttribute: false); } public static XmlDocument DeserializeXmlNode(string value, string deserializeRootElementName, bool writeArrayAttribute) { return DeserializeXmlNode(value, deserializeRootElementName, writeArrayAttribute, encodeSpecialCharacters: false); } public static XmlDocument DeserializeXmlNode(string value, string deserializeRootElementName, bool writeArrayAttribute, bool encodeSpecialCharacters) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter(); xmlNodeConverter.DeserializeRootElementName = deserializeRootElementName; xmlNodeConverter.WriteArrayAttribute = writeArrayAttribute; xmlNodeConverter.EncodeSpecialCharacters = encodeSpecialCharacters; return (XmlDocument)DeserializeObject(value, typeof(XmlDocument), xmlNodeConverter); } public static string SerializeXNode(XObject node) { return SerializeXNode(node, Formatting.None); } public static string SerializeXNode(XObject node, Formatting formatting) { return SerializeXNode(node, formatting, omitRootObject: false); } public static string SerializeXNode(XObject node, Formatting formatting, bool omitRootObject) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter { OmitRootObject = omitRootObject }; return SerializeObject(node, formatting, xmlNodeConverter); } public static XDocument DeserializeXNode(string value) { return DeserializeXNode(value, null); } public static XDocument DeserializeXNode(string value, string deserializeRootElementName) { return DeserializeXNode(value, deserializeRootElementName, writeArrayAttribute: false); } public static XDocument DeserializeXNode(string value, string deserializeRootElementName, bool writeArrayAttribute) { return DeserializeXNode(value, deserializeRootElementName, writeArrayAttribute, encodeSpecialCharacters: false); } public static XDocument DeserializeXNode(string value, string deserializeRootElementName, bool writeArrayAttribute, bool encodeSpecialCharacters) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter(); xmlNodeConverter.DeserializeRootElementName = deserializeRootElementName; xmlNodeConverter.WriteArrayAttribute = writeArrayAttribute; xmlNodeConverter.EncodeSpecialCharacters = encodeSpecialCharacters; return (XDocument)DeserializeObject(value, typeof(XDocument), xmlNodeConverter); } } public abstract class JsonConverter { public virtual bool CanRead => true; public virtual bool CanWrite => true; public abstract void WriteJson(JsonWriter writer, object value, JsonSerializer serializer); public abstract object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer); public abstract bool CanConvert(Type objectType); } public abstract class JsonConverter<T> : JsonConverter { public sealed override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { if (!((value != null) ? (value is T) : ReflectionUtils.IsNullable(typeof(T)))) { throw new JsonSerializationException("Converter cannot write specified value to JSON. {0} is required.".FormatWith(CultureInfo.InvariantCulture, typeof(T))); } WriteJson(writer, (T)value, serializer); } public abstract void WriteJson(JsonWriter writer, T value, JsonSerializer serializer); public sealed override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { bool flag = existingValue == null; if (!flag && !(existingValue is T)) { throw new JsonSerializationException("Converter cannot read JSON with the specified existing value. {0} is required.".FormatWith(CultureInfo.InvariantCulture, typeof(T))); } return ReadJson(reader, objectType, flag ? default(T) : ((T)existingValue), !flag, serializer); } public abstract T ReadJson(JsonReader reader, Type objectType, T existingValue, bool hasExistingValue, JsonSerializer serializer); public sealed override bool CanConvert(Type objectType) { return typeof(T).IsAssignableFrom(objectType); } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Interface | AttributeTargets.Parameter, AllowMultiple = false)] public sealed class JsonConverterAttribute : Attribute { private readonly Type _converterType; public Type ConverterType => _converterType; public object[] ConverterParameters { get; } public JsonConverterAttribute(Type converterType) { if (converterType == null) { throw new ArgumentNullException("converterType"); } _converterType = converterType; } public JsonConverterAttribute(Type converterType, params object[] converterParameters) : this(converterType) { ConverterParameters = converterParameters; } } public class JsonConverterCollection : Collection<JsonConverter> { } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] public sealed class JsonDictionaryAttribute : JsonContainerAttribute { public JsonDictionaryAttribute() { } public JsonDictionaryAttribute(string id) : base(id) { } } [Serializable] public class JsonException : Exception { public JsonException() { } public JsonException(string message) : base(message) { } public JsonException(string message, Exception innerException) : base(message, innerException) { } public JsonException(SerializationInfo info, StreamingContext context) : base(info, context) { } internal static JsonException Create(IJsonLineInfo lineInfo, string path, string message) { message = JsonPosition.FormatMessage(lineInfo, path, message); return new JsonException(message); } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] public class JsonExtensionDataAttribute : Attribute { public bool WriteData { get; set; } public bool ReadData { get; set; } public JsonExtensionDataAttribute() { WriteData = true; ReadData = true; } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] public sealed class JsonIgnoreAttribute : Attribute { } public abstract class JsonNameTable { public abstract string Get(char[] key, int start, int length); } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, AllowMultiple = false)] public sealed class JsonObjectAttribute : JsonContainerAttribute { private MemberSerialization _memberSerialization; internal Required? _itemRequired; internal NullValueHandling? _itemNullValueHandling; public MemberSerialization MemberSerialization { get { return _memberSerialization; } set { _memberSerialization = value; } } public NullValueHandling ItemNullValueHandling { get { return _itemNullValueHandling ?? NullValueHandling.Include; } set { _itemNullValueHandling = value; } } public Required ItemRequired { get { return _itemRequired ?? Required.Default; } set { _itemRequired = value; } } public JsonObjectAttribute() { } public JsonObjectAttribute(MemberSerialization memberSerialization) { MemberSerialization = memberSerialization; } public JsonObjectAttribute(string id) : base(id) { } } internal enum JsonContainerType { None, Object, Array, Constructor } internal struct JsonPosition { private static readonly char[] SpecialCharacters = new char[18] { '.', ' ', '\'', '/', '"', '[', ']', '(', ')', '\t', '\n', '\r', '\f', '\b', '\\', '\u0085', '\u2028', '\u2029' }; internal JsonContainerType Type; internal int Position; internal string PropertyName; internal bool HasIndex; public JsonPosition(JsonContainerType type) { Type = type; HasIndex = TypeHasIndex(type); Position = -1; PropertyName = null; } internal int CalculateLength() { switch (Type) { case JsonContainerType.Object: return PropertyName.Length + 5; case JsonContainerType.Array: case JsonContainerType.Constructor: return MathUtils.IntLength((ulong)Position) + 2; default: throw new ArgumentOutOfRangeException("Type"); } } internal void WriteTo(StringBuilder sb, ref StringWriter writer, ref char[] buffer) { switch (Type) { case JsonContainerType.Object: { string propertyName = PropertyName; if (propertyName.IndexOfAny(SpecialCharacters) != -1) { sb.Append("['"); if (writer == null) { writer = new StringWriter(sb); } JavaScriptUtils.WriteEscapedJavaScriptString(writer, propertyName, '\'', appendDelimiters: false, JavaScriptUtils.SingleQuoteCharEscapeFlags, StringEscapeHandling.Default, null, ref buffer); sb.Append("']"); } else { if (sb.Length > 0) { sb.Append('.'); } sb.Append(propertyName); } break; } case JsonContainerType.Array: case JsonContainerType.Constructor: sb.Append('['); sb.Append(Position); sb.Append(']'); break; } } internal static bool TypeHasIndex(JsonContainerType type) { if (type != JsonContainerType.Array) { return type == JsonContainerType.Constructor; } return true; } internal static string BuildPath(List<JsonPosition> positions, JsonPosition? currentPosition) { int num = 0; if (positions != null) { for (int i = 0; i < positions.Count; i++) { num += positions[i].CalculateLength(); } } if (currentPosition.HasValue) { num += currentPosition.GetValueOrDefault().CalculateLength(); } StringBuilder stringBuilder = new StringBuilder(num); StringWriter writer = null; char[] buffer = null; if (positions != null) { foreach (JsonPosition position in positions) { position.WriteTo(stringBuilder, ref writer, ref buffer); } } currentPosition?.WriteTo(stringBuilder, ref writer, ref buffer); return stringBuilder.ToString(); } internal static string FormatMessage(IJsonLineInfo lineInfo, string path, string message) { if (!message.EndsWith(Environment.NewLine, StringComparison.Ordinal)) { message = message.Trim(); if (!StringUtils.EndsWith(message, '.')) { message += "."; } message += " "; } message += "Path '{0}'".FormatWith(CultureInfo.InvariantCulture, path); if (lineInfo != null && lineInfo.HasLineInfo()) { message += ", line {0}, position {1}".FormatWith(CultureInfo.InvariantCulture, lineInfo.LineNumber, lineInfo.LinePosition); } message += "."; return message; } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)] public sealed class JsonPropertyAttribute : Attribute { internal NullValueHandling? _nullValueHandling; internal DefaultValueHandling? _defaultValueHandling; internal ReferenceLoopHandling? _referenceLoopHandling; internal ObjectCreationHandling? _objectCreationHandling; internal TypeNameHandling? _typeNameHandling; internal bool? _isReference; internal int? _order; internal Required? _required; internal bool? _itemIsReference; internal ReferenceLoopHandling? _itemReferenceLoopHandling; internal TypeNameHandling? _itemTypeNameHandling; public Type ItemConverterType { get; set; } public object[] ItemConverterParameters { get; set; } public Type NamingStrategyType { get; set; } public object[] NamingStrategyParameters { get; set; } public NullValueHandling NullValueHandling { get { return _nullValueHandling ?? NullValueHandling.Include; } set { _nullValueHandling = value; } } public DefaultValueHandling DefaultValueHandling { get { return _defaultValueHandling ?? DefaultValueHandling.Include; } set { _defaultValueHandling = value; } } public ReferenceLoopHandling ReferenceLoopHandling { get { return _referenceLoopHandling ?? ReferenceLoopHandling.Error; } set { _referenceLoopHandling = value; } } public ObjectCreationHandling ObjectCreationHandling { get { return _objectCreationHandling ?? ObjectCreationHandling.Auto; } set { _objectCreationHandling = value; } } public TypeNameHandling TypeNameHandling { get { return _typeNameHandling ?? TypeNameHandling.None; } set { _typeNameHandling = value; } } public bool IsReference { get { return _isReference ?? false; } set { _isReference = value; } } public int Order { get { return _order ?? 0; } set { _order = value; } } public Required Required { get { return _required ?? Required.Default; } set { _required = value; } } public string PropertyName { get; set; } public ReferenceLoopHandling ItemReferenceLoopHandling { get { return _itemReferenceLoopHandling ?? ReferenceLoopHandling.Error; } set { _itemReferenceLoopHandling = value; } } public TypeNameHandling ItemTypeNameHandling { get { return _itemTypeNameHandling ?? TypeNameHandling.None; } set { _itemTypeNameHandling = value; } } public bool ItemIsReference { get { return _itemIsReference ?? false; } set { _itemIsReference = value; } } public JsonPropertyAttribute() { } public JsonPropertyAttribute(string propertyName) { PropertyName = propertyName; } } public abstract class JsonReader : IDisposable { protected internal enum State { Start, Complete, Property, ObjectStart, Object, ArrayStart, Array, Closed, PostValue, ConstructorStart, Constructor, Error, Finished } private JsonToken _tokenType; private object _value; internal char _quoteChar; internal State _currentState; private JsonPosition _currentPosition; private CultureInfo _culture; private DateTimeZoneHandling _dateTimeZoneHandling; private int? _maxDepth; private bool _hasExceededMaxDepth; internal DateParseHandling _dateParseHandling; internal FloatParseHandling _floatParseHandling; private string _dateFormatString; private List<JsonPosition> _stack; protected State CurrentState => _currentState; public bool CloseInput { get; set; } public bool SupportMultipleContent { get; set; } public virtual char QuoteChar { get { return _quoteChar; } protected internal set { _quoteChar = value; } } public DateTimeZoneHandling DateTimeZoneHandling { get { return _dateTimeZoneHandling; } set { if (value < DateTimeZoneHandling.Local || value > DateTimeZoneHandling.RoundtripKind) { throw new ArgumentOutOfRangeException("value"); } _dateTimeZoneHandling = value; } } public DateParseHandling DateParseHandling { get { return _dateParseHandling; } set { if (value < DateParseHandling.None || value > DateParseHandling.DateTimeOffset) { throw new ArgumentOutOfRangeException("value"); } _dateParseHandling = value; } } public FloatParseHandling FloatParseHandling { get { return _floatParseHandling; } set { if (value < FloatParseHandling.Double || value > FloatParseHandling.Decimal) { throw new ArgumentOutOfRangeException("value"); } _floatParseHandling = value; } } public string DateFormatString { get { return _dateFormatString; } set { _dateFormatString = value; } } public int? MaxDepth { get { return _maxDepth; } set { if (value <= 0) { throw new ArgumentException("Value must be positive.", "value"); } _maxDepth = value; } } public virtual JsonToken TokenType => _tokenType; public virtual object Value => _value; public virtual Type ValueType => _value?.GetType(); public virtual int Depth { get { int num = _stack?.Count ?? 0; if (JsonTokenUtils.IsStartToken(TokenType) || _currentPosition.Type == JsonContainerType.None) { return num; } return num + 1; } } public virtual string Path { get { if (_currentPosition.Type == JsonContainerType.None) { return string.Empty; } JsonPosition? currentPosition = ((_currentState != State.ArrayStart && _currentState != State.ConstructorStart && _currentState != State.ObjectStart) ? new JsonPosition?(_currentPosition) : null); return JsonPosition.BuildPath(_stack, currentPosition); } } public CultureInfo Culture { get { return _culture ?? CultureInfo.InvariantCulture; } set { _culture = value; } } public virtual Task<bool> ReadAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<bool>() ?? Read().ToAsync(); } public async Task SkipAsync(CancellationToken cancellationToken = default(CancellationToken)) { if (TokenType == JsonToken.PropertyName) { await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false); } if (JsonTokenUtils.IsStartToken(TokenType)) { int depth = Depth; while (await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false) && depth < Depth) { } } } internal async Task ReaderReadAndAssertAsync(CancellationToken cancellationToken) { if (!(await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false))) { throw CreateUnexpectedEndException(); } } public virtual Task<bool?> ReadAsBooleanAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<bool?>() ?? Task.FromResult(ReadAsBoolean()); } public virtual Task<byte[]> ReadAsBytesAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<byte[]>() ?? Task.FromResult(ReadAsBytes()); } internal async Task<byte[]> ReadArrayIntoByteArrayAsync(CancellationToken cancellationToken) { List<byte> buffer = new List<byte>(); do { if (!(await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false))) { SetToken(JsonToken.None); } } while (!ReadArrayElementIntoByteArrayReportDone(buffer)); byte[] array = buffer.ToArray(); SetToken(JsonToken.Bytes, array, updateIndex: false); return array; } public virtual Task<DateTime?> ReadAsDateTimeAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<DateTime?>() ?? Task.FromResult(ReadAsDateTime()); } public virtual Task<DateTimeOffset?> ReadAsDateTimeOffsetAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<DateTimeOffset?>() ?? Task.FromResult(ReadAsDateTimeOffset()); } public virtual Task<decimal?> ReadAsDecimalAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<decimal?>() ?? Task.FromResult(ReadAsDecimal()); } public virtual Task<double?> ReadAsDoubleAsync(CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(ReadAsDouble()); } public virtual Task<int?> ReadAsInt32Async(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<int?>() ?? Task.FromResult(ReadAsInt32()); } public virtual Task<string> ReadAsStringAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<string>() ?? Task.FromResult(ReadAsString()); } internal async Task<bool> ReadAndMoveToContentAsync(CancellationToken cancellationToken) { bool flag = await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false); if (flag) { flag = await MoveToContentAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false); } return flag; } internal Task<bool> MoveToContentAsync(CancellationToken cancellationToken) { JsonToken tokenType = TokenType; if (tokenType == JsonToken.None || tokenType == JsonToken.Comment) { return MoveToContentFromNonContentAsync(cancellationToken); } return AsyncUtils.True; } private async Task<bool> MoveToContentFromNonContentAsync(CancellationToken cancellationToken) { JsonToken tokenType; do { if (!(await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false))) { return false; } tokenType = TokenType; } while (tokenType == JsonToken.None || tokenType == JsonToken.Comment); return true; } internal JsonPosition GetPosition(int depth) { if (_stack != null && depth < _stack.Count) { return _stack[depth]; } return _currentPosition; } protected JsonReader() { _currentState = State.Start; _dateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; _dateParseHandling = DateParseHandling.DateTime; _floatParseHandling = FloatParseHandling.Double; CloseInput = true; } private void Push(JsonContainerType value) { UpdateScopeWithFinishedValue(); if (_currentPosition.Type == JsonContainerType.None) { _currentPosition = new JsonPosition(value); return; } if (_stack == null) { _stack = new List<JsonPosition>(); } _stack.Add(_currentPosition); _currentPosition = new JsonPosition(value); if (!_maxDepth.HasValue || !(Depth + 1 > _maxDepth) || _hasExceededMaxDepth) { return; } _hasExceededMaxDepth = true; throw JsonReaderException.Create(this, "The reader's MaxDepth of {0} has been exceeded.".FormatWith(CultureInfo.InvariantCulture, _maxDepth)); } private JsonContainerType Pop() { JsonPosition currentPosition; if (_stack != null && _stack.Count > 0) { currentPosition = _currentPosition; _currentPosition = _stack[_stack.Count - 1]; _stack.RemoveAt(_stack.Count - 1); } else { currentPosition = _currentPosition; _currentPosition = default(JsonPosition); } if (_maxDepth.HasValue && Depth <= _maxDepth) { _hasExceededMaxDepth = false; } return currentPosition.Type; } private JsonContainerType Peek() { return _currentPosition.Type; } public abstract bool Read(); public virtual int? ReadAsInt32() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Integer: case JsonToken.Float: { object value = Value; object obj; if ((obj = value) is int) { return (int)obj; } int num; if (value is BigInteger bigInteger) { num = (int)bigInteger; } else { try { num = Convert.ToInt32(value, CultureInfo.InvariantCulture); } catch (Exception ex) { throw JsonReaderException.Create(this, "Could not convert to integer: {0}.".FormatWith(CultureInfo.InvariantCulture, value), ex); } } SetToken(JsonToken.Integer, num, updateIndex: false); return num; } case JsonToken.String: { string s = (string)Value; return ReadInt32String(s); } default: throw JsonReaderException.Create(this, "Error reading integer. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal int? ReadInt32String(string s) { if (string.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (int.TryParse(s, NumberStyles.Integer, Culture, out var result)) { SetToken(JsonToken.Integer, result, updateIndex: false); return result; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to integer: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual string ReadAsString() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.String: return (string)Value; default: if (JsonTokenUtils.IsPrimitiveToken(contentToken)) { object value = Value; if (value != null) { string text = ((!(value is IFormattable formattable)) ? ((value is Uri uri) ? uri.OriginalString : value.ToString()) : formattable.ToString(null, Culture)); SetToken(JsonToken.String, text, updateIndex: false); return text; } } throw JsonReaderException.Create(this, "Error reading string. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } public virtual byte[] ReadAsBytes() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.StartObject: { ReadIntoWrappedTypeObject(); byte[] array2 = ReadAsBytes(); ReaderReadAndAssert(); if (TokenType != JsonToken.EndObject) { throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } SetToken(JsonToken.Bytes, array2, updateIndex: false); return array2; } case JsonToken.String: { string text = (string)Value; Guid g; byte[] array3 = ((text.Length == 0) ? CollectionUtils.ArrayEmpty<byte>() : ((!ConvertUtils.TryConvertGuid(text, out g)) ? Convert.FromBase64String(text) : g.ToByteArray())); SetToken(JsonToken.Bytes, array3, updateIndex: false); return array3; } case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Bytes: if (Value is Guid guid) { byte[] array = guid.ToByteArray(); SetToken(JsonToken.Bytes, array, updateIndex: false); return array; } return (byte[])Value; case JsonToken.StartArray: return ReadArrayIntoByteArray(); default: throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal byte[] ReadArrayIntoByteArray() { List<byte> list = new List<byte>(); do { if (!Read()) { SetToken(JsonToken.None); } } while (!ReadArrayElementIntoByteArrayReportDone(list)); byte[] array = list.ToArray(); SetToken(JsonToken.Bytes, array, updateIndex: false); return array; } private bool ReadArrayElementIntoByteArrayReportDone(List<byte> buffer) { switch (TokenType) { case JsonToken.None: throw JsonReaderException.Create(this, "Unexpected end when reading bytes."); case JsonToken.Integer: buffer.Add(Convert.ToByte(Value, CultureInfo.InvariantCulture)); return false; case JsonToken.EndArray: return true; case JsonToken.Comment: return false; default: throw JsonReaderException.Create(this, "Unexpected token when reading bytes: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } } public virtual double? ReadAsDouble() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Integer: case JsonToken.Float: { object value = Value; object obj; if ((obj = value) is double) { return (double)obj; } double num = ((!(value is BigInteger bigInteger)) ? Convert.ToDouble(value, CultureInfo.InvariantCulture) : ((double)bigInteger)); SetToken(JsonToken.Float, num, updateIndex: false); return num; } case JsonToken.String: return ReadDoubleString((string)Value); default: throw JsonReaderException.Create(this, "Error reading double. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal double? ReadDoubleString(string s) { if (string.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (double.TryParse(s, NumberStyles.Float | NumberStyles.AllowThousands, Culture, out var result)) { SetToken(JsonToken.Float, result, updateIndex: false); return result; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to double: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual bool? ReadAsBoolean() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Integer: case JsonToken.Float: { bool flag = ((!(Value is BigInteger bigInteger)) ? Convert.ToBoolean(Value, CultureInfo.InvariantCulture) : (bigInteger != 0L)); SetToken(JsonToken.Boolean, flag, updateIndex: false); return flag; } case JsonToken.String: return ReadBooleanString((string)Value); case JsonToken.Boolean: return (bool)Value; default: throw JsonReaderException.Create(this, "Error reading boolean. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal bool? ReadBooleanString(string s) { if (string.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (bool.TryParse(s, out var result)) { SetToken(JsonToken.Boolean, result, updateIndex: false); return result; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to boolean: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual decimal? ReadAsDecimal() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Integer: case JsonToken.Float: { object value = Value; object obj; if ((obj = value) is decimal) { return (decimal)obj; } decimal num; if (value is BigInteger bigInteger) { num = (decimal)bigInteger; } else { try { num = Convert.ToDecimal(value, CultureInfo.InvariantCulture); } catch (Exception ex) { throw JsonReaderException.Create(this, "Could not convert to decimal: {0}.".FormatWith(CultureInfo.InvariantCulture, value), ex); } } SetToken(JsonToken.Float, num, updateIndex: false); return num; } case JsonToken.String: return ReadDecimalString((string)Value); default: throw JsonReaderException.Create(this, "Error reading decimal. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal decimal? ReadDecimalString(string s) { if (string.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (decimal.TryParse(s, NumberStyles.Number, Culture, out var result)) { SetToken(JsonToken.Float, result, updateIndex: false); return result; } if (ConvertUtils.DecimalTryParse(s.ToCharArray(), 0, s.Length, out result) == ParseResult.Success) { SetToken(JsonToken.Float, result, updateIndex: false); return result; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to decimal: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual DateTime? ReadAsDateTime() { switch (GetContentToken()) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Date: if (Value is DateTimeOffset dateTimeOffset) { SetToken(JsonToken.Date, dateTimeOffset.DateTime, updateIndex: false); } return (DateTime)Value; case JsonToken.String: { string s = (string)Value; return ReadDateTimeString(s); } default: throw JsonReaderException.Create(this, "Error reading date. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } } internal DateTime? ReadDateTimeString(string s) { if (string.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (DateTimeUtils.TryParseDateTime(s, DateTimeZoneHandling, _dateFormatString, Culture, out var dt)) { dt = DateTimeUtils.EnsureDateTime(dt, DateTimeZoneHandling); SetToken(JsonToken.Date, dt, updateIndex: false); return dt; } if (DateTime.TryParse(s, Culture, DateTimeStyles.RoundtripKind, out dt)) { dt = DateTimeUtils.EnsureDateTime(dt, DateTimeZoneHandling); SetToken(JsonToken.Date, dt, updateIndex: false); return dt; } throw JsonReaderException.Create(this, "Could not convert string to DateTime: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual DateTimeOffset? ReadAsDateTimeOffset() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Date: if (Value is DateTime dateTime) { SetToken(JsonToken.Date, new DateTimeOffset(dateTime), updateIndex: false); } return (DateTimeOffset)Value; case JsonToken.String: { string s = (string)Value; return ReadDateTimeOffsetString(s); } default: throw JsonReaderException.Create(this, "Error reading date. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal DateTimeOffset? ReadDateTimeOffsetString(string s) { if (string.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (DateTimeUtils.TryParseDateTimeOffset(s, _dateFormatString, Culture, out var dt)) { SetToken(JsonToken.Date, dt, updateIndex: false); return dt; } if (DateTimeOffset.TryParse(s, Culture, DateTimeStyles.RoundtripKind, out dt)) { SetToken(JsonToken.Date, dt, updateIndex: false); return dt; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to DateTimeOffset: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } internal void ReaderReadAndAssert() { if (!Read()) { throw CreateUnexpectedEndException(); } } internal JsonReaderException CreateUnexpectedEndException() { return JsonReaderException.Create(this, "Unexpected end when reading JSON."); } internal void ReadIntoWrappedTypeObject() { ReaderReadAndAssert(); if (Value != null && Value.ToString() == "$type") { ReaderReadAndAssert(); if (Value != null && Value.ToString().StartsWith("System.Byte[]", StringComparison.Ordinal)) { ReaderReadAndAssert(); if (Value.ToString() == "$value") { return; } } } throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, JsonToken.StartObject)); } public void Skip() { if (TokenType == JsonToken.PropertyName) { Read(); } if (JsonTokenUtils.IsStartToken(TokenType)) { int depth = Depth; while (Read() && depth < Depth) { } } } protected void SetToken(JsonToken newToken) { SetToken(newToken, null, updateIndex: true); } protected void SetToken(JsonToken newToken, object value) { SetToken(newToken, value, updateIndex: true); } protected void SetToken(JsonToken newToken, object value, bool updateIndex) { _tokenType = newToken; _value = value; switch (newToken) { case JsonToken.StartObject: _currentState = State.ObjectStart; Push(JsonContainerType.Object); break; case JsonToken.StartArray: _currentState = State.ArrayStart; Push(JsonContainerType.Array); break; case JsonToken.StartConstructor: _currentState = State.ConstructorStart; Push(JsonContainerType.Constructor); break; case JsonToken.EndObject: ValidateEnd(JsonToken.EndObject); break; case JsonToken.EndArray: ValidateEnd(JsonToken.EndArray); break; case JsonToken.EndConstructor: ValidateEnd(JsonToken.EndConstructor); break; case JsonToken.PropertyName: _currentState = State.Property; _currentPosition.PropertyName = (string)value; break; case JsonToken.Raw: case JsonToken.Integer: case JsonToken.Float: case JsonToken.String: case JsonToken.Boolean: case JsonToken.Null: case JsonToken.Undefined: case JsonToken.Date: case JsonToken.Bytes: SetPostValueState(updateIndex); break; case JsonToken.Comment: break; } } internal void SetPostValueState(bool updateIndex) { if (Peek() != 0 || SupportMultipleContent) { _currentState = State.PostValue; } else { SetFinished(); } if (updateIndex) { UpdateScopeWithFinishedValue(); } } private void UpdateScopeWithFinishedValue() { if (_currentPosition.HasIndex) { _currentPosition.Position++; } } private void ValidateEnd(JsonToken endToken) { JsonContainerType jsonContainerType = Pop(); if (GetTypeForCloseToken(endToken) != jsonContainerType) { throw JsonReaderException.Create(this, "JsonToken {0} is not valid for closing JsonType {1}.".FormatWith(CultureInfo.InvariantCulture, endToken, jsonContainerType)); } if (Peek() != 0 || SupportMultipleContent) { _currentState = State.PostValue; } else { SetFinished(); } } protected void SetStateBasedOnCurrent() { JsonContainerType jsonContainerType = Peek(); switch (jsonContainerType) { case JsonContainerType.Object: _currentState = State.Object; break; case JsonContainerType.Array: _currentState = State.Array; break; case JsonContainerType.Constructor: _currentState = State.Constructor; break; case JsonContainerType.None: SetFinished(); break; default: throw JsonReaderException.Create(this, "While setting the reader state back to current object an unexpected JsonType was encountered: {0}".FormatWith(CultureInfo.InvariantCulture, jsonContainerType)); } } private void SetFinished() { _currentState = ((!SupportMultipleContent) ? State.Finished : State.Start); } private JsonContainerType GetTypeForCloseToken(JsonToken token) { return token switch { JsonToken.EndObject => JsonContainerType.Object, JsonToken.EndArray => JsonContainerType.Array, JsonToken.EndConstructor => JsonContainerType.Constructor, _ => throw JsonReaderException.Create(this, "Not a valid close JsonToken: {0}".FormatWith(CultureInfo.InvariantCulture, token)), }; } void IDisposable.Dispose() { Dispose(disposing: true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (_currentState != State.Closed && disposing) { Close(); } } public virtual void Close() { _currentState = State.Closed; _tokenType = JsonToken.None; _value = null; } internal void ReadAndAssert() { if (!Read()) { throw JsonSerializationException.Create(this, "Unexpected end when reading JSON."); } } internal void ReadForTypeAndAssert(JsonContract contract, bool hasConverter) { if (!ReadForType(contract, hasConverter)) { throw JsonSerializationException.Create(this, "Unexpected end when reading JSON."); } } internal bool ReadForType(JsonContract contract, bool hasConverter) { if (hasConverter) { return Read(); } switch (contract?.InternalReadType ?? ReadType.Read) { case ReadType.Read: return ReadAndMoveToContent(); case ReadType.ReadAsInt32: ReadAsInt32(); break; case ReadType.ReadAsInt64: { bool result = ReadAndMoveToContent(); if (TokenType == JsonToken.Undefined) { throw JsonReaderException.Create(this, "An undefined token is not a valid {0}.".FormatWith(CultureInfo.InvariantCulture, contract?.UnderlyingType ?? typeof(long))); } return result; } case ReadType.ReadAsDecimal: ReadAsDecimal(); break; case ReadType.ReadAsDouble: ReadAsDouble(); break; case ReadType.ReadAsBytes: ReadAsBytes(); break; case ReadType.ReadAsBoolean: ReadAsBoolean(); break; case ReadType.ReadAsString: ReadAsString(); break; case ReadType.ReadAsDateTime: ReadAsDateTime(); break; case ReadType.ReadAsDateTimeOffset: ReadAsDateTimeOffset(); break; default: throw new ArgumentOutOfRangeException(); } return TokenType != JsonToken.None; } internal bool ReadAndMoveToContent() { if (Read()) { return MoveToContent(); } return false; } internal bool MoveToContent() { JsonToken tokenType = TokenType; while (tokenType == JsonToken.None || tokenType == JsonToken.Comment) { if (!Read()) { return false; } tokenType = TokenType; } return true; } private JsonToken GetContentToken() { JsonToken tokenType; do { if (!Read()) { SetToken(JsonToken.None); return JsonToken.None; } tokenType = TokenType; } while (tokenType == JsonToken.Comment); return tokenType; } } [Serializable] public class JsonReaderException : JsonException { public int LineNumber { get; } public int LinePosition { get; } public string Path { get; } public JsonReaderException() { } public JsonReaderException(string message) : base(message) { } public JsonReaderException(string message, Exception innerException) : base(message, innerException) { } public JsonReaderException(SerializationInfo info, StreamingContext context) : base(info, context) { } public JsonReaderException(string message, string path, int lineNumber, int linePosition, Exception innerException) : base(message, innerException) { Path = path; LineNumber = lineNumber; LinePosition = linePosition; } internal static JsonReaderException Create(JsonReader reader, string message) { return Create(reader, message, null); } internal static JsonReaderException Create(JsonReader reader, string message, Exception ex) { return Create(reader as IJsonLineInfo, reader.Path, message, ex); } internal static JsonReaderException Create(IJsonLineInfo lineInfo, string path, string message, Exception ex) { message = JsonPosition.FormatMessage(lineInfo, path, message); int lineNumber; int linePosition; if (lineInfo != null && lineInfo.HasLineInfo()) { lineNumber = lineInfo.LineNumber; linePosition = lineInfo.LinePosition; } else { lineNumber = 0; linePosition = 0; } return new JsonReaderException(message, path, lineNumber, linePosition, ex); } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] public sealed class JsonRequiredAttribute : Attribute { } [Serializable] public class JsonSerializationException : JsonException { public int LineNumber { get; } public int LinePosition { get; } public string Path { get; } public JsonSerializationException() { } public JsonSerializationException(string message) : base(message) { } public JsonSerializationException(string message, Exception innerException) : base(message, innerException) { } public JsonSerializationException(SerializationInfo info, StreamingContext context) : base(info, context) { } public JsonSerializationException(string message, string path, int lineNumber, int linePosition, Exception innerException) : base(message, innerException) { Path = path; LineNumber = lineNumber; LinePosition = linePosition; } internal static JsonSerializationException Create(JsonReader reader, string message) { return Create(reader, message, null); } internal static JsonSerializationException Create(JsonReader reader, string message, Exception ex) { return Create(reader as IJsonLineInfo, reader.Path, message, ex); } internal static JsonSerializationException Create(IJsonLineInfo lineInfo, string path, string message, Exception ex) { message = JsonPosition.FormatMessage(lineInfo, path, message); int lineNumber; int linePosition; if (lineInfo != null && lineInfo.HasLineInfo()) { lineNumber = lineInfo.LineNumber; linePosition = lineInfo.LinePosition; } else { lineNumber = 0; linePosition = 0; } return new JsonSerializationException(message, path, lineNumber, linePosition, ex); } } public class JsonSerializer { internal TypeNameHandling _typeNameHandling; internal TypeNameAssemblyFormatHandling _typeNameAssemblyFormatHandling; internal PreserveReferencesHandling _preserveReferencesHandling; internal ReferenceLoopHandling _referenceLoopHandling; internal MissingMemberHandling _missingMemberHandling; internal ObjectCreationHandling _objectCreationHandling; internal NullValueHandling _nullValueHandling; internal DefaultValueHandling _defaultValueHandling; internal ConstructorHandling _constructorHandling; internal MetadataPropertyHandling _metadataPropertyHandling; internal JsonConverterCollection _converters; internal IContractResolver _contractResolver; internal ITraceWriter _traceWriter; internal IEqualityComparer _equalityComparer; internal ISerializationBinder _serializationBinder; internal StreamingContext _context; private IReferenceResolver _referenceResolver; private Formatting? _formatting; private DateFormatHandling? _dateFormatHandling; private DateTimeZoneHandling? _dateTimeZoneHandling; private DateParseHandling? _dateParseHandling; private FloatFormatHandling? _floatFormatHandling; private FloatParseHandling? _floatParseHandling; private StringEscapeHandling? _stringEscapeHandling; private CultureInfo _culture; private int? _maxDepth; private bool _maxDepthSet; private bool? _checkAdditionalContent; private string _dateFormatString; private bool _dateFormatStringSet; public virtual IReferenceResolver ReferenceResolver { get { return GetReferenceResolver(); } set { if (value == null) { throw new ArgumentNullException("value", "Reference resolver cannot be null."); } _referenceResolver = value; } } [Obsolete("Binder is obsolete. Use SerializationBinder instead.")] public virtual SerializationBinder Binder { get { if (_serializationBinder == null) { return null; } if (_serializationBinder is SerializationBinder result) { return result; } if (_serializationBinder is SerializationBinderAdapter serializationBinderAdapter) { return serializationBinderAdapter.SerializationBinder; } throw new InvalidOperationException("Cannot get SerializationBinder because an ISerializationBinder was previously set."); } set { if (value == null) { throw new ArgumentNullException("value", "Serialization binder cannot be null."); } _serializationBinder = (value as ISerializationBinder) ?? new SerializationBinderAdapter(value); } } public virtual ISerializationBinder SerializationBinder { get { return _serializationBinder; } set { if (value == null) { throw new ArgumentNullException("value", "Serialization binder cannot be null."); } _serializationBinder = value; } } public virtual ITraceWriter TraceWriter { get { return _traceWriter; } set { _traceWriter = value; } } public virtual IEqualityComparer EqualityComparer { get { return _equalityComparer; } set { _equalityComparer = value; } } public virtual TypeNameHandling TypeNameHandling { get { return _typeNameHandling; } set { if (value < TypeNameHandling.None || value > TypeNameHandling.Auto) { throw new ArgumentOutOfRangeException("value"); } _typeNameHandling = value; } } [Obsolete("TypeNameAssemblyFormat is obsolete. Use TypeNameAssemblyFormatHandling instead.")] public virtual FormatterAssemblyStyle TypeNameAssemblyFormat { get { return (FormatterAssemblyStyle)_typeNameAssemblyFormatHandling; } set { if (value < FormatterAssemblyStyle.Simple || value > FormatterAssemblyStyle.Full) { throw new ArgumentOutOfRangeException("value"); } _typeNameAssemblyFormatHandling = (TypeNameAssemblyFormatHandling)value; } } public virtual TypeNameAssemblyFormatHandling TypeNameAssemblyFormatHandling { get { return _typeNameAssemblyFormatHandling; } set { if (value < TypeNameAssemblyFormatHandling.Simple || value > TypeNameAssemblyFormatHandling.Full) { throw new ArgumentOutOfRangeException("value"); } _typeNameAssemblyFormatHandling = value; } } public virtual PreserveReferencesHandling PreserveReferencesHandling { get { return _preserveReferencesHandling; } set { if (value < PreserveReferencesHandling.None || value > PreserveReferencesHandling.All) { throw new ArgumentOutOfRangeException("value"); } _preserveReferencesHandling = value; } } public virtual ReferenceLoopHandling ReferenceLoopHandling { get { return _referenceLoopHandling; } set { if (value < ReferenceLoopHandling.Error || value > ReferenceLoopHandling.Serialize) { throw new ArgumentOutOfRangeException("value"); } _referenceLoopHandling = value; } } public virtual MissingMemberHandling MissingMemberHandling { get { return _missingMemberHandling; } set { if (value < MissingMemberHandling.Ignore || value > MissingMemberHandling.Error) { throw new ArgumentOutOfRangeException("value"); } _missingMemberHandling = value; } } public virtual NullValueHandling NullValueHandling { get { return _nullValueHandling; } set { if (value < NullValueHandling.Include || value > NullValueHandling.Ignore) { throw new ArgumentOutOfRangeException("value"); } _nullValueHandling = value; } } public virtual DefaultValueHandling DefaultValueHandling { get { return _defaultValueHandling; } set { if (value < DefaultValueHandling.Include || value > DefaultValueHandling.IgnoreAndPopulate) { throw new ArgumentOutOfRangeException("value"); } _defaultValueHandling = value; } } public virtual ObjectCreationHandling ObjectCreationHandling { get { return _objectCreationHandling; } set { if (value < ObjectCreationHandling.Auto || value > ObjectCreationHandling.Replace) { throw new ArgumentOutOfRangeException("value"); } _objectCreationHandling = value; } } public virtual ConstructorHandling ConstructorHandling { get { return _constructorHandling; } set { if (value < ConstructorHandling.Default || value > ConstructorHandling.AllowNonPublicDefaultConstructor) { throw new ArgumentOutOfRangeException("value"); } _constructorHandling = value; } } public virtual MetadataPropertyHandling MetadataPropertyHandling { get { return _metadataPropertyHandling; } set { if (value < MetadataPropertyHandling.Default || value > MetadataPropertyHandling.Ignore) { throw new ArgumentOutOfRangeException("value"); } _metadataPropertyHandling = value; } } public virtual JsonConverterCollection Converters { get { if (_converters == null) { _converters = new JsonConverterCollection(); } return _converters; } } public virtual IContractResolver ContractResolver { get { return _contractResolver; } set { _contractResolver = value ?? DefaultContractResolver.Instance; } } public virtual StreamingContext Context { get { return _context; } set { _context = value; } } public virtual Formatting Formatting { get { return _formatting ?? Formatting.None; } set { _formatting = value; } } public virtual DateFormatHandling DateFormatHandling { get { return _dateFormatHandling ?? DateFormatHandling.IsoDateFormat; } set { _dateFormatHandling = value; } } public virtual DateTimeZoneHandling DateTimeZoneHandling { get { return _dateTimeZoneHandling ?? DateTimeZoneHandling.RoundtripKind; } set { _dateTimeZoneHandling = value; } } public virtual DateParseHandling DateParseHandling { get { return _dateParseHandling ?? DateParseHandling.DateTime; } set { _dateParseHandling = value; } } public virtual FloatParseHandling FloatParseHandling { get { return _floatParseHandling ?? FloatParseHandling.Double; } set { _floatParseHandling = value; } } public virtual FloatFormatHandling FloatFormatHandling { get { return _floatFormatHandling ?? FloatFormatHandling.String; } set { _floatFormatHandling = value; } } public virtual StringEscapeHandling StringEscapeHandling { get { return _stringEscapeHandling ?? StringEscapeHandling.Default; } set { _stringEscapeHandling = value; } } public virtual string DateFormatString { get { return _dateFormatString ?? "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"; } set { _dateFormatString = value; _dateFormatStringSet = true; } } public virtual CultureInfo Culture { get { return _culture ?? JsonSerializerSettings.DefaultCulture; } set { _culture = value; } } public virtual int? MaxDepth { get { return _maxDepth; } set { if (value <= 0) { throw new ArgumentException("Value must be positive.", "value"); } _maxDepth = value; _maxDepthSet = true; } } public virtual bool CheckAdditionalContent { get { return _checkAdditionalContent ?? false; } set { _checkAdditionalContent = value; } } public virtual event EventHandler<Newtonsoft.Json.Serialization.ErrorEventArgs> Error; internal bool IsCheckAdditionalContentSet() { return _checkAdditionalContent.HasValue; } public JsonSerializer() { _referenceLoopHandling = ReferenceLoopHandling.Error; _missingMemberHandling = MissingMemberHandling.Ignore; _nullValueHandling = NullValueHandling.Include; _defaultValueHandling = DefaultValueHandling.Include; _objectCreationHandling = ObjectCreationHandling.Auto; _preserveReferencesHandling = PreserveReferencesHandling.None; _constructorHandling = ConstructorHandling.Default; _typeNameHandling = TypeNameHandling.None; _metadataPropertyHandling = MetadataPropertyHandling.Default; _context = JsonSerializerSettings.DefaultContext; _serializationBinder = DefaultSerializationBinder.Instance; _culture = JsonSerializerSettings.DefaultCulture; _contractResolver = DefaultContractResolver.Instance; } public static JsonSerializer Create() { return new JsonSerializer(); } public static JsonSerializer Create(JsonSerializerSettings settings) { JsonSerializer jsonSerializer = Create(); if (settings != null) { ApplySerializerSettings(jsonSerializer, settings); } return jsonSerializer; } public static JsonSerializer CreateDefault() { return Create(JsonConvert.DefaultSettings?.Invoke()); } public static JsonSerializer CreateDefault(JsonSerializerSettings settings) { JsonSerializer jsonSerializer = CreateDefault(); if (settings != null) { ApplySerializerSettings(jsonSerializer, settings); } return jsonSerializer; } private static void ApplySerializerSettings(JsonSerializer serializer, JsonSerializerSettings settings) { if (!CollectionUtils.IsNullOrEmpty(settings.Converters)) { for (int i = 0; i < settings.Converters.Count; i++) { serializer.Converters.Insert(i, settings.Converters[i]); } } if (settings._typeNameHandling.HasValue) { serializer.TypeNameHandling = settings.TypeNameHandling; } if (settings._metadataPropertyHandling.HasValue) { serializer.MetadataPropertyHandling = settings.MetadataPropertyHandling; } if (settings._typeNameAssemblyFormatHandling.HasValue) { serializer.TypeNameAssemblyFormatHandling = settings.TypeNameAssemblyFormatHandling; } if (settings._preserveReferencesHandling.HasValue) { serializer.PreserveReferencesHandling = settings.PreserveReferencesHandling; } if (settings._referenceLoopHandling.HasValue) { serializer.ReferenceLoopHandling = settings.ReferenceLoopHandling; } if (settings._missingMemberHandling.HasValue) { serializer.MissingMemberHandling = settings.MissingMemberHandling; } if (settings._objectCreationHandling.HasValue) { serializer.ObjectCreationHandling = settings.ObjectCreationHandling; } if (settings._nullValueHandling.HasValue) { serializer.NullValueHandling = settings.NullValueHandling; } if (settings._defaultValueHandling.HasValue) { serializer.DefaultValueHandling = settings.DefaultValueHandling; } if (settings._constructorHandling.HasValue) { serializer.ConstructorHandling = settings.ConstructorHandling; } if (settings._context.HasValue) { serializer.Context = settings.Context; } if (settings._checkAdditionalContent.HasValue) { serializer._checkAdditionalContent = settings._checkAdditionalContent; } if (settings.Error != null) { serializer.Error += settings.Error; } if (settings.ContractResolver != null) { serializer.ContractResolver = settings.ContractResolver; } if (settings.ReferenceResolverProvider != null) { serializer.ReferenceResolver = settings.ReferenceResolverProvider(); } if (settings.TraceWriter != null) { serializer.TraceWriter = settings.TraceWriter; } if (settings.EqualityComparer != null) { serializer.EqualityComparer = settings.EqualityComparer; } if (settings.SerializationBinder != null) { serializer.SerializationBinder = settings.SerializationBinder; } if (settings._formatting.HasValue) { serializer._formatting = settings._formatting; } if (settings._dateFormatHandling.HasValue) { serializer._dateFormatHandling = settings._dateFormatHandling; } if (settings._dateTimeZoneHandling.HasValue) { serializer._dateTimeZoneHandling = settings._dateTimeZoneHandling; } if (settings._dateParseHandling.HasValue) { serializer._dateParseHandling = settings._dateParseHandling; } if (settings._dateFormatStringSet) { serializer._dateFormatString = settings._dateFormatString; serializer._dateFormatStringSet = settings._dateFormatStringSet; } if (settings._floatFormatHandling.HasValue) { serializer._floatFormatHandling = settings._floatFormatHandling; } if (settings._floatParseHandling.HasValue) { serializer._floatParseHandling = settings._floatParseHandling; } if (settings._stringEscapeHandling.HasValue) { serializer._stringEscapeHandling = settings._stringEscapeHandling; } if (settings._culture != null) { serializer._culture = settings._culture; } if (settings._maxDepthSet) { serializer._maxDepth = settings._maxDepth; serializer._maxDepthSet = settings._maxDepthSet; } } [DebuggerStepThrough] public void Populate(TextReader reader, object target) { Populate(new JsonTextReader(reader), target); } [DebuggerStepThrough] public void Populate(JsonReader reader, object target) { PopulateInternal(reader, target); } internal virtual void PopulateInternal(JsonReader reader, object target) { ValidationUtils.ArgumentNotNull(reader, "reader"); ValidationUtils.ArgumentNotNull(target, "target"); SetupReader(reader, out var previousCulture, out var previousDateTimeZoneHandling, out var previousDateParseHandling, out var previousFloatParseHandling, out var previousMaxDepth, out var previousDateFormatString); TraceJsonReader traceJsonReader = ((TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) ? CreateTraceJsonReader(reader) : null); new JsonSerializerInternalReader(this).Populate(traceJsonReader ?? reader, target); if (traceJsonReader != null) { TraceWriter.Trace(TraceLevel.Verbose, traceJsonReader.GetDeserializedJsonMessage(), null); } ResetReader(reader, previousCulture, previousDateTimeZoneHandling, previousDateParseHandling, previousFloatParseHandling, previousMaxDepth, previousDateFormatString); } [DebuggerStepThrough] public object Deserialize(JsonReader reader) { return Deserialize(reader, null); } [DebuggerStepThrough] public object Deserialize(TextReader reader, Type objectType) { return Deserialize(new JsonTextReader(reader), objectType); } [DebuggerStepThrough] public T Deserialize<T>(JsonReader reader) { return (T)Deserialize(reader, typeof(T)); } [DebuggerStepThrough] public object Deserialize(JsonReader reader, Type objectType) { return DeserializeInternal(reader, objectType); } internal virtual object DeserializeInternal(JsonReader reader, Type objectType) { ValidationUtils.ArgumentNotNull(reader, "reader"); SetupReader(reader, out var previousCulture, out var previousDateTimeZoneHandling, out var previousDateParseHandling, out var previousFloatParseHandling, out var previousMaxDepth, out var previousDateFormatString); TraceJsonReader traceJsonReader = ((TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) ? CreateTraceJsonReader(reader) : null); object result = new JsonSerializerInternalReader(this).Deserialize(traceJsonReader ?? reader, objectType, CheckAdditionalContent); if (traceJsonReader != null) { TraceWriter.Trace(TraceLevel.Verbose, traceJsonReader.GetDeserializedJsonMessage(), null); } ResetReader(reader, previousCulture, previousDateTimeZoneHandling, previousDateParseHandling, previousFloatParseHandling, previousMaxDepth, previousDateFormatString); return result; } private void SetupReader(JsonReader reader, out CultureInfo previousCulture, out DateTimeZoneHandling? previousDateTimeZoneHandling, out DateParseHandling? previousDateParseHandling, out FloatParseHandling? previousFloatParseHandling, out int? previousMaxDepth, out string previousDateFormatString) { if (_culture != null && !_culture.Equals(reader.Culture)) { previousCulture = reader.Culture; reader.Culture = _culture; } else { previousCulture = null; } if (_dateTimeZoneHandling.HasValue && reader.DateTimeZoneHandling != _dateTimeZoneHandling) { previousDateTimeZoneHandling = reader.DateTimeZoneHandling; reader.DateTimeZoneHandling = _dateTimeZoneHandling.GetValueOrDefault(); } else { previousDateTimeZoneHandling = null; } if (_dateParseHandling.HasValue && reader.DateParseHandling != _dateParseHandling) { previousDateParseHandling = reader.DateParseHandling; reader.DateParseHandling = _dateParseHandling.GetValueOrDefault(); } else { previousDateParseHandling = null; } if (_floatParseHandling.HasValue && reader.FloatParseHandling != _floatParseHandling) { previousFloatParseHandling = reader.FloatParseHandling; reader.FloatParseHandling = _floatParseHandling.GetValueOrDefault(); } else { previousFloatParseHandling = null; } if (_maxDepthSet && reader.MaxDepth != _maxDepth) { previousMaxDepth = reader.MaxDepth; reader.MaxDepth = _maxDepth; } else { previousMaxDepth = null; } if (_dateFormatStringSet && reader.DateFormatString != _dateFormatString) { previousDateFormatString = reader.DateFormatString; reader.DateFormatString = _dateFormatString; } else { previousDateFormatString = null; } if (reader is JsonTextReader jsonTextReader && jsonTextReader.PropertyNameTable == null && _contractResolver is DefaultContractResolver defaultContractResolver) { jsonTextReader.PropertyNameTable = defaultContractResolver.GetNameTable(); } } private void ResetReader(JsonReader reader, CultureInfo previousCulture, DateTimeZoneHandling? previousDateTimeZoneHandling, DateParseHandling? previousDateParseHandling, FloatParseHandling? previousFloatParseHandling, int? previousMaxDepth, string previousDateFormatString) { if (previousCulture != null) { reader.Culture = previousCulture; } if (previousDateTimeZoneHandling.HasValue) { reader.DateTimeZoneHandling = previousDateTimeZoneHandling.GetValueOrDefault(); } if (previousDateParseHandling.HasValue) { reader.DateParseHandling = previousDateParseHandling.GetValueOrDefault(); } if (previousFloatParseHandling.HasValue) { reader.FloatParseHandling = previousFloatParseHandling.GetValueOrDefault(); } if (_maxDepthSet) { reader.MaxDepth = previousMaxDepth; } if (_dateFormatStringSet) { reader.DateFormatString = previousDateFormatString; } if (reader is JsonTextReader jsonTextReader && jsonTextReader.PropertyNameTable != null && _contractResolver is DefaultContractResolver defaultContractResolver && jsonTextReader.PropertyNameTable == defaultContractResolver.GetNameTable()) { jsonTextReader.PropertyNameTable = null; } } public void Serialize(TextWriter textWriter, object value) { Serialize(new JsonTextWriter(textWriter), value); } public void Serialize(JsonWriter jsonWriter, object value, Type objectType) { SerializeInternal(jsonWriter, value, objectType); } public void Serialize(TextWriter textWriter, object value, Type objectType) { Serialize(new JsonTextWriter(textWriter), value, objectType); } public void Serialize(JsonWriter jsonWriter, object value) { SerializeInternal(jsonWriter, value, null); } private TraceJsonReader CreateTraceJsonReader(JsonReader reader) { TraceJsonReader traceJsonReader = new TraceJsonReader(reader); if (reader.TokenType != 0) { traceJsonReader.WriteCurrentToken(); } return traceJsonReader; } internal virtual void SerializeInternal(JsonWriter jsonWriter, object value, Type objectType) { ValidationUtils.ArgumentNotNull(jsonWriter, "jsonWriter"); Formatting? formatting = null; if (_formatting.HasValue && jsonWriter.Formatting != _formatting) { formatting = jsonWriter.Formatting; jsonWriter.Formatting = _formatting.GetValueOrDefault(); } DateFormatHandling? dateFormatHandling = null; if (_dateFormatHandling.HasValue && jsonWriter.DateFormatHandling != _dateFormatHandling) { dateFormatHandling = jsonWriter.DateFormatHandling; jsonWriter.DateFormatHandling = _dateFormatHandling.GetValueOrDefault(); } DateTimeZoneHandling? dateTimeZoneHandling = null; if (_dateTimeZoneHandling.HasValue && jsonWriter.DateTimeZoneHandling != _dateTimeZoneHandling) { dateTimeZoneHandling = jsonWriter.DateTimeZoneHandling; jsonWriter.DateTimeZoneHandling = _dateTimeZoneHandling.GetValueOrDefault(); } FloatFormatHandling? floatFormatHandling = null; if (_floatFormatHandling.HasValue && jsonWriter.FloatFormatHandling != _floatFormatHandling) { floatFormatHandling = jsonWriter.FloatFormatHandling; jsonWriter.FloatFormatHandling = _floatFormatHandling.GetValueOrDefault(); } StringEscapeHandling? stringEscapeHandling = null; if (_stringEscapeHandling.HasValue && jsonWriter.StringEscapeHandling != _stringEscapeHandling) { stringEscapeHandling = jsonWriter.StringEscapeHandling; jsonWriter.StringEscapeHandling = _stringEscapeHandling.GetValueOrDefault(); } CultureInfo cultureInfo = null; if (_culture != null && !_culture.Equals(jsonWriter.Culture)) { cultureInfo = jsonWriter.Culture; jsonWriter.Culture = _culture; } string dateFormatString = null; if (_dateFormatStringSet && jsonWriter.DateFormatString != _dateFormatString) { dateFormatString = jsonWriter.DateFormatString; jsonWriter.DateFormatString = _dateFormatString; } TraceJsonWriter traceJsonWriter = ((TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) ? new TraceJsonWriter(jsonWriter) : null); new JsonSerializerInternalWriter(this).Serialize(traceJsonWriter ?? jsonWriter, value, objectType); if (traceJsonWriter != null) { TraceWriter.Trace(TraceLevel.Verbose, traceJsonWriter.GetSerializedJsonMessage(), null); } if (formatting.HasValue) { jsonWriter.Formatting = formatting.GetValueOrDefault(); } if (dateFormatHandling.HasValue) { jsonWriter.DateFormatHandling = dateFormatHandling.GetValueOrDefault(); } if (dateTimeZoneHandling.HasValue) { jsonWriter.DateTimeZoneHandling = dateTimeZoneHandling.GetValueOrDefault(); } if (floatFormatHandling.HasValue) { jsonWriter.FloatFormatHandling = floatFormatHandling.GetValueOrDefault(); } if (stringEscapeHandling.HasValue) { jsonWriter.StringEscapeHandling = stringEscapeHandling.GetValueOrDefault(); } if (_dateFormatStringSet) { jsonWriter.DateFormatString = dateFormatString; } if (cultureInfo != null) { jsonWriter.Culture = cultureInfo; } } internal IReferenceResolver GetReferenceResolver() { if (_referenceResolver == null) { _referenceResolver = new DefaultReferenceResolver(); } return _referenceResolver; } internal JsonConverter GetMatchingConverter(Type type) { return GetMatchingConverter(_converters, type); } internal static JsonConverter GetMatchingConverter(IList<JsonConverter> converters, Type objectType) { if (converters != null) { for (int i = 0; i < converters.Count; i++) { JsonConverter jsonConverter = converters[i]; if (jsonConverter.CanConvert(objectType)) { return jsonConverter; } } } return null; } internal void OnError(Newtonsoft.Json.Serialization.ErrorEventArgs e) { this.Error?.Invoke(this, e); } } public class JsonSerializerSettings { internal const ReferenceLoopHandling DefaultReferenceLoopHandling = ReferenceLoopHandling.Error; internal const MissingMemberHandling DefaultMissingMemberHandling = MissingMemberHandling.Ignore; internal const NullValueHandling DefaultNullValueHandling = NullValueHandling.Include; internal const DefaultValueHandling DefaultDefaultValueHandling = DefaultValueHandling.Include; internal const ObjectCreationHandling DefaultObjectCreationHandling = ObjectCreationHandling.Auto; internal const PreserveReferencesHandling DefaultPreserveReferencesHandling = PreserveReferencesHandling.None; internal const ConstructorHandling DefaultConstructorHandling = ConstructorHandling.Default; internal const TypeNameHandling DefaultTypeNameHandling = TypeNameHandling.None; internal const MetadataPropertyHandling DefaultMetadataPropertyHandling = MetadataPropertyHandling.Default; internal static readonly StreamingContext DefaultContext; internal const Formatting DefaultFormatting = Formatting.None; internal const DateFormatHandling DefaultDateFormatHandling = DateFormatHandling.IsoDateFormat; internal const DateTimeZoneHandling DefaultDateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; internal const DateParseHandling DefaultDateParseHandling = DateParseHandling.DateTime; internal const FloatParseHandling DefaultFloatParseHandling = FloatParseHandling.Double; internal const FloatFormatHandling DefaultFloatFormatHandling = FloatFormatHandling.String; internal const StringEscapeHandling DefaultStringEscapeHandling = StringEscapeHandling.Default; internal const TypeNameAssemblyFormatHandling DefaultTypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Simple; internal static readonly CultureInfo DefaultCulture; internal const bool DefaultCheckAdditionalContent = false; internal const string DefaultDateFormatString = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"; internal Formatting? _formatting; internal DateFormatHandling? _dateFormatHandling; internal DateTimeZoneHandling? _dateTimeZoneHandling; internal DateParseHandling? _dateParseHandling; internal FloatFormatHandling? _floatFormatHandling; internal FloatParseHandling? _floatParseHandling; internal StringEscapeHandling? _stringEscapeHandling; internal CultureInfo _culture; internal bool? _checkAdditionalContent; internal int? _maxDepth; internal bool _maxDepthSet; internal string _dateFormatString; internal bool _dateFormatStringSet; internal TypeNameAssemblyFormatHandling? _typeNameAssemblyFormatHandling; internal DefaultValueHandling? _defaultValueHandling; internal PreserveReferencesHandling? _preserveReferencesHandling; internal NullValueHandling? _nullValueHandling; internal ObjectCreationHandling? _objectCreationHandling; internal MissingMemberHandling? _missingMemberHandling; internal ReferenceLoopHandling? _referenceLoopHandling; internal StreamingContext? _context; internal ConstructorHandling? _constructorHandling; internal TypeNameHandling? _typeNameHandling; internal MetadataPropertyHandling? _metadataPropertyHandling; public ReferenceLoopHandling ReferenceLoopHandling { get { return _referenceLoopHandling ?? ReferenceLoopHandling.Error; } set { _referenceLoopHandling = value; } } public MissingMemberHandling MissingMemberHandling { get { return _missingMemberHandling ?? MissingMemberHandling.Ignore; } set { _missingMemberHandling = value; } } public ObjectCreationHandling ObjectCreationHandling { get { return _objectCreationHandling ?? ObjectCreationHandling.Auto; } set { _objectCreationHandling = value; } } public NullValueHandling NullValueHandling { get { return _nullValueHandling ?? NullValueHandling.Include; } set { _nullValueHandling = value; } } public DefaultValueHandling DefaultValueHandling { get { return _defaultValueHandling ?? DefaultValueHandling.Include; } set { _defaultValueHandling = value; } } public IList<JsonConverter> Converters { get; set; } public PreserveReferencesHandling PreserveReferencesHandling { get { return _preserveReferencesHandling ?? PreserveReferencesHandling.None; } set { _preserveReferencesHandling = value; } } public TypeNameHandling TypeNameHandling { get { return _typeNameHandling ?? TypeNameHandling.None; } set { _typeNameHandling = value; } } public MetadataPropertyHandling MetadataPropertyHandling { get { return _metadataPropertyHandling ?? MetadataPropertyHandling.Default; } set { _metadataPropertyHandling = value; } } [Obsolete("TypeNameAssemblyFormat is obsolete. Use TypeNameAssemblyFormatHandling instead.")] public FormatterAssemblyStyle TypeNameAssemblyFormat { get { return (FormatterAssemblyStyle)TypeNameAssemblyFormatHandling; } set { TypeNameAssemblyFormatHandling = (TypeNameAssemblyFormatHandling)value; } } public TypeNameAssemblyFormatHandling TypeNameAssemblyFormatHandling { get { return _typeNameAssemblyFormatHandling ?? TypeNameAssemblyFormatHandling.Simple; } set { _typeNameAssemblyFormatHandling = value; } } public ConstructorHandling ConstructorHandling { get { return _constructorHandling ?? ConstructorHandling.Default; } set { _constructorHandling = value; } } public IContractResolver ContractResolver { get; set; } public IEqualityComparer EqualityComparer { get; set; } [Obsolete("ReferenceResolver property is obsolete. Use the ReferenceResolverProvider property to set the IReferenceResolver: settings.ReferenceResolverProvider = () => resolver")] public IReferenceResolver ReferenceResolver { get { return ReferenceResolverProvider?.Invoke(); } set { ReferenceResolverProvider = ((value != null) ? ((Func<IReferenceResolver>)(() => value)) : null); } } public Func<IReferenceResolver> ReferenceResolverProvider { get; set; } public ITraceWriter TraceWriter { get; set; } [Obsolete("Binder is obsolete. Use SerializationBinder instead.")] public SerializationBinder Binder { get { if (SerializationBinder == null) { return null; } if (SerializationBinder is SerializationBinderAdapter serializationBinderAdapter) { return serializationBinderAdapter.SerializationBinder; } throw new InvalidOperationException("Cannot get SerializationBinder because an ISerializationBinder was previously set."); } set { SerializationBinder = ((value == null) ? null : new SerializationBinderAdapter(value)); } } public ISerializationBinder SerializationBinder { get; set; } public EventHandler<Newtonsoft.Json.Serialization.ErrorEventArgs> Error { get; set; } public StreamingContext Context { get { return _context ?? DefaultContext; } set { _context = value; } } public string DateFormatString { get { return _dateFormatString ?? "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"; } set { _dateFormatString = value; _dateFor