Decompiled source of PeakChatOps v1.2.3

plugins/com.github.LIghtJUNction.PeakChatOps.dll

Decompiled 2 weeks ago
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Cryptography;
using System.Security.Permissions;
using System.Text;
using System.Threading;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using Cysharp.Threading.Tasks;
using Cysharp.Threading.Tasks.CompilerServices;
using ExitGames.Client.Photon;
using HarmonyLib;
using HarmonyLib.Tools;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using PEAKLib.Core;
using PeakChatOps.API;
using PeakChatOps.API.AI;
using PeakChatOps.API.AI.Apis;
using PeakChatOps.Commands;
using PeakChatOps.Core;
using PeakChatOps.Core.MsgChain;
using PeakChatOps.Core.MsgChain.Handle;
using PeakChatOps.Patches;
using PeakChatOps.UI;
using PeakChatOps.core;
using Photon.Pun;
using Photon.Realtime;
using Steamworks;
using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.TextCore;
using UnityEngine.UIElements;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("com.github.LIghtJUNction.PeakChatOps")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.2.3.0")]
[assembly: AssemblyInformationalVersion("1.2.3+5b6d2c4367f20c4671fd5319b09ae8adc15d761e")]
[assembly: AssemblyProduct("com.github.LIghtJUNction.PeakChatOps")]
[assembly: AssemblyTitle("PeakChatOps")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.2.3.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.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[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 BepInEx
{
	[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
	[Conditional("CodeGeneration")]
	internal sealed class BepInAutoPluginAttribute : Attribute
	{
		public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
		{
		}
	}
}
namespace BepInEx.Preloader.Core.Patching
{
	[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
	[Conditional("CodeGeneration")]
	internal sealed class PatcherAutoPluginAttribute : Attribute
	{
		public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
		{
		}
	}
}
namespace PeakChatOps
{
	public class PConfig
	{
		private static readonly string ApiKeyFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "PeakChatOps");

		private static readonly string ApiKeyFilePath = Path.Combine(ApiKeyFolder, "api_keys.dat");

		private static readonly Dictionary<string, string> _keyCache = new Dictionary<string, string>();

		public ConfigEntry<KeyCode> Key;

		public ConfigEntry<UIAlignment> Pos;

		public ConfigEntry<string> CmdPrefix;

		public ConfigEntry<string> DeathMessage;

		public ConfigEntry<string> ReviveMessage;

		public ConfigEntry<string> PassOutMessage;

		public ConfigEntry<string> AiModel;

		public ConfigEntry<string> AiApiKey;

		public ConfigEntry<string> AiEndpoint;

		public ConfigEntry<int> AiContextMaxCount;

		public ConfigEntry<bool> AiAutoTranslate;

		public ConfigEntry<string> PromptTranslate;

		public ConfigEntry<string> PromptSend;

		public ConfigEntry<int> AiMaxTokens;

		public ConfigEntry<float> AiTemperature;

		public ConfigEntry<float> AiTopP;

		public ConfigEntry<int> AiN;

		public ConfigEntry<bool> AiShowResponse;

		public PConfig(ConfigFile config)
		{
			Key = config.Bind<KeyCode>("Display", "ChatKey", (KeyCode)121, PLocalizedText.GetText("CHAT_KEY_DESCRIPTION"));
			Pos = config.Bind<UIAlignment>("Display", "ChatPosition", UIAlignment.TopLeft, PLocalizedText.GetText("CHAT_POSITION_DESCRIPTION"));
			CmdPrefix = config.Bind<string>("Commands", "CommandPrefix", "/", PLocalizedText.GetText("COMMAND_PREFIX_DESCRIPTION"));
			DeathMessage = config.Bind<string>("preset", "DeathMessage", PLocalizedText.GetText("DEATH_MESSAGE"), PLocalizedText.GetText("DEATH_MESSAGE_DESCRIPTION"));
			ReviveMessage = config.Bind<string>("preset", "ReviveMessage", PLocalizedText.GetText("REVIVE_MESSAGE"), PLocalizedText.GetText("REVIVE_MESSAGE_DESCRIPTION"));
			PassOutMessage = config.Bind<string>("preset", "PassOutMessage", PLocalizedText.GetText("PASS_OUT_MESSAGE"), PLocalizedText.GetText("PASS_OUT_MESSAGE_DESCRIPTION"));
			AiModel = config.Bind<string>("AI", "Model", "gpt-oss:120b-cloud", PLocalizedText.GetText("AI_MODEL_DESCRIPTION"));
			string text = LoadApiKeyFromFile();
			AiApiKey = config.Bind<string>("AI", "ApiKey", text, PLocalizedText.GetText("AI_APIKEY_DESCRIPTION"));
			AiApiKey.SettingChanged += delegate
			{
				SaveApiKeyToFile(AiApiKey.Value);
			};
			AiEndpoint = config.Bind<string>("AI", "Endpoint", "http://localhost:11434/v1", PLocalizedText.GetText("AI_ENDPOINT_DESCRIPTION"));
			AiContextMaxCount = config.Bind<int>("AI", "ContextMaxCount", 30, PLocalizedText.GetText("AI_CONTEXT_MAX_COUNT_DESCRIPTION"));
			AiShowResponse = config.Bind<bool>("AI", "ShowResponse", true, PLocalizedText.GetText("AI_SHOW_RESPONSE_DESCRIPTION"));
			AiAutoTranslate = config.Bind<bool>("AI", "AutoTranslate", false, PLocalizedText.GetText("AI_AUTOTRANSLATE_DESCRIPTION"));
			PromptTranslate = config.Bind<string>("prompt", "Prompt_Translate", PLocalizedText.GetText("TRANSLATE_PROMPT"), PLocalizedText.GetText("PROMPT_TRANSLATE_DESCRIPTION"));
			PromptSend = config.Bind<string>("prompt", "Prompt_Send", PLocalizedText.GetText("PROMPT_SEND"), PLocalizedText.GetText("PROMPT_SEND_DESCRIPTION"));
		}

		private static string ComputeHash(string input)
		{
			if (string.IsNullOrEmpty(input))
			{
				return string.Empty;
			}
			using SHA256 sHA = SHA256.Create();
			byte[] array = sHA.ComputeHash(Encoding.UTF8.GetBytes(input));
			return BitConverter.ToString(array).Replace("-", "").Substring(0, 16);
		}

		private static void LoadApiKeysFromFile()
		{
			_keyCache.Clear();
			try
			{
				if (!File.Exists(ApiKeyFilePath))
				{
					return;
				}
				string[] array = File.ReadAllLines(ApiKeyFilePath);
				string[] array2 = array;
				foreach (string text in array2)
				{
					string[] array3 = text.Split(new char[1] { '=' }, 2);
					if (array3.Length == 2)
					{
						string key = array3[0].Trim();
						string value = array3[1].Trim();
						_keyCache[key] = value;
					}
				}
				Debug.Log((object)$"[PeakChatOps] Loaded {_keyCache.Count} API key(s) from: {ApiKeyFilePath}");
			}
			catch (Exception ex)
			{
				Debug.LogWarning((object)("[PeakChatOps] Failed to load API keys from file: " + ex.Message));
			}
		}

		private static string LoadApiKeyFromFile()
		{
			LoadApiKeysFromFile();
			if (_keyCache.Count > 0)
			{
				string input = _keyCache.Values.First();
				string text = ComputeHash(input);
				Debug.Log((object)("[PeakChatOps] Using API Key with hash: " + text));
				return text;
			}
			return "ollama";
		}

		private static void SaveApiKeyToFile(string input)
		{
			try
			{
				if (IsHashValue(input))
				{
					Debug.Log((object)("[PeakChatOps] Input is already a hash: " + input));
					return;
				}
				string text = ComputeHash(input);
				_keyCache[text] = input;
				if (!Directory.Exists(ApiKeyFolder))
				{
					Directory.CreateDirectory(ApiKeyFolder);
				}
				IEnumerable<string> contents = _keyCache.Select((KeyValuePair<string, string> kvp) => kvp.Key + "=" + kvp.Value);
				File.WriteAllLines(ApiKeyFilePath, contents);
				Debug.Log((object)("[PeakChatOps] API Key saved with hash: " + text + " -> " + ApiKeyFilePath));
				if (PeakChatOpsPlugin.config != null && PeakChatOpsPlugin.config.AiApiKey != null && PeakChatOpsPlugin.config.AiApiKey.Value != text)
				{
					PeakChatOpsPlugin.config.AiApiKey.Value = text;
				}
			}
			catch (Exception ex)
			{
				Debug.LogError((object)("[PeakChatOps] Failed to save API Key: " + ex.Message));
			}
		}

		private static bool IsHashValue(string input)
		{
			if (string.IsNullOrEmpty(input) || input.Length != 16)
			{
				return false;
			}
			return input.All((char c) => (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'));
		}

		public static string GetActualApiKey(string hashOrKey)
		{
			if (string.IsNullOrEmpty(hashOrKey))
			{
				return "ollama";
			}
			if (IsHashValue(hashOrKey) && _keyCache.ContainsKey(hashOrKey))
			{
				return _keyCache[hashOrKey];
			}
			return hashOrKey;
		}
	}
	public enum UIAlignment
	{
		TopLeft,
		TopRight,
		Center
	}
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("com.github.LIghtJUNction.PeakChatOps", "PeakChatOps", "1.2.3")]
	internal class PeakChatOpsPlugin : BaseUnityPlugin
	{
		public static readonly string PluginPath = Path.Combine(Paths.PluginPath, "PeakChatOps");

		internal static ManualLogSource Logger = null;

		private Harmony _harmony;

		public static PConfig config = null;

		public static GameObject PeakChatOpsUIPrefab = null;

		private static TMP_FontAsset? _darumaFontAsset;

		public const string Id = "com.github.LIghtJUNction.PeakChatOps";

		public static PeakChatOpsPlugin Instance { get; private set; } = null;


		public static TMP_FontAsset? DarumaDropOneFont
		{
			get
			{
				if ((Object)(object)_darumaFontAsset == (Object)null)
				{
					TMP_FontAsset[] source = Resources.FindObjectsOfTypeAll<TMP_FontAsset>();
					_darumaFontAsset = ((IEnumerable<TMP_FontAsset>)source).FirstOrDefault((Func<TMP_FontAsset, bool>)delegate(TMP_FontAsset fontAsset)
					{
						//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)
						FaceInfo faceInfo = ((TMP_Asset)fontAsset).faceInfo;
						return ((FaceInfo)(ref faceInfo)).familyName == "Daruma Drop One";
					});
				}
				return _darumaFontAsset;
			}
		}

		public static string Name => "PeakChatOps";

		public static string Version => "1.2.3";

		private void Awake()
		{
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Expected O, but got Unknown
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d0: Expected O, but got Unknown
			Logger = ((BaseUnityPlugin)this).Logger;
			Instance = this;
			Logger.LogInfo((object)"PeakChatOps is loaded!");
			BundleLoader.LoadBundleWithName((BaseUnityPlugin)(object)this, "PeakChatOpsUI.peakbundle", (Action<PeakBundle>)delegate(PeakBundle peakBundle)
			{
				PeakChatOpsUIPrefab = peakBundle.LoadAsset<GameObject>("Assets/MOD/PeakChatOpsUI.prefab");
			});
			_harmony = new Harmony("com.lightjunction.peakchatops");
			_harmony.PatchAll(typeof(GUIManagerPatch));
			_harmony.PatchAll(typeof(CharacterStatsPatches));
			_harmony.PatchAll(typeof(InputBlockingPatches));
			PLocalizedText.Init();
			PeakChatOpsUI.Help();
			config = new PConfig(((BaseUnityPlugin)this).Config);
			if ((Object)(object)GameObject.Find("ChatSystem") == (Object)null)
			{
				GameObject val = new GameObject("ChatSystem");
				val.AddComponent<ChatSystem>();
				Object.DontDestroyOnLoad((Object)(object)val);
				Logger.LogInfo((object)"[PeakChatOps] ChatSystem GameObject created and initialized.");
			}
			AIChatContextLogger.CreateGlobalInstance(config.AiContextMaxCount.Value);
			AIChatContextLogger.Instance?.LogSystem(PLocalizedText.GetText("AI_CONTEXT_PEAK_WORLD_PROMPT_SYSTEM"), "System", "system", pinned: true);
			try
			{
				CentralCmdRouter.EnsureInitialized();
				Logger.LogDebug((object)"[PeakChatOps] CentralCmdRouter.EnsureInitialized called");
			}
			catch (Exception ex)
			{
				Logger.LogError((object)("[PeakChatOps] Error ensuring MsgHandlerChain initialization: " + ex.Message));
			}
		}

		private void OnDestroy()
		{
			_harmony.UnpatchSelf();
			Logger.LogInfo((object)"PeakChatOps is unloaded!");
		}
	}
}
namespace PeakChatOps.UI
{
	public class PeakChatOpsUI : MonoBehaviour
	{
		public static UIDocument uIDocument;

		public bool isBlockingInput;

		private TextField messageInputField;

		public static List<string> messages = new List<string>();

		public static PeakChatOpsUI Instance { get; private set; }

		private void Start()
		{
			if ((Object)(object)Instance != (Object)null)
			{
				Object.Destroy((Object)(object)this);
			}
			else
			{
				Instance = this;
			}
		}

		public void BindUIEvents(GameObject uiGO)
		{
			//IL_0100: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)uiGO == (Object)null)
			{
				return;
			}
			uIDocument = uiGO.GetComponent<UIDocument>();
			if (!((Object)(object)uIDocument == (Object)null))
			{
				VisualElement rootVisualElement = uIDocument.rootVisualElement;
				Button val = UQueryExtensions.Q<Button>(rootVisualElement, "send-button", (string)null);
				if (val != null)
				{
					val.clicked += OnSendMessage;
				}
				Button val2 = UQueryExtensions.Q<Button>(rootVisualElement, "close-button", (string)null);
				if (val2 != null)
				{
					val2.clicked += HideNow;
				}
				Button val3 = UQueryExtensions.Q<Button>(rootVisualElement, "minimize-button", (string)null);
				if (val3 != null)
				{
					val3.clicked += MinimizeUI;
				}
				Button val4 = UQueryExtensions.Q<Button>(rootVisualElement, "maximize-button", (string)null);
				if (val4 != null)
				{
					val4.clicked += MaximizeUI;
				}
				messageInputField = UQueryExtensions.Q<TextField>(rootVisualElement, "message-input", (string)null);
				_ = messageInputField;
				ListView val5 = UQueryExtensions.Q<ListView>(rootVisualElement, "message-list", (string)null);
				if (val5 != null)
				{
					((BaseVerticalCollectionView)val5).virtualizationMethod = (CollectionVirtualizationMethod)1;
					((BaseVerticalCollectionView)val5).selectionType = (SelectionType)0;
					((VisualElement)val5).style.flexGrow = StyleFloat.op_Implicit(1f);
					messages.Clear();
					messages.Add(PLocalizedText.GetText("PEAKCHATOPSWELCOME"));
					((BaseVerticalCollectionView)val5).itemsSource = messages;
					val5.makeItem = MakeItem();
					val5.bindItem = BindItem();
				}
				VisualElement val6 = UQueryExtensions.Q(rootVisualElement, "chat-panel", (string)null);
				if (val6 != null)
				{
					val6.RemoveFromClassList("pos-topleft");
					val6.RemoveFromClassList("pos-topright");
					val6.RemoveFromClassList("pos-center");
				}
				switch (PeakChatOpsPlugin.config?.Pos.Value ?? UIAlignment.TopLeft)
				{
				case UIAlignment.TopLeft:
					OnTopLeft();
					break;
				case UIAlignment.TopRight:
					OnTopRight();
					break;
				case UIAlignment.Center:
					OnCenter();
					break;
				default:
					OnTopLeft();
					break;
				}
			}
		}

		private void Update()
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			if (!isBlockingInput)
			{
				if (PeakChatOpsPlugin.config?.Key != null && Input.GetKeyDown(PeakChatOpsPlugin.config.Key.Value))
				{
					EnterInputMode();
				}
			}
			else if (Input.GetKeyDown((KeyCode)13) || Input.GetKeyDown((KeyCode)271))
			{
				OnSendMessage();
			}
			else if (Input.GetKeyDown((KeyCode)27))
			{
				ExitInputMode();
			}
		}

		private void EnterInputMode()
		{
			if (!isBlockingInput)
			{
				isBlockingInput = true;
				ShowNow();
				if (messageInputField != null)
				{
					((Focusable)messageInputField).Focus();
				}
			}
		}

		private void ExitInputMode()
		{
			if (!isBlockingInput)
			{
				return;
			}
			if (messageInputField != null)
			{
				((Focusable)messageInputField).Blur();
			}
			if ((Object)(object)uIDocument != (Object)null)
			{
				VisualElement rootVisualElement = uIDocument.rootVisualElement;
				ListView val = UQueryExtensions.Q<ListView>(rootVisualElement, "message-list", (string)null);
				if (val != null)
				{
					((BaseVerticalCollectionView)val).ClearSelection();
				}
			}
			isBlockingInput = false;
		}

		private async void OnSendMessage()
		{
			if ((Object)(object)uIDocument == (Object)null)
			{
				return;
			}
			VisualElement rootVisualElement = uIDocument.rootVisualElement;
			TextField val = UQueryExtensions.Q<TextField>(rootVisualElement, "message-input", (string)null);
			if (val == null || string.IsNullOrWhiteSpace(((BaseField<string>)(object)val).value))
			{
				return;
			}
			string value = ((BaseField<string>)(object)val).value;
			((BaseField<string>)(object)val).value = "";
			ExitInputMode();
			if (!((Object)(object)ChatSystem.Instance != (Object)null))
			{
				return;
			}
			try
			{
				await ChatSystem.Instance.SendChatMessageAsync(value, null);
			}
			catch (Exception)
			{
			}
		}

		public void OnTopLeft()
		{
			UIDocument obj = uIDocument;
			object obj2;
			if (obj == null)
			{
				obj2 = null;
			}
			else
			{
				VisualElement rootVisualElement = obj.rootVisualElement;
				obj2 = ((rootVisualElement != null) ? UQueryExtensions.Q(rootVisualElement, "chat-panel", (string)null) : null);
			}
			VisualElement val = (VisualElement)obj2;
			if (val != null)
			{
				val.RemoveFromClassList("pos-topright");
				val.RemoveFromClassList("pos-center");
				val.AddToClassList("pos-topleft");
			}
		}

		public void OnTopRight()
		{
			UIDocument obj = uIDocument;
			object obj2;
			if (obj == null)
			{
				obj2 = null;
			}
			else
			{
				VisualElement rootVisualElement = obj.rootVisualElement;
				obj2 = ((rootVisualElement != null) ? UQueryExtensions.Q(rootVisualElement, "chat-panel", (string)null) : null);
			}
			VisualElement val = (VisualElement)obj2;
			if (val != null)
			{
				val.RemoveFromClassList("pos-topleft");
				val.RemoveFromClassList("pos-center");
				val.AddToClassList("pos-topright");
			}
		}

		public void OnCenter()
		{
			UIDocument obj = uIDocument;
			object obj2;
			if (obj == null)
			{
				obj2 = null;
			}
			else
			{
				VisualElement rootVisualElement = obj.rootVisualElement;
				obj2 = ((rootVisualElement != null) ? UQueryExtensions.Q(rootVisualElement, "chat-panel", (string)null) : null);
			}
			VisualElement val = (VisualElement)obj2;
			if (val != null)
			{
				val.RemoveFromClassList("pos-topright");
				val.RemoveFromClassList("pos-topleft");
				val.AddToClassList("pos-center");
			}
		}

		public void AddMessage(string sender, string content)
		{
			if ((Object)(object)uIDocument == (Object)null)
			{
				return;
			}
			VisualElement rootVisualElement = uIDocument.rootVisualElement;
			ListView messageListView = UQueryExtensions.Q<ListView>(rootVisualElement, "message-list", (string)null);
			if (messageListView == null)
			{
				return;
			}
			string item = (string.IsNullOrEmpty(sender) ? content : ("[" + sender + "] " + content));
			messages.Add(item);
			((BaseVerticalCollectionView)messageListView).Rebuild();
			if (messages.Count > 0)
			{
				((VisualElement)messageListView).schedule.Execute((Action)delegate
				{
					((BaseVerticalCollectionView)messageListView).ScrollToItem(messages.Count - 1);
				}).StartingIn(50L);
			}
		}

		public void RefreshUI()
		{
			UIDocument obj = uIDocument;
			if (obj != null)
			{
				VisualElement rootVisualElement = obj.rootVisualElement;
				if (rootVisualElement != null)
				{
					rootVisualElement.Clear();
				}
			}
		}

		public void HideNow()
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)uIDocument != (Object)null)
			{
				uIDocument.rootVisualElement.style.display = StyleEnum<DisplayStyle>.op_Implicit((DisplayStyle)1);
				ExitInputMode();
			}
		}

		public void ShowNow()
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)uIDocument != (Object)null)
			{
				uIDocument.rootVisualElement.style.display = StyleEnum<DisplayStyle>.op_Implicit((DisplayStyle)0);
				EnterInputMode();
			}
		}

		private void MinimizeUI()
		{
			UIDocument obj = uIDocument;
			object obj2;
			if (obj == null)
			{
				obj2 = null;
			}
			else
			{
				VisualElement rootVisualElement = obj.rootVisualElement;
				obj2 = ((rootVisualElement != null) ? UQueryExtensions.Q<VisualElement>(rootVisualElement, "chat-panel", (string)null) : null);
			}
			VisualElement val = (VisualElement)obj2;
			if (val != null)
			{
				bool flag = val.ClassListContains("minimized");
				val.RemoveFromClassList("minimized");
				val.RemoveFromClassList("maximized");
				if (!flag)
				{
					val.AddToClassList("minimized");
				}
				ExitInputMode();
			}
		}

		private void MaximizeUI()
		{
			UIDocument obj = uIDocument;
			object obj2;
			if (obj == null)
			{
				obj2 = null;
			}
			else
			{
				VisualElement rootVisualElement = obj.rootVisualElement;
				obj2 = ((rootVisualElement != null) ? UQueryExtensions.Q<VisualElement>(rootVisualElement, "chat-panel", (string)null) : null);
			}
			VisualElement val = (VisualElement)obj2;
			if (val != null)
			{
				bool flag = val.ClassListContains("maximized");
				val.RemoveFromClassList("minimized");
				val.RemoveFromClassList("maximized");
				if (!flag)
				{
					val.AddToClassList("maximized");
				}
				EnterInputMode();
			}
		}

		public static void Help()
		{
			PeakChatOpsPlugin.Logger.LogInfo((object)("Localization test: '" + PLocalizedText.GetText("PEAKCHATOPSWELCOME") + "'"));
		}

		private Func<VisualElement> MakeItem()
		{
			return () => (VisualElement)(object)new MessageLabel();
		}

		private Action<VisualElement, int> BindItem()
		{
			return delegate(VisualElement element, int i)
			{
				Label val = (Label)(object)((element is Label) ? element : null);
				if (val != null)
				{
					if (i >= 0 && i < messages.Count)
					{
						((TextElement)val).text = messages[i];
					}
					else
					{
						((TextElement)val).text = string.Empty;
					}
				}
			};
		}
	}
	public class MessageLabel : Label
	{
		public MessageLabel()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			((VisualElement)this).AddToClassList("message-item");
			((TextElement)this).selection.isSelectable = true;
			((VisualElement)this).style.whiteSpace = StyleEnum<WhiteSpace>.op_Implicit((WhiteSpace)0);
			((VisualElement)this).style.flexShrink = StyleFloat.op_Implicit(0f);
			((VisualElement)this).style.flexGrow = StyleFloat.op_Implicit(1f);
			((VisualElement)this).style.paddingLeft = StyleLength.op_Implicit(8f);
			((VisualElement)this).style.paddingRight = StyleLength.op_Implicit(8f);
			((VisualElement)this).style.paddingTop = StyleLength.op_Implicit(4f);
			((VisualElement)this).style.paddingBottom = StyleLength.op_Implicit(4f);
			((VisualElement)this).style.marginTop = StyleLength.op_Implicit(1f);
			((VisualElement)this).style.marginBottom = StyleLength.op_Implicit(1f);
			((VisualElement)this).style.unityTextAlign = StyleEnum<TextAnchor>.op_Implicit((TextAnchor)0);
			((VisualElement)this).style.color = StyleColor.op_Implicit(new Color(0.9f, 0.9f, 0.9f, 1f));
		}
	}
}
namespace PeakChatOps.Patches
{
	[HarmonyPatch(typeof(CharacterStats))]
	public class CharacterStatsPatches
	{
		private class CharacterStateInfo
		{
			public bool died { get; set; }

