Browse Source

Reorganize project and use latest API features

master
NorbiPeti 4 years ago
parent
commit
8d2d11b736
4 changed files with 51 additions and 99 deletions
  1. +9
    -38
      GCDC/DiscordClient.cs
  2. +0
    -43
      GCDC/DiscordEngineInjectionPatch.cs
  3. +4
    -4
      GCDC/GCDC.csproj
  4. +38
    -14
      GCDC/GCDCPlugin.cs

GCDC/TextBlockUpdateEngine.cs → GCDC/DiscordClient.cs View File

@@ -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<string> messages = new Queue<string>();
private readonly GCDCPlugin plugin;
public DiscordClient(GCDCPlugin plugin) => this.plugin = plugin;
public void Ready()
{
if (!RuntimeCommands.HasRegistered("dc"))
RuntimeCommands.Register<string>("dc", SendMessage);
if (!RuntimeCommands.HasRegistered("dcsetup"))
RuntimeCommands.Register<string>("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<string>() == "OK")
if (JObject.Parse(WebUtils.Request("users/get?token=" + tokenOrChannel))["response"]?.Value<string>() == "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<string>() == "OK")
if (resp["response"]?.Value<string>() == "OK")
{
AddMessage("<nobr><" + 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<string> messages = new Queue<string>();
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) : "<No messages yet>";
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);
}
}

+ 0
- 43
GCDC/DiscordEngineInjectionPatch.cs View File

@@ -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;
}

}
}

+ 4
- 4
GCDC/GCDC.csproj View File

@@ -11,8 +11,8 @@
<AssemblyName>GCDC</AssemblyName>
<TargetFramework>net472</TargetFramework>
<FileAlignment>512</FileAlignment>
<AssemblyVersion>0.0.2.0</AssemblyVersion>
<FileVersion>0.0.2.0</FileVersion>
<AssemblyVersion>1.0.0.0</AssemblyVersion>
<FileVersion>1.0.0.0</FileVersion>
<ProductVersion>0.0.2.0</ProductVersion>
<Product>GCDC</Product>
<ProductName>GCDC</ProductName>
@@ -52,7 +52,7 @@
<Reference Include="Gamecraft.Blocks.ConsoleBlock, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\..\ref\Gamecraft_Data\Managed\Gamecraft.Blocks.ConsoleBlock.dll</HintPath>
</Reference>
<Reference Include="GamecraftModdingAPI, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null">
<Reference Include="GamecraftModdingAPI">
<HintPath>..\..\GamecraftModdingAPI\GamecraftModdingAPI\bin\Debug\net472\GamecraftModdingAPI.dll</HintPath>
</Reference>
<Reference Include="IllusionPlugin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
@@ -61,7 +61,7 @@
<Reference Include="MultiplayerNetworking, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\..\ref\Gamecraft_Data\Managed\MultiplayerNetworking.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=12.0.1.0, Culture=neutral, PublicKeyToken=null">
<Reference Include="Newtonsoft.Json">
<HintPath>..\..\ref\Gamecraft_Data\Managed\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="RobocraftX.AccountPreferences, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">


+ 38
- 14
GCDC/GCDCPlugin.cs View File

@@ -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<string>(client.SendMessage).Build();
CommandBuilder.Builder("dcsetup", "Initial setup for GCDC. The argument is the channel ID first. For example: dcsetup \"420159832423923714\"")
.Action<string>(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<string> messages)
{
UpdateEnum(messages).RunOn(ExtraLean.EveryFrameStepRunner_RUNS_IN_TIME_STOPPED_AND_RUNNING);
}

private IEnumerator UpdateEnum(Queue<string> messages)
{
var txt = messages.Count > 0
? messages.Aggregate((current, msg) => current + "\n" + msg)
: "<No messages yet>";
RuntimeCommands.Call("ChangeTextBlockCommand", "Discord", txt);
yield break;
}

public void OnApplicationQuit()
{
harmony?.UnpatchAll(HarmonyID);
}

public void OnLevelWasLoaded(int level)


Loading…
Cancel
Save