diff --git a/GCDC/TextBlockUpdateEngine.cs b/GCDC/DiscordClient.cs similarity index 71% rename from GCDC/TextBlockUpdateEngine.cs rename to GCDC/DiscordClient.cs index ab68626..b0e1195 100644 --- a/GCDC/TextBlockUpdateEngine.cs +++ b/GCDC/DiscordClient.cs @@ -17,18 +17,16 @@ using uREPL; namespace GCDC { - public class TextBlockUpdateEngine : IDeterministicTimeStopped, IDeterministicTimeRunning, IApiEngine, IUnorderedInitializeOnTimeStoppedModeEntered + public class DiscordClient { private string _token; private bool _running; private Thread _rect; + private readonly Queue messages = new Queue(); + private readonly GCDCPlugin plugin; + public DiscordClient(GCDCPlugin plugin) => this.plugin = plugin; public void Ready() { - if (!RuntimeCommands.HasRegistered("dc")) - RuntimeCommands.Register("dc", SendMessage); - if (!RuntimeCommands.HasRegistered("dcsetup")) - RuntimeCommands.Register("dcsetup", Setup, - "Initial setup for GCDC. The argument is the channel ID first."); if (File.Exists("gcdc.json")) { var jo = JObject.Load(new JsonTextReader(File.OpenText("gcdc.json"))); @@ -59,7 +57,7 @@ namespace GCDC { try { - if (JObject.Parse(WebUtils.Request("users/get?token=" + tokenOrChannel))["response"].Value() == "OK") + if (JObject.Parse(WebUtils.Request("users/get?token=" + tokenOrChannel))["response"]?.Value() == "OK") { _token = tokenOrChannel; var jo = new JObject {["token"] = tokenOrChannel}; @@ -91,8 +89,7 @@ namespace GCDC { var parameters = "token=" + _token + "&message=" + message; var resp = JObject.Parse(WebUtils.Request("messages/send?" + parameters, "")); - if (resp["response"] - .Value() == "OK") + if (resp["response"]?.Value() == "OK") { AddMessage("<" + resp["username"] + "> " + message); Log.Output("Message sent"); @@ -135,46 +132,20 @@ namespace GCDC _rect.Start(); } - public EntitiesDB entitiesDB { get; set; } - public string name { get; } = "GCDC-TextUpdate"; - private volatile Queue messages = new Queue(); - private volatile bool updatedTextBlock; - - public JobHandle SimulatePhysicsStep( - in float deltaTime, - in PhysicsUtility utility, - in PlayerInput[] playerInputs) //Gamecraft.Blocks.ConsoleBlock.dll - { - if (updatedTextBlock) - return new JobHandle(); - var txt = messages.Count > 0 ? messages.Aggregate((current, msg) => current + "\n" + msg) : ""; - RuntimeCommands.Call("ChangeTextBlockCommand", "Discord", txt); - updatedTextBlock = true; - - return new JobHandle(); - } - public void AddMessage(string message) { messages.Enqueue(message); if (messages.Count > 10) messages.Dequeue(); - updatedTextBlock = false; - } - - public JobHandle OnInitializeTimeStoppedMode() - { - updatedTextBlock = false; //Update text block - return new JobHandle(); + plugin.Update(messages); } - public void Dispose() + public void Stop() { _running = false; _rect.Interrupt(); } - public string Name { get; } = "GCDCEngine"; - public bool isRemovable { get; } = false; + public void Update() => plugin.Update(messages); } } \ No newline at end of file diff --git a/GCDC/DiscordEngineInjectionPatch.cs b/GCDC/DiscordEngineInjectionPatch.cs deleted file mode 100644 index e72d042..0000000 --- a/GCDC/DiscordEngineInjectionPatch.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Reflection; -using Gamecraft.Blocks.ConsoleBlock; -using HarmonyLib; -using RobocraftX; -using RobocraftX.GUI.CommandLine; -using RobocraftX.Multiplayer; -using RobocraftX.Services.MultiplayerNetworking; -using RobocraftX.StateSync; -using Svelto.ECS; -using Unity.Entities; -using UnityEngine; - -namespace GCDC -{ - [HarmonyPatch] - public class DiscordEngineInjectionPatch - { - static void Postfix(EnginesRoot enginesRoot, in StateSyncRegistrationHelper stateSyncReg, bool isAuthoritative) - { - if (isAuthoritative) - { - stateSyncReg.AddDeterministicEngine(new TextBlockUpdateEngine()); - Debug.Log($"Added Discord text block update engine"); - } - else - Debug.Log("Not authoritative, not adding Discord engine"); - } - - static MethodBase TargetMethod() - { - return _ComposeMethodInfo(ConsoleBlockCompositionRoot.Compose); - } - - private delegate void ComposeAction(EnginesRoot er, in StateSyncRegistrationHelper ssrh, - NetworkReceivers networkReceivers, NetworkSender networkSende, bool isAuthoritative); - private static MethodInfo _ComposeMethodInfo(ComposeAction a) - { - return a.Method; - } - - } -} \ No newline at end of file diff --git a/GCDC/GCDC.csproj b/GCDC/GCDC.csproj index 1f4b1e4..ea56bba 100644 --- a/GCDC/GCDC.csproj +++ b/GCDC/GCDC.csproj @@ -11,8 +11,8 @@ GCDC net472 512 - 0.0.2.0 - 0.0.2.0 + 1.0.0.0 + 1.0.0.0 0.0.2.0 GCDC GCDC @@ -52,7 +52,7 @@ ..\..\ref\Gamecraft_Data\Managed\Gamecraft.Blocks.ConsoleBlock.dll - + ..\..\GamecraftModdingAPI\GamecraftModdingAPI\bin\Debug\net472\GamecraftModdingAPI.dll @@ -61,7 +61,7 @@ ..\..\ref\Gamecraft_Data\Managed\MultiplayerNetworking.dll - + ..\..\ref\Gamecraft_Data\Managed\Newtonsoft.Json.dll diff --git a/GCDC/GCDCPlugin.cs b/GCDC/GCDCPlugin.cs index a4ab15c..10e4e21 100644 --- a/GCDC/GCDCPlugin.cs +++ b/GCDC/GCDCPlugin.cs @@ -1,31 +1,55 @@ -using System.Reflection; -using HarmonyLib; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using GamecraftModdingAPI.App; +using GamecraftModdingAPI.Commands; using IllusionPlugin; +using RobocraftX.Schedulers; +using Svelto.Tasks.ExtraLean; using UnityEngine; +using uREPL; namespace GCDC { public class GCDCPlugin : IPlugin { - public string Name { get; } = "GCDC"; - public string Version { get; } = "v0.0.1"; - public static Harmony harmony { get; protected set; } - public const string HarmonyID = "io.github.norbipeti.GCDC"; - + public string Name { get; } = Assembly.GetExecutingAssembly().GetName().Name; + public string Version { get; } = Assembly.GetExecutingAssembly().GetName().Version.ToString(); + public void OnApplicationStart() { - if (harmony == null) - { - harmony = new Harmony(HarmonyID); - harmony.PatchAll(Assembly.GetExecutingAssembly()); - } - + GamecraftModdingAPI.Main.Init(); + var client = new DiscordClient(this); + CommandBuilder.Builder("dc", "Send messages to Discord.") + .Action(client.SendMessage).Build(); + CommandBuilder.Builder("dcsetup", "Initial setup for GCDC. The argument is the channel ID first. For example: dcsetup \"420159832423923714\"") + .Action(client.Setup).Build(); + Game.Enter += (sender, e) => + client.Ready(); + Game.Edit += (sender, e) => + client.Update(); //Update text block + Game.Exit += (sender, e) => + client.Stop(); Debug.Log("GCDC loaded"); } + public void Update(Queue messages) + { + UpdateEnum(messages).RunOn(ExtraLean.EveryFrameStepRunner_RUNS_IN_TIME_STOPPED_AND_RUNNING); + } + + private IEnumerator UpdateEnum(Queue messages) + { + var txt = messages.Count > 0 + ? messages.Aggregate((current, msg) => current + "\n" + msg) + : ""; + RuntimeCommands.Call("ChangeTextBlockCommand", "Discord", txt); + yield break; + } + public void OnApplicationQuit() { - harmony?.UnpatchAll(HarmonyID); } public void OnLevelWasLoaded(int level)