			public bool revived { get; set; }

			public bool passedOut { get; set; }
		}

		private static readonly Dictionary<CharacterStats, (bool died, bool revived, bool passedOut)> lastStates;

		private static Dictionary<string, object> CreateExtraForEvent(CharacterStateInfo info)
		{
			return new Dictionary<string, object> { ["CharacterState"] = new Dictionary<string, bool>
			{
				["died"] = info?.died ?? false,
				["revived"] = info?.revived ?? false,
				["passedOut"] = info?.passedOut ?? false
			} };
		}

		static CharacterStatsPatches()
		{
			lastStates = new Dictionary<CharacterStats, (bool, bool, bool)>();
			PeakChatOpsPlugin.Logger.LogWarning((object)"[Harmony] CharacterStatsPatches static ctor loaded!");
		}

		[HarmonyPatch("Record", new Type[]
		{
			typeof(bool),
			typeof(float)
		})]
		[HarmonyPostfix]
		public static void RecordPostfix(CharacterStats __instance, bool useOverridePosition, float overrideHeight)
		{
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0201: Unknown result type (might be due to invalid IL or missing references)
			//IL_0208: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_014e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cb: Unknown result type (might be due to invalid IL or missing references)
			string name = ((Object)__instance).name;
			string userId = PhotonNetwork.LocalPlayer.UserId;
			bool flag = ((Object)__instance).name.Contains(PhotonNetwork.LocalPlayer.NickName);
			List<TimelineInfo> timelineInfo = __instance.timelineInfo;
			if (timelineInfo == null || timelineInfo.Count == 0)
			{
				return;
			}
			TimelineInfo val = timelineInfo[timelineInfo.Count - 1];
			bool flag2 = false;
			bool flag3 = false;
			bool flag4 = false;
			lastStates.TryGetValue(__instance, out (bool, bool, bool) value);
			(flag2, flag3, flag4) = value;
			if (val.died && !flag2)
			{
				if (flag)
				{
					EventBusRegistry.ChatMessageBus.Publish("sander://self", new ChatMessageEvent(PhotonNetwork.LocalPlayer.NickName, PeakChatOpsPlugin.config.DeathMessage.Value, PhotonNetwork.LocalPlayer.UserId, isDead: true, CreateExtraForEvent(new CharacterStateInfo
					{
						died = true
					})));
				}
				AIChatContextLogger.Instance?.LogSystem("玩家[" + name + "]死亡", name, userId);
			}
			if (val.revived && !flag3)
			{
				if (flag)
				{
					EventBusRegistry.ChatMessageBus.Publish("sander://self", new ChatMessageEvent(PhotonNetwork.LocalPlayer.NickName, PeakChatOpsPlugin.config.ReviveMessage.Value, PhotonNetwork.LocalPlayer.UserId, isDead: false, CreateExtraForEvent(new CharacterStateInfo
					{
						revived = true
					})));
				}
				AIChatContextLogger.Instance?.LogSystem("玩家[" + name + "]复活", name, userId);
			}
			if (val.justPassedOut && !flag4)
			{
				if (flag)
				{
					EventBusRegistry.ChatMessageBus.Publish("sander://self", new ChatMessageEvent(PhotonNetwork.LocalPlayer.NickName, PeakChatOpsPlugin.config.PassOutMessage.Value, PhotonNetwork.LocalPlayer.UserId, isDead: false, CreateExtraForEvent(new CharacterStateInfo
					{
						passedOut = true
					})));
				}
				AIChatContextLogger.Instance?.LogSystem("玩家[" + name + "]晕厥", name, userId);
			}
			lastStates[__instance] = (val.died, val.revived, val.justPassedOut);
		}
	}
	[HarmonyPatch(typeof(GUIManager))]
	public static class GUIManagerPatch
	{
		public static GameObject PeakChatOpsUIGO;

		public static PeakChatOpsUI PeakChatOpsUIInstance;

		[HarmonyPatch("Start")]
		[HarmonyPostfix]
		public static void StartPostfix(GUIManager __instance)
		{
			try
			{
				Transform transform = ((Component)__instance).transform;
				if ((Object)(object)PeakChatOpsPlugin.PeakChatOpsUIPrefab != (Object)null)
				{
					PeakChatOpsUIGO = Object.Instantiate<GameObject>(PeakChatOpsPlugin.PeakChatOpsUIPrefab, transform);
					((Object)PeakChatOpsUIGO).name = "PeakChatOpsUI";
					PeakChatOpsUIInstance = PeakChatOpsUIGO.GetComponent<PeakChatOpsUI>();
					if ((Object)(object)PeakChatOpsUIInstance == (Object)null)
					{
						PeakChatOpsUIInstance = PeakChatOpsUIGO.AddComponent<PeakChatOpsUI>();
					}
					PeakChatOpsUIInstance.BindUIEvents(PeakChatOpsUIGO);
				}
			}
			catch (Exception)
			{
			}
		}
	}
	public static class InputBlockingPatches
	{
		private static readonly MethodInfo windowBlockingInput = AccessTools.PropertySetter(typeof(GUIManager), "windowBlockingInput");

		[HarmonyPatch(typeof(GUIManager), "UpdateWindowStatus")]
		[HarmonyPostfix]
		public static void UpdateWindowStatusPatch(GUIManager __instance)
		{
			PeakChatOpsUI instance = PeakChatOpsUI.Instance;
			if (instance != null && instance.isBlockingInput)
			{
				windowBlockingInput?.Invoke(__instance, new object[1] { true });
				__instance.windowShowingCursor = true;
			}
		}

		[HarmonyPatch(typeof(CinemaCamera), "Update")]
		[HarmonyPrefix]
		public static bool UpdateCinemaCamPatch(CinemaCamera __instance)
		{
			GUIManager instance = GUIManager.instance;
			if (instance != null && instance.windowBlockingInput && !__instance.on)
			{
				return false;
			}
			return true;
		}

		[HarmonyPatch(typeof(Character), "UpdateVariablesFixed")]
		[HarmonyPrefix]
		public static bool UpdateCharacterVariablesPatch(Character __instance)
		{
			GUIManager instance = GUIManager.instance;
			if (instance != null && instance.windowBlockingInput)
			{
				__instance.input.interactIsPressed = false;
			}
			return true;
		}

		[HarmonyPatch(/*Could not decode attribute arguments.*/)]
		[HarmonyPrefix]
		public static bool InputStringPatch(ref string __result)
		{
			GUIManager instance = GUIManager.instance;
			if (instance != null)
			{
				_ = instance.windowBlockingInput;
			}
			else
				_ = 0;
			return true;
		}
	}
}
namespace PeakChatOps.core
{
	public static class PLocalizedText
	{
		private static Dictionary<string, string> _textTable = new Dictionary<string, string>();

		private static int _currentLangIndex = -1;

		private static bool _initialized;

		public static void Init()
		{
			if (_initialized)
			{
				PeakChatOpsPlugin.Logger.LogWarning((object)"[PLocalizedText] Already initialized, skipping.");
				return;
			}
			string text = Path.Combine(PeakChatOpsPlugin.PluginPath, "Localization.csv");
			if (!File.Exists(text))
			{
				PeakChatOpsPlugin.Logger.LogError((object)("[PLocalizedText] CSV file not found: " + text));
				_initialized = true;
				return;
			}
			try
			{
				LoadLocalizationCsv(text);
				_initialized = true;
				PeakChatOpsPlugin.Logger.LogInfo((object)$"[PLocalizedText] Loaded {_textTable.Count} localization entries for language index {_currentLangIndex}");
			}
			catch (Exception ex)
			{
				PeakChatOpsPlugin.Logger.LogError((object)("[PLocalizedText] Failed to load CSV: " + ex.Message));
			}
		}

		private static void LoadLocalizationCsv(string csvPath)
		{
			string[] array = File.ReadAllLines(csvPath);
			if (array.Length == 0)
			{
				PeakChatOpsPlugin.Logger.LogWarning((object)"[PLocalizedText] CSV file is empty.");
				return;
			}
			List<string> list = ParseCsvLine(array[0]);
			_currentLangIndex = GetCurrentLanguageIndex(list);
			if (_currentLangIndex < 0 || _currentLangIndex >= list.Count)
			{
				PeakChatOpsPlugin.Logger.LogWarning((object)$"[PLocalizedText] Invalid language index: {_currentLangIndex}, defaulting to 0 (English)");
				_currentLangIndex = 0;
			}
			for (int i = 1; i < array.Length; i++)
			{
				List<string> list2 = ParseCsvLine(array[i]);
				if (list2.Count <= _currentLangIndex)
				{
					PeakChatOpsPlugin.Logger.LogWarning((object)$"[PLocalizedText] Line {i + 1} has insufficient columns, skipping.");
					continue;
				}
				string text = list2[0];
				string value = list2[_currentLangIndex];
				if (!string.IsNullOrEmpty(text) && text != "ENDLINE")
				{
					_textTable[text] = value;
				}
			}
		}

		private static int GetCurrentLanguageIndex(List<string> header)
		{
			string text;
			try
			{
				text = LocalizedText.GetText("CURRENT_LANGUAGE", true);
			}
			catch
			{
				PeakChatOpsPlugin.Logger.LogWarning((object)"[PLocalizedText] Could not get current language from game, defaulting to English");
				return 1;
			}
			for (int i = 0; i < header.Count; i++)
			{
				if (header[i].Equals(text, StringComparison.OrdinalIgnoreCase))
				{
					return i;
				}
			}
			if (text.Contains("中文") || text.Contains("Chinese"))
			{
				for (int j = 0; j < header.Count; j++)
				{
					if (header[j].Contains("简体中文") || header[j].Contains("Chinese"))
					{
						return j;
					}
				}
			}
			PeakChatOpsPlugin.Logger.LogWarning((object)("[PLocalizedText] Language '" + text + "' not found in header, defaulting to English"));
			return 1;
		}

		private static List<string> ParseCsvLine(string line)
		{
			List<string> list = new List<string>();
			bool flag = false;
			StringBuilder stringBuilder = new StringBuilder();
			foreach (char c in line)
			{
				switch (c)
				{
				case '"':
					flag = !flag;
					continue;
				case ',':
					if (!flag)
					{
						list.Add(stringBuilder.ToString());
						stringBuilder.Clear();
						continue;
					}
					break;
				}
				stringBuilder.Append(c);
			}
			list.Add(stringBuilder.ToString());
			return list;
		}

		public static string GetText(string key, string? fallback = null)
		{
			if (!_initialized)
			{
				PeakChatOpsPlugin.Logger.LogWarning((object)"[PLocalizedText] Not initialized yet, returning key as-is");
				return fallback ?? key;
			}
			if (_textTable.TryGetValue(key, out string value))
			{
				return value;
			}
			PeakChatOpsPlugin.Logger.LogWarning((object)("[PLocalizedText] Key '" + key + "' not found in localization table"));
			return fallback ?? key;
		}

		public static bool HasKey(string key)
		{
			return _textTable.ContainsKey(key);
		}

		public static IEnumerable<string> GetAllKeys()
		{
			return _textTable.Keys;
		}

		public static void Reload()
		{
			_initialized = false;
			_textTable.Clear();
			Init();
		}
	}
}
namespace PeakChatOps.Core
{
	public class AIChatContextLogger
	{
		private sealed class MessageEntry
		{
			public AIChatMessageEvent Message { get; }

			public Dictionary<string, object> Payload { get; }

			public bool IsPinned { get; }

			public MessageEntry(AIChatMessageEvent message, Dictionary<string, object> payload, bool isPinned)
			{
				Message = message;
				Payload = payload;
				IsPinned = isPinned;
			}
		}

		private readonly LinkedList<MessageEntry> _history = new LinkedList<MessageEntry>();

		private readonly List<MessageEntry> _messages = new List<MessageEntry>();

		private int _maxHistory;

		private int _nonPinnedCount;

		public static AIChatContextLogger? Instance { get; private set; }

		public void ExportHistoryToFile(string filePath)
		{
			try
			{
				List<string> list = new List<string>();
				foreach (MessageEntry item in _history)
				{
					AIChatMessageEvent message = item.Message;
					string text = (item.IsPinned ? " [PINNED]" : "");
					list.Add($"[{message.Role}] {message.Sender}({message.UserId}): {message.Message}{text}");
				}
				File.WriteAllLines(filePath, list);
			}
			catch (Exception ex)
			{
				PeakChatOpsPlugin.Logger.LogError((object)("[AIContext] 导出聊天记录到文件失败: " + filePath + ",错误信息: " + ex.Message));
			}
		}

		public void LogSystem(string message, string sender = "system", string userId = "system", bool pinned = false)
		{
			Add(new AIChatMessageEvent(sender, message, userId, AIChatRole.system), pinned);
		}

		public void LogUser(string message, string sender = "PlayerName", string userId = "uuid-user", bool pinned = false)
		{
			Add(new AIChatMessageEvent(sender, message, userId), pinned);
		}

		public void LogAssistant(string message, string sender = "ModelName", string userId = "assistant", bool pinned = false)
		{
			Add(new AIChatMessageEvent(sender, message, userId, AIChatRole.assistant), pinned);
		}

		public static void CreateGlobalInstance(int maxHistory = 30)
		{
			Instance = new AIChatContextLogger(maxHistory);
		}

		public AIChatContextLogger(int maxHistory = 30)
		{
			_maxHistory = ((maxHistory > 0) ? maxHistory : 30);
		}

		public void SyncMaxHistoryFromConfig()
		{
			int num = 30;
			try
			{
				num = PeakChatOpsPlugin.config.AiContextMaxCount?.Value ?? 30;
			}
			catch (Exception ex)
			{
				PeakChatOpsPlugin.Logger.LogDebug((object)("[AIContext] SyncMaxHistoryFromConfig failed to read config: " + ex.Message));
			}
			if (num > 0)
			{
				_maxHistory = num;
				TrimExcess();
			}
		}

		public void Add(AIChatMessageEvent msg, bool pinned = false)
		{
			Dictionary<string, object> payload = new Dictionary<string, object>
			{
				["role"] = msg.Role.ToString(),
				["content"] = msg.Message,
				["name"] = msg.UserId
			};
			MessageEntry messageEntry = new MessageEntry(msg, payload, pinned);
			_history.AddLast(messageEntry);
			_messages.Add(messageEntry);
			if (!pinned)
			{
				_nonPinnedCount++;
			}
			TrimExcess();
		}

		private void TrimExcess()
		{
			while (_nonPinnedCount > _maxHistory)
			{
				for (LinkedListNode<MessageEntry> linkedListNode = _history.First; linkedListNode != null; linkedListNode = linkedListNode.Next)
				{
					if (!linkedListNode.Value.IsPinned)
					{
						_history.Remove(linkedListNode);
						_messages.Remove(linkedListNode.Value);
						_nonPinnedCount--;
						break;
					}
				}
			}
		}

		public List<Dictionary<string, object>> BuildContextMessages(string userPrompt, string userName = "玩家")
		{
			List<Dictionary<string, object>> list = new List<Dictionary<string, object>>(_messages.Count);
			foreach (MessageEntry message in _messages)
			{
				list.Add(message.Payload);
			}
			return list;
		}

		public void Clear()
		{
			_history.Clear();
			_messages.Clear();
			_nonPinnedCount = 0;
		}

		public static (string? content, string? reasoning) ParseOpenAICompletionResponseWithReasoning(string response)
		{
			try
			{
				JObject val = JObject.Parse(response);
				JToken obj = val["choices"];
				JArray val2 = (JArray)(object)((obj is JArray) ? obj : null);
				if (val2 != null && ((JContainer)val2).Count > 0)
				{
					foreach (JToken item in val2)
					{
						JToken obj2 = item[(object)"message"];
						string text = ((obj2 == null) ? null : ((object)obj2[(object)"content"])?.ToString());
						JToken obj3 = item[(object)"message"];
						object obj4 = ((obj3 == null) ? null : ((object)obj3[(object)"reasoning"])?.ToString());
						if (obj4 == null)
						{
							JToken obj5 = item[(object)"message"];
							obj4 = ((obj5 == null) ? null : ((object)obj5[(object)"thoughts"])?.ToString());
						}
						string text2 = (string)obj4;
						string text3 = ((object)item[(object)"text"])?.ToString();
						if (!string.IsNullOrWhiteSpace(text))
						{
							return (text.Trim(), string.IsNullOrWhiteSpace(text2) ? null : text2.Trim());
						}
						if (!string.IsNullOrWhiteSpace(text2))
						{
							return (null, text2.Trim());
						}
						if (!string.IsNullOrWhiteSpace(text3))
						{
							return (text3.Trim(), null);
						}
					}
				}
				return (null, null);
			}
			catch (Exception)
			{
				return (null, null);
			}
		}

		public string BuildRoomEnvironmentPrompt(bool includeTimestamp = true)
		{
			try
			{
				Room currentRoom = PhotonNetwork.CurrentRoom;
				string text = ((currentRoom != null) ? currentRoom.Name : null) ?? "unknown";
				Player[] array = PhotonNetwork.PlayerList ?? Array.Empty<Player>();
				Player localPlayer = PhotonNetwork.LocalPlayer;
				Player masterClient = PhotonNetwork.MasterClient;
				List<string> list = new List<string>();
				Player[] array2 = array;
				foreach (Player val in array2)
				{
					string text2 = ((!string.IsNullOrEmpty(val.NickName)) ? val.NickName : $"Player{val.ActorNumber}");
					string text3 = ((!string.IsNullOrEmpty(val.UserId)) ? val.UserId : "unknown");
					int actorNumber = val.ActorNumber;
					bool flag = ((object)val).Equals((object?)localPlayer);
					bool flag2 = ((object)val).Equals((object?)masterClient);
					list.Add($"{text2}|id={text3}|actor={actorNumber}|local={flag.ToString().ToLower()}|master={flag2.ToString().ToLower()}");
				}
				string text4 = ((list.Count > 0) ? string.Join(";", list) : string.Empty);
				string text5 = "none";
				try
				{
					if (((currentRoom != null) ? ((RoomInfo)currentRoom).CustomProperties : null) != null && ((Dictionary<object, object>)(object)((RoomInfo)currentRoom).CustomProperties).ContainsKey((object)"seed"))
					{
						text5 = ((RoomInfo)currentRoom).CustomProperties[(object)"seed"]?.ToString() ?? "none";
					}
				}
				catch (Exception ex)
				{
					PeakChatOpsPlugin.Logger.LogDebug((object)("[AIContext] BuildRoomEnvironmentPrompt read seed: " + ex.Message));
				}
				string text6 = ((masterClient != null) ? masterClient.NickName : null) ?? "unknown";
				string text7 = (includeTimestamp ? $",time={DateTimeOffset.UtcNow.ToUnixTimeSeconds()}" : string.Empty);
				return $"room[{text}] players={array.Length} [{text4}] host={text6},mapSeed={text5}{text7}";
			}
			catch (Exception ex2)
			{
				PeakChatOpsPlugin.Logger.LogError((object)("[AIContext] BuildRoomEnvironmentPrompt failed: " + ex2.Message));
				return "room=unknown players=0";
			}
		}
	}
	public class MessageData
	{
		public string Nickname;

		public string Message;

		public string UserId;

		public bool IsDead;

		public Dictionary<string, object> Extra;

		public MessageData(string nickname, string message, string userId, bool isDead, Dictionary<string, object> extra = null)
		{
			Nickname = nickname;
			Message = message;
			UserId = userId;
			IsDead = isDead;
			Extra = extra;
		}
	}
	public class ChatSystem : MonoBehaviour
	{
		[StructLayout(LayoutKind.Auto)]
		[CompilerGenerated]
		private struct <FlushStaticPendingSendsAsync>d__10 : IAsyncStateMachine
		{
			public int <>1__state;

			public AsyncUniTaskVoidMethodBuilder <>t__builder;

			public ChatSystem <>4__this;

			private Awaiter <>u__1;

			private void MoveNext()
			{
				//IL_0065: Unknown result type (might be due to invalid IL or missing references)
				//IL_006a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0071: Unknown result type (might be due to invalid IL or missing references)
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0031: Unknown result type (might be due to invalid IL or missing references)
				//IL_0035: Unknown result type (might be due to invalid IL or missing references)
				//IL_003a: Unknown result type (might be due to invalid IL or missing references)
				//IL_004e: 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)
				int num = <>1__state;
				ChatSystem chatSystem = <>4__this;
				try
				{
					if (num != 0)
					{
						goto IL_0011;
					}
					Awaiter awaiter = <>u__1;
					<>u__1 = default(Awaiter);
					num = (<>1__state = -1);
					goto IL_0080;
					IL_0011:
					if (_staticPendingSends.TryDequeue(out (string, Dictionary<string, object>) result))
					{
						UniTask val = chatSystem.SendChatMessageAsync(result.Item1, result.Item2);
						awaiter = ((UniTask)(ref val)).GetAwaiter();
						if (!((Awaiter)(ref awaiter)).IsCompleted)
						{
							num = (<>1__state = 0);
							<>u__1 = awaiter;
							((AsyncUniTaskVoidMethodBuilder)(ref <>t__builder)).AwaitUnsafeOnCompleted<Awaiter, <FlushStaticPendingSendsAsync>d__10>(ref awaiter, ref this);
							return;
						}
						goto IL_0080;
					}
					goto end_IL_000e;
					IL_0080:
					((Awaiter)(ref awaiter)).GetResult();
					goto IL_0011;
					end_IL_000e:;
				}
				catch (Exception exception)
				{
					<>1__state = -2;
					((AsyncUniTaskVoidMethodBuilder)(ref <>t__builder)).SetException(exception);
					return;
				}
				<>1__state = -2;
				((AsyncUniTaskVoidMethodBuilder)(ref <>t__builder)).SetResult();
			}

			void IAsyncStateMachine.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				this.MoveNext();
			}

			[DebuggerHidden]
			private void SetStateMachine(IAsyncStateMachine stateMachine)
			{
				((AsyncUniTaskVoidMethodBuilder)(ref <>t__builder)).SetStateMachine(stateMachine);
			}

			void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
			{
				//ILSpy generated this explicit interface implementation from .override directive in SetStateMachine
				this.SetStateMachine(stateMachine);
			}
		}

		[StructLayout(LayoutKind.Auto)]
		[CompilerGenerated]
		private struct <PublishRemoteMessageAsync>d__7 : IAsyncStateMachine
		{
			public int <>1__state;

			public AsyncUniTaskVoidMethodBuilder <>t__builder;

			public ChatMessageEvent evt;

			private Awaiter <>u__1;

			private void MoveNext()
			{
				//IL_0055: Unknown result type (might be due to invalid IL or missing references)
				//IL_005a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0061: 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)
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				//IL_0025: Unknown result type (might be due to invalid IL or missing references)
				//IL_002a: Unknown result type (might be due to invalid IL or missing references)
				//IL_003e: Unknown result type (might be due to invalid IL or missing references)
				//IL_003f: Unknown result type (might be due to invalid IL or missing references)
				int num = <>1__state;
				try
				{
					try
					{
						Awaiter awaiter;
						if (num != 0)
						{
							UniTask val = EventBusRegistry.ChatMessageBus.Publish("sander://other", evt);
							awaiter = ((UniTask)(ref val)).GetAwaiter();
							if (!((Awaiter)(ref awaiter)).IsCompleted)
							{
								num = (<>1__state = 0);
								<>u__1 = awaiter;
								((AsyncUniTaskVoidMethodBuilder)(ref <>t__builder)).AwaitUnsafeOnCompleted<Awaiter, <PublishRemoteMessageAsync>d__7>(ref awaiter, ref this);
								return;
							}
						}
						else
						{
							awaiter = <>u__1;
							<>u__1 = default(Awaiter);
							num = (<>1__state = -1);
						}
						((Awaiter)(ref awaiter)).GetResult();
					}
					catch (Exception)
					{
					}
				}
				catch (Exception exception)
				{
					<>1__state = -2;
					((AsyncUniTaskVoidMethodBuilder)(ref <>t__builder)).SetException(exception);
					return;
				}
				<>1__state = -2;
				((AsyncUniTaskVoidMethodBuilder)(ref <>t__builder)).SetResult();
			}

			void IAsyncStateMachine.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				this.MoveNext();
			}

			[DebuggerHidden]
			private void SetStateMachine(IAsyncStateMachine stateMachine)
			{
				((AsyncUniTaskVoidMethodBuilder)(ref <>t__builder)).SetStateMachine(stateMachine);
			}

			void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
			{
				//ILSpy generated this explicit interface implementation from .override directive in SetStateMachine
				this.SetStateMachine(stateMachine);
			}
		}

		[StructLayout(LayoutKind.Auto)]
		[CompilerGenerated]
		private struct <SendChatMessageAsync>d__8 : IAsyncStateMachine
		{
			public int <>1__state;

			public AsyncUniTaskMethodBuilder <>t__builder;

			public string message;

			public Dictionary<string, object> extra;

			private Awaiter <>u__1;

			private void MoveNext()
			{
				//IL_0135: Unknown result type (might be due to invalid IL or missing references)
				//IL_013a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0142: Unknown result type (might be due to invalid IL or missing references)
				//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
				//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
				//IL_0200: Unknown result type (might be due to invalid IL or missing references)
				//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
				//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
				//IL_01c1: Unknown result type (might be due to invalid IL or missing references)
				//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
				//IL_01db: Unknown result type (might be due to invalid IL or missing references)
				//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
				//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
				//IL_0100: Unknown result type (might be due to invalid IL or missing references)
				//IL_0105: Unknown result type (might be due to invalid IL or missing references)
				//IL_011a: Unknown result type (might be due to invalid IL or missing references)
				//IL_011c: Unknown result type (might be due to invalid IL or missing references)
				int num = <>1__state;
				try
				{
					Awaiter awaiter;
					if (num == 0)
					{
						awaiter = <>u__1;
						<>u__1 = default(Awaiter);
						num = (<>1__state = -1);
						goto IL_0151;
					}
					Awaiter awaiter2;
					if (num == 1)
					{
						awaiter2 = <>u__1;
						<>u__1 = default(Awaiter);
						num = (<>1__state = -1);
						goto IL_020f;
					}
					if (!string.IsNullOrWhiteSpace(message))
					{
						string value = PeakChatOpsPlugin.config.CmdPrefix.Value;
						bool isDead = false;
						UniTask val;
						if (!string.IsNullOrEmpty(value) && message.StartsWith(value))
						{
							if ((Object)(object)Character.localCharacter?.data != (Object)null)
							{
								isDead = Character.localCharacter.data.dead;
							}
							string text = message.Substring(value.Length).Trim();
							string[] array = text.Split(' ', StringSplitOptions.RemoveEmptyEntries);
							string command = ((array.Length != 0) ? array[0] : string.Empty);
							string[] args = ((array.Length > 1) ? array[1..] : new string[0]);
							CmdMessageEvent ev = new CmdMessageEvent(command, args, PhotonNetwork.LocalPlayer.UserId);
							val = EventBusRegistry.CmdMessageBus.Publish("cmd://", ev);
							awaiter = ((UniTask)(ref val)).GetAwaiter();
							if (!((Awaiter)(ref awaiter)).IsCompleted)
							{
								num = (<>1__state = 0);
								<>u__1 = awaiter;
								((AsyncUniTaskMethodBuilder)(ref <>t__builder)).AwaitUnsafeOnCompleted<Awaiter, <SendChatMessageAsync>d__8>(ref awaiter, ref this);
								return;
							}
							goto IL_0151;
						}
						if ((Object)(object)Character.localCharacter?.data != (Object)null)
						{
							isDead = Character.localCharacter.data.dead;
						}
						ChatMessageEvent ev2 = new ChatMessageEvent(PhotonNetwork.LocalPlayer.NickName, message, PhotonNetwork.LocalPlayer.UserId, isDead, extra);
						val = EventBusRegistry.ChatMessageBus.Publish("sander://self", ev2);
						awaiter2 = ((UniTask)(ref val)).GetAwaiter();
						if (!((Awaiter)(ref awaiter2)).IsCompleted)
						{
							num = (<>1__state = 1);
							<>u__1 = awaiter2;
							((AsyncUniTaskMethodBuilder)(ref <>t__builder)).AwaitUnsafeOnCompleted<Awaiter, <SendChatMessageAsync>d__8>(ref awaiter2, ref this);
							return;
						}
						goto IL_020f;
					}
					goto end_IL_0007;
					IL_0151:
					((Awaiter)(ref awaiter)).GetResult();
					goto end_IL_0007;
					IL_020f:
					((Awaiter)(ref awaiter2)).GetResult();
					end_IL_0007:;
				}
				catch (Exception exception)
				{
					<>1__state = -2;
					((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetException(exception);
					return;
				}
				<>1__state = -2;
				((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetResult();
			}

			void IAsyncStateMachine.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				this.MoveNext();
			}

			[DebuggerHidden]
			private void SetStateMachine(IAsyncStateMachine stateMachine)
			{
				((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetStateMachine(stateMachine);
			}

			void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
			{
				//ILSpy generated this explicit interface implementation from .override directive in SetStateMachine
				this.SetStateMachine(stateMachine);
			}
		}

		public static ChatSystem Instance;

		private readonly Dictionary<byte, Action<EventData>> eventHandlers = new Dictionary<byte, Action<EventData>>();

		private static ConcurrentQueue<(string message, Dictionary<string, object> extra)> _staticPendingSends = new ConcurrentQueue<(string, Dictionary<string, object>)>();

		private void Start()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			Instance = this;
			UniTaskVoid val = FlushStaticPendingSendsAsync();
			((UniTaskVoid)(ref val)).Forget();
			eventHandlers[81] = HandleChatEvent;
			PhotonNetwork.NetworkingClient.EventReceived += OnEvent;
		}

		private void OnDestroy()
		{
			PhotonNetwork.NetworkingClient.EventReceived -= OnEvent;
		}

		public void OnEvent(EventData photonEvent)
		{
			if (eventHandlers.TryGetValue(photonEvent.Code, out var value))
			{
				value(photonEvent);
			}
		}

		internal void HandleChatEvent(EventData photonEvent)
		{
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_014f: Unknown result type (might be due to invalid IL or missing references)
			object[] array = (object[])photonEvent.CustomData;
			if (array.Length < 4)
			{
				return;
			}
			Dictionary<string, object> dictionary = null;
			if (array.Length > 4 && array[4] != null)
			{
				if (array[4] is Dictionary<string, object> dictionary2)
				{
					dictionary = dictionary2;
				}
				else
				{
					object obj = array[4];
					Hashtable val = (Hashtable)((obj is Hashtable) ? obj : null);
					if (val != null)
					{
						dictionary = ConvertHashtableToDictionary(val);
					}
					else if (array[4] is IDictionary dictionary3)
					{
						dictionary = new Dictionary<string, object>();
						foreach (DictionaryEntry item in dictionary3)
						{
							if (item.Key != null)
							{
								string key = item.Key.ToString();
								dictionary[key] = item.Value;
							}
						}
					}
				}
			}
			bool result;
			MessageData messageData = new MessageData(array[0]?.ToString() ?? null, array[1]?.ToString() ?? null, array[2]?.ToString() ?? null, bool.TryParse(array[3]?.ToString(), out result) && result, dictionary);
			ChatMessageEvent evt = new ChatMessageEvent(messageData.Nickname, messageData.Message, messageData.UserId, messageData.IsDead, messageData.Extra);
			UniTaskVoid val2 = PublishRemoteMessageAsync(evt);
			((UniTaskVoid)(ref val2)).Forget();
		}

		[AsyncStateMachine(typeof(<PublishRemoteMessageAsync>d__7))]
		private UniTaskVoid PublishRemoteMessageAsync(ChatMessageEvent evt)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			<PublishRemoteMessageAsync>d__7 <PublishRemoteMessageAsync>d__ = default(<PublishRemoteMessageAsync>d__7);
			<PublishRemoteMessageAsync>d__.<>t__builder = AsyncUniTaskVoidMethodBuilder.Create();
			<PublishRemoteMessageAsync>d__.evt = evt;
			<PublishRemoteMessageAsync>d__.<>1__state = -1;
			((AsyncUniTaskVoidMethodBuilder)(ref <PublishRemoteMessageAsync>d__.<>t__builder)).Start<<PublishRemoteMessageAsync>d__7>(ref <PublishRemoteMessageAsync>d__);
			return ((AsyncUniTaskVoidMethodBuilder)(ref <PublishRemoteMessageAsync>d__.<>t__builder)).Task;
		}

		[AsyncStateMachine(typeof(<SendChatMessageAsync>d__8))]
		public UniTask SendChatMessageAsync(string message, Dictionary<string, object> extra)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			<SendChatMessageAsync>d__8 <SendChatMessageAsync>d__ = default(<SendChatMessageAsync>d__8);
			<SendChatMessageAsync>d__.<>t__builder = AsyncUniTaskMethodBuilder.Create();
			<SendChatMessageAsync>d__.message = message;
			<SendChatMessageAsync>d__.extra = extra;
			<SendChatMessageAsync>d__.<>1__state = -1;
			((AsyncUniTaskMethodBuilder)(ref <SendChatMessageAsync>d__.<>t__builder)).Start<<SendChatMessageAsync>d__8>(ref <SendChatMessageAsync>d__);
			return ((AsyncUniTaskMethodBuilder)(ref <SendChatMessageAsync>d__.<>t__builder)).Task;
		}

		private static Dictionary<string, object> ConvertHashtableToDictionary(Hashtable hashtable)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			if (hashtable == null)
			{
				return null;
			}
			Dictionary<string, object> dictionary = new Dictionary<string, object>();
			DictionaryEntryEnumerator enumerator = hashtable.GetEnumerator();
			try
			{
				while (((DictionaryEntryEnumerator)(ref enumerator)).MoveNext())
				{
					DictionaryEntry current = ((DictionaryEntryEnumerator)(ref enumerator)).Current;
					if (current.Key != null)
					{
						dictionary[current.Key.ToString()] = current.Value;
					}
				}
				return dictionary;
			}
			finally
			{
				((IDisposable)(DictionaryEntryEnumerator)(ref enumerator)).Dispose();
			}
		}

		[AsyncStateMachine(typeof(<FlushStaticPendingSendsAsync>d__10))]
		private UniTaskVoid FlushStaticPendingSendsAsync()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			<FlushStaticPendingSendsAsync>d__10 <FlushStaticPendingSendsAsync>d__ = default(<FlushStaticPendingSendsAsync>d__10);
			<FlushStaticPendingSendsAsync>d__.<>t__builder = AsyncUniTaskVoidMethodBuilder.Create();
			<FlushStaticPendingSendsAsync>d__.<>4__this = this;
			<FlushStaticPendingSendsAsync>d__.<>1__state = -1;
			((AsyncUniTaskVoidMethodBuilder)(ref <FlushStaticPendingSendsAsync>d__.<>t__builder)).Start<<FlushStaticPendingSendsAsync>d__10>(ref <FlushStaticPendingSendsAsync>d__);
			return ((AsyncUniTaskVoidMethodBuilder)(ref <FlushStaticPendingSendsAsync>d__.<>t__builder)).Task;
		}
	}
	public static class MessageStyles
	{
		public const string ColorCommand = "#5BA3F5";

		public const string ColorAI = "#00D9FF";

		public const string ColorSuccess = "#4ADE80";

		public const string ColorError = "#F87171";

		public const string ColorWarning = "#FBBF24";

		public const string ColorSystem = "#A78BFA";

		public const string ColorTranslate = "#FB923C";

		public const string ColorDead = "#9CA3AF";

		public const string ColorPlayerLocal = "#34D399";

		public const string ColorPlayerRemote = "#E5E7EB";

		public const string ColorSecondary = "#9CA3AF";

		public const string ColorReasoning = "#6B7280";

		public const string ColorText = "#D1D5DB";

		public const string ColorTextAI = "#7DD3FC";

		public const string ColorTextCommand = "#93C5FD";

		public const string ColorTextSuccess = "#86EFAC";

		public const string ColorTextError = "#FCA5A5";

		public const string ColorTextWarning = "#FDE047";

		public const string ColorTextSystem = "#C4B5FD";

		public const string ColorTextTranslate = "#FDBA74";

		public const string SizeLabel = "90%";

		public const string SizeSecondary = "85%";

		public const string SizeReasoning = "80%";

		public static string Label(string text, string color, string size = "90%")
		{
			return "<color=" + color + "><size=" + size + ">" + text + "</size></color>";
		}

		public static string CommandLabel(string command)
		{
			return Label("[" + command + "]", "#5BA3F5");
		}

		public static string AILabel(string modelName = "AI")
		{
			return Label("[" + modelName + "]", "#00D9FF");
		}

		public static string SuccessLabel(string text = "Success")
		{
			return Label("[" + text + "]", "#4ADE80");
		}

		public static string ErrorLabel(string text = "Error")
		{
			return Label("<b>[" + text + "]</b>", "#F87171");
		}

		public static string WarningLabel(string text = "Warning")
		{
			return Label("[" + text + "]", "#FBBF24");
		}

		public static string SystemLabel(string text = "System")
		{
			return Label("[" + text + "]", "#A78BFA");
		}

		public static string TranslateLabel()
		{
			return Label("[T]", "#FB923C");
		}

		public static string PlayerLabel(string playerName, bool isLocal, bool isDead = false)
		{
			string text = (isDead ? "#9CA3AF" : (isLocal ? "#34D399" : "#E5E7EB"));
			string text2 = (isDead ? " <b><color=#F87171>(DEAD)</color></b>" : "");
			return "<color=" + text + "><size=90%>[" + playerName + "]</size></color>" + text2;
		}

		public static string SecondaryText(string text)
		{
			return "<color=#9CA3AF><size=85%>" + text + "</size></color>";
		}

		public static string ReasoningText(string text)
		{
			return "<color=#6B7280><size=80%>" + text + "</size></color>";
		}

		public static string ColoredContent(string content, string color = null)
		{
			if (string.IsNullOrWhiteSpace(content))
			{
				return string.Empty;
			}
			string text = color ?? "#D1D5DB";
			return "<color=" + text + ">" + content + "</color>";
		}

		public static string AIContent(string content)
		{
			return ColoredContent(content, "#7DD3FC");
		}

		public static string CommandContent(string content)
		{
			return ColoredContent(content, "#93C5FD");
		}

		public static string SuccessContent(string content)
		{
			return ColoredContent(content, "#86EFAC");
		}

		public static string ErrorContent(string content)
		{
			return ColoredContent(content, "#FCA5A5");
		}

		public static string WarningContent(string content)
		{
			return ColoredContent(content, "#FDE047");
		}

		public static string SystemContent(string content)
		{
			return ColoredContent(content, "#C4B5FD");
		}

		public static string TranslateContent(string content)
		{
			return ColoredContent(content, "#FDBA74");
		}

		public static string PlayerContent(string content, bool isLocal = false)
		{
			string color = (isLocal ? "#34D399" : "#D1D5DB");
			return ColoredContent(content, color);
		}
	}
	public static class DevLog
	{
		private static string lastDevLogMessage = "";

		[Conditional("DEBUGUI")]
		public static void UI(string message)
		{
			try
			{
				if (!(lastDevLogMessage == message))
				{
					HarmonyFileLog.Enabled = true;
					PeakChatOpsPlugin.Logger.LogDebug((object)message);
					if ((Object)(object)PeakChatOpsUI.Instance != (Object)null)
					{
						PeakChatOpsUI.Instance.AddMessage("<color=#FFA500>[DevLog]</color> ", message);
					}
					lastDevLogMessage = message;
				}
			}
			catch
			{
			}
		}

		[Conditional("DEBUG")]
		public static void File(string message)
		{
			try
			{
				HarmonyFileLog.Enabled = true;
				PeakChatOpsPlugin.Logger.LogDebug((object)message);
			}
			catch
			{
			}
		}
	}
}
namespace PeakChatOps.Core.MsgChain
{
	public static class AIChatMessageChain
	{
		[CompilerGenerated]
		private sealed class <>c__DisplayClass1_0
		{
			public string atCommand;

			internal bool <HandleAiChatMessageAsync>b__0(PCOCommandAttribute c)
			{
				return c.Name.Equals(atCommand, StringComparison.OrdinalIgnoreCase);
			}
		}

		[StructLayout(LayoutKind.Auto)]
		[CompilerGenerated]
		private struct <HandleAiChatMessageAsync>d__1 : IAsyncStateMachine
		{
			public int <>1__state;

			public AsyncUniTaskMethodBuilder <>t__builder;

			public AIChatMessageEvent evt;

			private bool <hasError>5__2;

			private OpenAIClient <client>5__3;

			private Awaiter<string> <>u__1;

			private void MoveNext()
			{
				//IL_03fb: Unknown result type (might be due to invalid IL or missing references)
				//IL_0400: Unknown result type (might be due to invalid IL or missing references)
				//IL_0408: Unknown result type (might be due to invalid IL or missing references)
				//IL_03bd: Unknown result type (might be due to invalid IL or missing references)
				//IL_03c2: Unknown result type (might be due to invalid IL or missing references)
				//IL_03c6: Unknown result type (might be due to invalid IL or missing references)
				//IL_03cb: Unknown result type (might be due to invalid IL or missing references)
				//IL_03e0: Unknown result type (might be due to invalid IL or missing references)
				//IL_03e2: Unknown result type (might be due to invalid IL or missing references)
				//IL_06a5: Unknown result type (might be due to invalid IL or missing references)
				int num = <>1__state;
				try
				{
					if (num == 0)
					{
						goto IL_020f;
					}
					if (evt != null && evt.Role == AIChatRole.user && !string.IsNullOrWhiteSpace(evt.Message))
					{
						if (evt.Extra == null || !evt.Extra.TryGetValue("AI", out object value) || !(value is AIExtra aIExtra))
						{
							goto IL_01d5;
						}
						<>c__DisplayClass1_0 CS$<>8__locals0 = new <>c__DisplayClass1_0
						{
							atCommand = aIExtra.AtCommand?.ToLowerInvariant()
						};
						string atCommand = CS$<>8__locals0.atCommand;
						if (!(atCommand == "clear"))
						{
							if (atCommand == "send")
							{
								string value2 = PeakChatOpsPlugin.config.PromptSend.Value;
								evt.Message = ((!string.IsNullOrWhiteSpace(aIExtra.PromptAppend)) ? (evt.Message + "(" + aIExtra.PromptAppend + ")") : (evt.Message + "(" + value2 + ")"));
							}
							else
							{
								PCOCommandAttribute pCOCommandAttribute = Cmdx.CommandMetas.Find((PCOCommandAttribute c) => c.Name.Equals(CS$<>8__locals0.atCommand, StringComparison.OrdinalIgnoreCase));
								if (pCOCommandAttribute != null)
								{
									evt.Message = evt.Message + " (Command Info: " + pCOCommandAttribute.Name + " - " + pCOCommandAttribute.Description + ")";
								}
							}
							goto IL_01d5;
						}
						AIChatContextLogger.Instance?.Clear();
						PeakChatOpsUI.Instance?.AddMessage(MessageStyles.AILabel(), MessageStyles.SystemContent("上下文已清空 (Context cleared)"));
					}
					goto end_IL_0007;
					IL_01d5:
					AIChatContextLogger.Instance?.LogUser(evt.Message, evt.Sender, evt.UserId);
					<hasError>5__2 = false;
					goto IL_020f;
					IL_020f:
					string text3;
					try
					{
						if (num == 0)
						{
							goto IL_03a5;
						}
						string hashOrKey = PeakChatOpsPlugin.config.AiApiKey?.Value;
						string actualApiKey = PConfig.GetActualApiKey(hashOrKey);
						string text = PeakChatOpsPlugin.config.AiEndpoint?.Value;
						string text2 = default(string);
						List<Dictionary<string, object>> messages = default(List<Dictionary<string, object>>);
						int maxTokens = default(int);
						if (!string.IsNullOrEmpty(actualApiKey) && !string.IsNullOrEmpty(text))
						{
							string message = evt.Message;
							text2 = PeakChatOpsPlugin.config.AiModel?.Value;
							if (string.IsNullOrWhiteSpace(text2))
							{
								text2 = "gpt-oss:120b-cloud";
							}
							AIChatContextLogger instance = AIChatContextLogger.Instance;
							messages = (List<Dictionary<string, object>>)((instance == null) ? ((IList)new List<Dictionary<string, object>>()) : ((IList)instance.BuildContextMessages(message, evt.UserId)));
							maxTokens = PeakChatOpsPlugin.config.AiMaxTokens?.Value ?? 1024;
							double temperature = ((double?)PeakChatOpsPlugin.config.AiTemperature?.Value) ?? 0.7;
							double topP = ((double?)PeakChatOpsPlugin.config.AiTopP?.Value) ?? 1.0;
							int n = PeakChatOpsPlugin.config.AiN?.Value ?? 1;
							<client>5__3 = new OpenAIClient(actualApiKey, text, maxTokens, temperature, topP, n);
							goto IL_03a5;
						}
						text3 = "未配置 API Key 或 Endpoint,请先在设置中填写。";
						<hasError>5__2 = true;
						goto end_IL_020f;
						IL_03a5:
						try
						{
							Awaiter<string> awaiter;
							if (num != 0)
							{
								OpenAIChatApi openAIChatApi = new OpenAIChatApi(<client>5__3);
								awaiter = openAIChatApi.CreateChatCompletionAsync(text2, messages, maxTokens).GetAwaiter();
								if (!awaiter.IsCompleted)
								{
									num = (<>1__state = 0);
									<>u__1 = awaiter;
									((AsyncUniTaskMethodBuilder)(ref <>t__builder)).AwaitUnsafeOnCompleted<Awaiter<string>, <HandleAiChatMessageAsync>d__1>(ref awaiter, ref this);
									return;
								}
							}
							else
							{
								awaiter = <>u__1;
								<>u__1 = default(Awaiter<string>);
								num = (<>1__state = -1);
							}
							string result = awaiter.GetResult();
							string text4 = result;
							if (text4 == null)
							{
								text3 = "AI API 返回空响应,请检查网络连接或 API 配置";
								<hasError>5__2 = true;
							}
							else
							{
								var (text5, text6) = AIChatContextLogger.ParseOpenAICompletionResponseWithReasoning(text4);
								string text9;
								if (text5 != null && text6 != null)
								{
									ConfigEntry<bool> aiShowResponse = PeakChatOpsPlugin.config.AiShowResponse;
									if (aiShowResponse == null || aiShowResponse.Value)
									{
										string text7 = MessageStyles.ReasoningText(text6);
										string text8 = MessageStyles.SecondaryText("[R]");
										text9 = text5 + "\n" + text8 + ": " + text7;
									}
									else
									{
										text9 = text5;
									}
								}
								else if (text5 != null)
								{
									text9 = text5;
								}
								else if (text6 != null)
								{
									text9 = MessageStyles.ReasoningText(text6);
								}
								else
								{
									text9 = PLocalizedText.GetText("AI_NO_RESPONSE");
									<hasError>5__2 = true;
								}
								if (text5 == null && text6 != null)
								{
									string text10 = text6.Substring(0, Math.Min(200, text6.Length));
								}
								if (!<hasError>5__2)
								{
									AIChatContextLogger.Instance?.LogAssistant(text5 ?? text9, PeakChatOpsPlugin.config.AiModel?.Value ?? "AI");
								}
								text3 = text9;
							}
						}
						finally
						{
							if (num < 0 && <client>5__3 != null)
							{
								((IDisposable)<client>5__3).Dispose();
							}
						}
						<client>5__3 = null;
						end_IL_020f:;
					}
					catch (Exception ex)
					{
						text3 = "AI 请求异常: " + ex.Message;
						<hasError>5__2 = true;
					}
					bool flag = false;
					if (evt.Extra != null && evt.Extra.TryGetValue("AI", out object value3) && value3 is AIExtra aIExtra2)
					{
						string text11 = aIExtra2.AtCommand?.ToLowerInvariant();
						if (text11 == "send")
						{
							flag = true;
						}
					}
					if (!string.IsNullOrWhiteSpace(text3))
					{
						if (flag && !<hasError>5__2)
						{
							ChatMessageEvent ev = new ChatMessageEvent(evt.Sender + " And " + (PeakChatOpsPlugin.config.AiModel?.Value ?? "AI"), text3, evt.UserId, (Character.localCharacter?.data?.dead).GetValueOrDefault(), evt.Extra);
							UniTaskExtensions.Forget(EventBusRegistry.ChatMessageBus.Publish("sander://self", ev));
							string text12 = text3.Substring(0, Math.Min(50, text3.Length));
							string content = MessageStyles.SuccessContent("已发送到游戏聊天: " + text12 + "...");
							PeakChatOpsUI.Instance?.AddMessage(MessageStyles.SuccessLabel("AI→Chat"), content);
						}
						else
						{
							string modelName = PeakChatOpsPlugin.config.AiModel?.Value ?? "AI";
							string sender = (<hasError>5__2 ? MessageStyles.ErrorLabel("AI Error") : MessageStyles.AILabel(modelName));
							string content2 = (<hasError>5__2 ? MessageStyles.ErrorContent(text3) : MessageStyles.AIContent(text3));
							PeakChatOpsUI.Instance?.AddMessage(sender, content2);
						}
					}
					else
					{
						PeakChatOpsUI.Instance?.AddMessage(MessageStyles.WarningLabel("AI"), MessageStyles.WarningContent("没有收到任何响应"));
					}
					end_IL_0007:;
				}
				catch (Exception exception)
				{
					<>1__state = -2;
					((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetException(exception);
					return;
				}
				<>1__state = -2;
				((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetResult();
			}

			void IAsyncStateMachine.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				this.MoveNext();
			}

			[DebuggerHidden]
			private void SetStateMachine(IAsyncStateMachine stateMachine)
			{
				((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetStateMachine(stateMachine);
			}

			void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
			{
				//ILSpy generated this explicit interface implementation from .override directive in SetStateMachine
				this.SetStateMachine(stateMachine);
			}
		}

		[StructLayout(LayoutKind.Auto)]
		[CompilerGenerated]
		private struct <HandleAiTranslateMessageAsync>d__2 : IAsyncStateMachine
		{
			public int <>1__state;

			public AsyncUniTaskMethodBuilder <>t__builder;

			public AIChatMessageEvent evt;

			private bool <hasError>5__2;

			private OpenAIClient <client>5__3;

			private Awaiter<string> <>u__1;

			private void MoveNext()
			{
				//IL_02f1: Unknown result type (might be due to invalid IL or missing references)
				//IL_02f6: Unknown result type (might be due to invalid IL or missing references)
				//IL_02fe: Unknown result type (might be due to invalid IL or missing references)
				//IL_02b3: Unknown result type (might be due to invalid IL or missing references)
				//IL_02b8: Unknown result type (might be due to invalid IL or missing references)
				//IL_02bc: Unknown result type (might be due to invalid IL or missing references)
				//IL_02c1: Unknown result type (might be due to invalid IL or missing references)
				//IL_02d6: Unknown result type (might be due to invalid IL or missing references)
				//IL_02d8: Unknown result type (might be due to invalid IL or missing references)
				int num = <>1__state;
				try
				{
					if (num != 0)
					{
						<hasError>5__2 = false;
					}
					string text2;
					try
					{
						if (num == 0)
						{
							goto IL_029b;
						}
						string hashOrKey = PeakChatOpsPlugin.config.AiApiKey?.Value;
						string actualApiKey = PConfig.GetActualApiKey(hashOrKey);
						string text = PeakChatOpsPlugin.config.AiEndpoint?.Value;
						string model = default(string);
						int maxTokens = default(int);
						List<Dictionary<string, object>> list = default(List<Dictionary<string, object>>);
						if (!string.IsNullOrEmpty(actualApiKey) && !string.IsNullOrEmpty(text))
						{
							string value = (string.IsNullOrWhiteSpace(PeakChatOpsPlugin.config.PromptTranslate?.Value) ? PLocalizedText.GetText("TRANSLATE_PROMPT") : PeakChatOpsPlugin.config.PromptTranslate.Value);
							model = (string.IsNullOrWhiteSpace(PeakChatOpsPlugin.config.AiModel?.Value) ? "gpt-oss:120b-cloud" : PeakChatOpsPlugin.config.AiModel.Value);
							maxTokens = PeakChatOpsPlugin.config.AiMaxTokens?.Value ?? 1024;
							double temperature = ((double?)PeakChatOpsPlugin.config.AiTemperature?.Value) ?? 0.9;
							double topP = ((double?)PeakChatOpsPlugin.config.AiTopP?.Value) ?? 1.0;
							int n = PeakChatOpsPlugin.config.AiN?.Value ?? 1;
							AIChatContextLogger instance = AIChatContextLogger.Instance;
							if (instance != null)
							{
								list = new List<Dictionary<string, object>>
								{
									new Dictionary<string, object>
									{
										{ "role", "system" },
										{ "content", value }
									}
								};
								List<Dictionary<string, object>> collection = instance.BuildContextMessages(evt.Message, evt.UserId);
								list.AddRange(collection);
							}
							else
							{
								list = new List<Dictionary<string, object>>
								{
									new Dictionary<string, object>
									{
										{ "role", "system" },
										{ "content", value }
									},
									new Dictionary<string, object>
									{
										{ "role", "user" },
										{
											"content",
											"Translation Mode:" + evt.Message + PeakChatOpsPlugin.config.PromptTranslate?.Value
										}
									}
								};
							}
							<client>5__3 = new OpenAIClient(actualApiKey, text, maxTokens, temperature, topP, n);
							goto IL_029b;
						}
						text2 = "未配置 API Key 或 Endpoint,请先在设置中填写。";
						<hasError>5__2 = true;
						goto end_IL_0012;
						IL_029b:
						try
						{
							Awaiter<string> awaiter;
							if (num != 0)
							{
								OpenAIChatApi openAIChatApi = new OpenAIChatApi(<client>5__3);
								awaiter = openAIChatApi.CreateChatCompletionAsync(model, list, maxTokens).GetAwaiter();
								if (!awaiter.IsCompleted)
								{
									num = (<>1__state = 0);
									<>u__1 = awaiter;
									((AsyncUniTaskMethodBuilder)(ref <>t__builder)).AwaitUnsafeOnCompleted<Awaiter<string>, <HandleAiTranslateMessageAsync>d__2>(ref awaiter, ref this);
									return;
								}
							}
							else
							{
								awaiter = <>u__1;
								<>u__1 = default(Awaiter<string>);
								num = (<>1__state = -1);
							}
							string result = awaiter.GetResult();
							string text3 = result;
							if (text3 == null)
							{
								text2 = "AI API 返回空响应,请检查网络连接或 API 配置";
								<hasError>5__2 = true;
							}
							else
							{
								var (text4, text5) = AIChatContextLogger.ParseOpenAICompletionResponseWithReasoning(text3);
								string text8;
								if (text4 != null && text5 != null)
								{
									string text6 = MessageStyles.ReasoningText(text5);
									string text7 = MessageStyles.SecondaryText("[R]");
									text8 = text4 + "\n" + text7 + ": " + text6;
								}
								else if (text4 != null)
								{
									text8 = text4;
								}
								else if (text5 != null)
								{
									text8 = MessageStyles.ReasoningText(text5);
								}
								else
								{
									text8 = PLocalizedText.GetText("AI_NO_RESPONSE");
									<hasError>5__2 = true;
								}
								if (text4 == null && text5 != null)
								{
									string text9 = text5.Substring(0, Math.Min(200, text5.Length));
								}
								text2 = text8;
							}
						}
						finally
						{
							if (num < 0 && <client>5__3 != null)
							{
								((IDisposable)<client>5__3).Dispose();
							}
						}
						<client>5__3 = null;
						end_IL_0012:;
					}
					catch (Exception ex)
					{
						text2 = "翻译异常: " + ex.Message;
						<hasError>5__2 = true;
					}
					if (!string.IsNullOrWhiteSpace(text2))
					{
						string sender = (<hasError>5__2 ? MessageStyles.ErrorLabel("翻译错误") : MessageStyles.TranslateLabel());
						string content = (<hasError>5__2 ? MessageStyles.ErrorContent(text2) : MessageStyles.TranslateContent(text2));
						PeakChatOpsUI.Instance.AddMessage(sender, content);
					}
					else
					{
						PeakChatOpsUI.Instance.AddMessage(MessageStyles.WarningLabel("翻译"), MessageStyles.WarningContent("没有收到任何响应"));
					}
				}
				catch (Exception exception)
				{
					<>1__state = -2;
					((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetException(exception);
					return;
				}
				<>1__state = -2;
				((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetResult();
			}

			void IAsyncStateMachine.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				this.MoveNext();
			}

			[DebuggerHidden]
			private void SetStateMachine(IAsyncStateMachine stateMachine)
			{
				((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetStateMachine(stateMachine);
			}

			void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
			{
				//ILSpy generated this explicit interface implementation from .override directive in SetStateMachine
				this.SetStateMachine(stateMachine);
			}
		}

		public static void EnsureInitialized()
		{
			//IL_006a: 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)
			EventBusRegistry.AIChatMessageBus.Subscribe("ai://chat", HandleAiChatMessageAsync);
			EventBusRegistry.AIChatMessageBus.Subscribe("ai://translate", HandleAiTranslateMessageAsync);
			CancellationTokenSource orCreateBusCts = CentralCmdRouter.GetOrCreateBusCts();
			UniTaskExtensions.Forget(EventBusRegistry.AIChatMessageBus.RunAsync("ai://chat", orCreateBusCts.Token));
			UniTaskExtensions.Forget(EventBusRegistry.AIChatMessageBus.RunAsync("ai://translate", orCreateBusCts.Token));
		}

		[AsyncStateMachine(typeof(<HandleAiChatMessageAsync>d__1))]
		private static UniTask HandleAiChatMessageAsync(AIChatMessageEvent evt)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			<HandleAiChatMessageAsync>d__1 <HandleAiChatMessageAsync>d__ = default(<HandleAiChatMessageAsync>d__1);
			<HandleAiChatMessageAsync>d__.<>t__builder = AsyncUniTaskMethodBuilder.Create();
			<HandleAiChatMessageAsync>d__.evt = evt;
			<HandleAiChatMessageAsync>d__.<>1__state = -1;
			((AsyncUniTaskMethodBuilder)(ref <HandleAiChatMessageAsync>d__.<>t__builder)).Start<<HandleAiChatMessageAsync>d__1>(ref <HandleAiChatMessageAsync>d__);
			return ((AsyncUniTaskMethodBuilder)(ref <HandleAiChatMessageAsync>d__.<>t__builder)).Task;
		}

		[AsyncStateMachine(typeof(<HandleAiTranslateMessageAsync>d__2))]
		private static UniTask HandleAiTranslateMessageAsync(AIChatMessageEvent evt)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			<HandleAiTranslateMessageAsync>d__2 <HandleAiTranslateMessageAsync>d__ = default(<HandleAiTranslateMessageAsync>d__2);
			<HandleAiTranslateMessageAsync>d__.<>t__builder = AsyncUniTaskMethodBuilder.Create();
			<HandleAiTranslateMessageAsync>d__.evt = evt;
			<HandleAiTranslateMessageAsync>d__.<>1__state = -1;
			((AsyncUniTaskMethodBuilder)(ref <HandleAiTranslateMessageAsync>d__.<>t__builder)).Start<<HandleAiTranslateMessageAsync>d__2>(ref <HandleAiTranslateMessageAsync>d__);
			return ((AsyncUniTaskMethodBuilder)(ref <HandleAiTranslateMessageAsync>d__.<>t__builder)).Task;
		}
	}
	public static class CentralCmdRouter
	{
		[StructLayout(LayoutKind.Auto)]
		[CompilerGenerated]
		private struct <RouteCommandAsync>d__4 : IAsyncStateMachine
		{
			public int <>1__state;

			public AsyncUniTaskMethodBuilder <>t__builder;

			public CmdMessageEvent evt;

			private object <>7__wrap1;

			private int <>7__wrap2;

			private Awaiter <>u__1;

			private void MoveNext()
			{
				//IL_04c7: Unknown result type (might be due to invalid IL or missing references)
				//IL_04cc: Unknown result type (might be due to invalid IL or missing references)
				//IL_04d4: Unknown result type (might be due to invalid IL or missing references)
				//IL_0528: Unknown result type (might be due to invalid IL or missing references)
				//IL_052d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0535: Unknown result type (might be due to invalid IL or missing references)
				//IL_04f6: Unknown result type (might be due to invalid IL or missing references)
				//IL_04fb: Unknown result type (might be due to invalid IL or missing references)
				//IL_0510: Unknown result type (might be due to invalid IL or missing references)
				//IL_0512: Unknown result type (might be due to invalid IL or missing references)
				//IL_0101: Unknown result type (might be due to invalid IL or missing references)
				//IL_0106: Unknown result type (might be due to invalid IL or missing references)
				//IL_010e: Unknown result type (might be due to invalid IL or missing references)
				//IL_03c7: Unknown result type (might be due to invalid IL or missing references)
				//IL_03cc: Unknown result type (might be due to invalid IL or missing references)
				//IL_03d4: Unknown result type (might be due to invalid IL or missing references)
				//IL_0319: Unknown result type (might be due to invalid IL or missing references)
				//IL_031e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0326: Unknown result type (might be due to invalid IL or missing references)
				//IL_02db: Unknown result type (might be due to invalid IL or missing references)
				//IL_02e0: Unknown result type (might be due to invalid IL or missing references)
				//IL_02e4: Unknown result type (might be due to invalid IL or missing references)
				//IL_02e9: Unknown result type (might be due to invalid IL or missing references)
				//IL_02fe: Unknown result type (might be due to invalid IL or missing references)
				//IL_0300: Unknown result type (might be due to invalid IL or missing references)
				//IL_0489: Unknown result type (might be due to invalid IL or missing references)
				//IL_048e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0492: Unknown result type (might be due to invalid IL or missing references)
				//IL_0497: Unknown result type (might be due to invalid IL or missing references)
				//IL_04ac: Unknown result type (might be due to invalid IL or missing references)
				//IL_04ae: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
				//IL_0389: Unknown result type (might be due to invalid IL or missing references)
				//IL_038e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0392: Unknown result type (might be due to invalid IL or missing references)
				//IL_0397: Unknown result type (might be due to invalid IL or missing references)
				//IL_03ac: Unknown result type (might be due to invalid IL or missing references)
				//IL_03ae: Unknown result type (might be due to invalid IL or missing references)
				int num = <>1__state;
				try
				{
					Awaiter awaiter2;
					Awaiter awaiter;
					switch (num)
					{
					default:
						<>7__wrap2 = 0;
						goto case 0;
					case 0:
					case 1:
					case 2:
					{
						UniTask val;
						try
						{
							Awaiter awaiter4;
							Func<CmdMessageEvent, UniTask> func = default(Func<CmdMessageEvent, UniTask>);
							Awaiter awaiter3;
							switch (num)
							{
							default:
							{
								if (evt == null || string.IsNullOrWhiteSpace(evt.Command))
								{
									CmdExecResultEvent ev = new CmdExecResultEvent(evt?.Command ?? string.Empty, evt?.Args ?? Array.Empty<string>(), evt?.UserId ?? string.Empty, null, "command not found", success: false);
									val = EventBusRegistry.CmdExecResultBus.Publish("cmd://", ev);
									awaiter4 = ((UniTask)(ref val)).GetAwaiter();
									if (!((Awaiter)(ref awaiter4)).IsCompleted)
									{
										num = (<>1__state = 0);
										<>u__1 = awaiter4;
										((AsyncUniTaskMethodBuilder)(ref <>t__builder)).AwaitUnsafeOnCompleted<Awaiter, <RouteCommandAsync>d__4>(ref awaiter4, ref this);
										return;
									}
									goto IL_011d;
								}
								string sender = MessageStyles.CommandLabel("> " + evt.Command);
								string content = ((evt.Args != null) ? string.Join(" ", evt.Args) : string.Empty);
								string content2 = MessageStyles.CommandContent(content);
								PeakChatOpsUI.Instance.AddMessage(sender, content2);
								string text = evt.Command.Trim();
								List<string> list = new List<string>
								{
									"cmd://" + text,
									"cmd://" + text.ToLowerInvariant(),
									"cmd://" + text.ToUpperInvariant()
								};
								if (text.Length > 0)
								{
									string text2 = char.ToUpperInvariant(text[0]) + ((text.Length > 1) ? text.Substring(1) : string.Empty);
									string text3 = char.ToLowerInvariant(text[0]) + ((text.Length > 1) ? text.Substring(1) : string.Empty);
									list.Add("cmd://" + text2);
									list.Add("cmd://" + text3);
								}
								func = null;
								string text4 = null;
								List<string>.Enumerator enumerator = list.GetEnumerator();
								try
								{
									while (enumerator.MoveNext())
									{
										string current = enumerator.Current;
										if (EventBusRegistry.CmdMessageBus.TryGetHandler(current, out Func<CmdMessageEvent, UniTask> handler))
										{
											func = handler;
											text4 = current;
											break;
										}
									}
								}
								finally
								{
									if (num < 0)
									{
										((IDisposable)enumerator).Dispose();
									}
								}
								if (func == null)
								{
									CmdExecResultEvent ev2 = new CmdExecResultEvent(evt.Command, evt.Args ?? Array.Empty<string>(), evt.UserId, null, "command not found", success: false);
									val = EventBusRegistry.CmdExecResultBus.Publish("cmd://", ev2);
									awaiter3 = ((UniTask)(ref val)).GetAwaiter();
									if (!((Awaiter)(ref awaiter3)).IsCompleted)
									{
										num = (<>1__state = 2);
										<>u__1 = awaiter3;
										((AsyncUniTaskMethodBuilder)(ref <>t__builder)).AwaitUnsafeOnCompleted<Awaiter, <RouteCommandAsync>d__4>(ref awaiter3, ref this);
										return;
									}
									break;
								}
								goto case 1;
							}
							case 0:
								awaiter4 = <>u__1;
								<>u__1 = default(Awaiter);
								num = (<>1__state = -1);
								goto IL_011d;
							case 1:
								try
								{
									Awaiter awaiter5;
									if (num != 1)
									{
										val = func(evt);
										awaiter5 = ((UniTask)(ref val)).GetAwaiter();
										if (!((Awaiter)(ref awaiter5)).IsCompleted)
										{
											num = (<>1__state = 1);
											<>u__1 = awaiter5;
											((AsyncUniTaskMethodBuilder)(ref <>t__builder)).AwaitUnsafeOnCompleted<Awaiter, <RouteCommandAsync>d__4>(ref awaiter5, ref this);
											return;
										}
									}
									else
									{
										awaiter5 = <>u__1;
										<>u__1 = default(Awaiter);
										num = (<>1__state = -1);
									}
									((Awaiter)(ref awaiter5)).GetResult();
								}
								catch (Exception)
								{
									throw;
								}
								goto end_IL_0029;
							case 2:
								{
									awaiter3 = <>u__1;
									<>u__1 = default(Awaiter);
									num = (<>1__state = -1);
									break;
								}
								IL_011d:
								((Awaiter)(ref awaiter4)).GetResult();
								goto end_IL_0007;
							}
							((Awaiter)(ref awaiter3)).GetResult();
							end_IL_0029:;
						}
						catch (Exception ex2)
						{
							<>7__wrap1 = ex2;
							<>7__wrap2 = 1;
						}
						int num2 = <>7__wrap2;
						if (num2 == 1)
						{
							Exception ex3 = (Exception)<>7__wrap1;
							CmdExecResultEvent ev3 = new CmdExecResultEvent(evt?.Command ?? string.Empty, evt?.Args ?? Array.Empty<string>(), evt?.UserId ?? string.Empty, null, ex3.Message, success: false);
							val = EventBusRegistry.CmdExecResultBus.Publish("cmd://", ev3);
							awaiter2 = ((UniTask)(ref val)).GetAwaiter();
							if (!((Awaiter)(ref awaiter2)).IsCompleted)
							{
								num = (<>1__state = 3);
								<>u__1 = awaiter2;
								((AsyncUniTaskMethodBuilder)(ref <>t__builder)).AwaitUnsafeOnCompleted<Awaiter, <RouteCommandAsync>d__4>(ref awaiter2, ref this);
								return;
							}
							goto IL_04e3;
						}
						goto IL_04ea;
					}
					case 3:
						awaiter2 = <>u__1;
						<>u__1 = default(Awaiter);
						num = (<>1__state = -1);
						goto IL_04e3;
					case 4:
						{
							awaiter = <>u__1;
							<>u__1 = default(Awaiter);
							num = (<>1__state = -1);
							break;
						}
						IL_04e3:
						((Awaiter)(ref awaiter2)).GetResult();
						goto IL_04ea;
						IL_04ea:
						<>7__wrap1 = null;
						awaiter = ((UniTask)(ref UniTask.CompletedTask)).GetAwaiter();
						if (!((Awaiter)(ref awaiter)).IsCompleted)
						{
							num = (<>1__state = 4);
							<>u__1 = awaiter;
							((AsyncUniTaskMethodBuilder)(ref <>t__builder)).AwaitUnsafeOnCompleted<Awaiter, <RouteCommandAsync>d__4>(ref awaiter, ref this);
							return;
						}
						break;
					}
					((Awaiter)(ref awaiter)).GetResult();
					end_IL_0007:;
				}
				catch (Exception exception)
				{
					<>1__state = -2;
					((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetException(exception);
					return;
				}
				<>1__state = -2;
				((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetResult();
			}

			void IAsyncStateMachine.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				this.MoveNext();
			}

			[DebuggerHidden]
			private void SetStateMachine(IAsyncStateMachine stateMachine)
			{
				((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetStateMachine(stateMachine);
			}

			void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
			{
				//ILSpy generated this explicit interface implementation from .override directive in SetStateMachine
				this.SetStateMachine(stateMachine);
			}
		}

		private static CancellationTokenSource _busCts;

		public static CancellationTokenSource GetOrCreateBusCts()
		{
			return _busCts;
		}

		static CentralCmdRouter()
		{
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			_busCts = new CancellationTokenSource();
			Cmdx.LoadPCmd();
			Cmdx.Prefix = PeakChatOpsPlugin.config.CmdPrefix.Value;
			EventBusRegistry.CmdMessageBus.Subscribe("cmd://", RouteCommandAsync);
			EventBusRegistry.CmdExecResultBus.Subscribe("cmd://", HandleCmdExecResultAsync);
			UniTaskExtensions.Forget(EventBusRegistry.CmdMessageBus.RunAsync("cmd://", _busCts.Token));
			UniTaskExtensions.Forget(EventBusRegistry.CmdExecResultBus.RunAsync("cmd://", _busCts.Token));
			ChatMessageChain.EnsureInitialized();
		}

		public static void EnsureInitialized()
		{
		}

		[AsyncStateMachine(typeof(<RouteCommandAsync>d__4))]
		private static UniTask RouteCommandAsync(CmdMessageEvent evt)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			<RouteCommandAsync>d__4 <RouteCommandAsync>d__ = default(<RouteCommandAsync>d__4);
			<RouteCommandAsync>d__.<>t__builder = AsyncUniTaskMethodBuilder.Create();
			<RouteCommandAsync>d__.evt = evt;
			<RouteCommandAsync>d__.<>1__state = -1;
			((AsyncUniTaskMethodBuilder)(ref <RouteCommandAsync>d__.<>t__builder)).Start<<RouteCommandAsync>d__4>(ref <RouteCommandAsync>d__);
			return ((AsyncUniTaskMethodBuilder)(ref <RouteCommandAsync>d__.<>t__builder)).Task;
		}

		private static UniTask HandleCmdExecResultAsync(CmdExecResultEvent evt)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			if (evt == null)
			{
				return UniTask.CompletedTask;
			}
			string sender = (evt.Success ? MessageStyles.SuccessLabel("Cmd") : MessageStyles.ErrorLabel("Cmd"));
			string content = evt.Stdout ?? evt.Stderr ?? string.Empty;
			string content2 = (evt.Success ? MessageStyles.SuccessContent(content) : MessageStyles.ErrorContent(content));
			PeakChatOpsUI.Instance.AddMessage(sender, content2);
			return UniTask.CompletedTask;
		}

		public static UniTask HandleAnyMessageAsync(string anyText)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			PeakChatOpsUI.Instance.AddMessage(MessageStyles.SystemLabel("Info"), MessageStyles.SystemContent(anyText));
			return UniTask.CompletedTask;
		}
	}
	public static class ChatMessageChain
	{
		[StructLayout(LayoutKind.Auto)]
		[CompilerGenerated]
		private struct <HandleLocalChatMessageAsync>d__2 : IAsyncStateMachine
		{
			public int <>1__state;

			public AsyncUniTaskMethodBuilder <>t__builder;

			public ChatMessageEvent evt;

			private Awaiter <>u__1;

			private void MoveNext()
			{
				//IL_012b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0130: Unknown result type (might be due to invalid IL or missing references)
				//IL_015d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0162: Unknown result type (might be due to invalid IL or missing references)
				//IL_016a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0145: Unknown result type (might be due to invalid IL or missing references)
				//IL_0147: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
				//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ca: Expected O, but got Unknown
				int num = <>1__state;
				try
				{
					Awaiter awaiter;
					if (num != 0)
					{
						if (evt != null && !string.IsNullOrWhiteSpace(evt.Message))
						{
							AIChatContextLogger.Instance?.LogUser(evt.Message, evt.Sender, evt.UserId);
						}
						try
						{
							object[] array = new object[5]
							{
								evt.Sender,
								evt.Message,
								evt.UserId,
								evt.IsDead,
								ConvertExtraToHashtable(evt.Extra)
							};
							PhotonNetwork.RaiseEvent((byte)81, (object)array, new RaiseEventOptions
							{
								Receivers = (ReceiverGroup)0
							}, SendOptions.SendReliable);
						}
						catch (Exception ex)
						{
							PeakChatOpsUI.Instance.AddMessage(MessageStyles.ErrorLabel(), MessageStyles.ErrorContent(ex.Message));
						}
						string sender = MessageStyles.PlayerLabel("You", isLocal: true, evt.IsDead);
						string content = MessageStyles.PlayerContent(evt.Message, isLocal: true);
						PeakChatOpsUI.Instance.AddMessage(sender, content);
						awaiter = ((UniTask)(ref UniTask.CompletedTask)).GetAwaiter();
						if (!((Awaiter)(ref awaiter)).IsCompleted)
						{
							num = (<>1__state = 0);
							<>u__1 = awaiter;
							((AsyncUniTaskMethodBuilder)(ref <>t__builder)).AwaitUnsafeOnCompleted<Awaiter, <HandleLocalChatMessageAsync>d__2>(ref awaiter, ref this);
							return;
						}
					}
					else
					{
						awaiter = <>u__1;
						<>u__1 = default(Awaiter);
						num = (<>1__state = -1);
					}
					((Awaiter)(ref awaiter)).GetResult();
				}
				catch (Exception exception)
				{
					<>1__state = -2;
					((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetException(exception);
					return;
				}
				<>1__state = -2;
				((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetResult();
			}

			void IAsyncStateMachine.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				this.MoveNext();
			}

			[DebuggerHidden]
			private