aboutsummaryrefslogtreecommitdiff
path: root/ShiftOS_TheReturn/ServerManager.cs
diff options
context:
space:
mode:
authorMichael <[email protected]>2017-05-26 17:06:38 -0400
committerMichael <[email protected]>2017-05-26 17:06:38 -0400
commit97e22b35ada5898fdcb2556628f764d927cff913 (patch)
tree88f40abbed43100bb393083ccecc81893a2447f7 /ShiftOS_TheReturn/ServerManager.cs
parent798f0e5920fb5dc564cf6adab60e3c909197e736 (diff)
downloadshiftos_thereturn-97e22b35ada5898fdcb2556628f764d927cff913.tar.gz
shiftos_thereturn-97e22b35ada5898fdcb2556628f764d927cff913.tar.bz2
shiftos_thereturn-97e22b35ada5898fdcb2556628f764d927cff913.zip
SLIGHT optimizations?
Diffstat (limited to 'ShiftOS_TheReturn/ServerManager.cs')
-rw-r--r--ShiftOS_TheReturn/ServerManager.cs62
1 files changed, 62 insertions, 0 deletions
diff --git a/ShiftOS_TheReturn/ServerManager.cs b/ShiftOS_TheReturn/ServerManager.cs
index 95e86e9..217b9ee 100644
--- a/ShiftOS_TheReturn/ServerManager.cs
+++ b/ShiftOS_TheReturn/ServerManager.cs
@@ -36,6 +36,8 @@ using static ShiftOS.Engine.SaveSystem;
using Newtonsoft.Json;
using System.Net.Sockets;
using System.Diagnostics;
+using System.IO;
+using System.Reflection;
namespace ShiftOS.Engine
{
@@ -104,6 +106,43 @@ Ping: {ServerManager.DigitalSocietyPing} ms
/// </summary>
public static event Action<string> GUIDReceived;
+ private static void delegateToServer(ServerMessage msg)
+ {
+ string[] split = msg.GUID.Split('|');
+ bool finished = false;
+ foreach (var exec in Directory.GetFiles(Environment.CurrentDirectory))
+ {
+ if(exec.ToLower().EndsWith(".exe") || exec.ToLower().EndsWith(".dll"))
+ {
+ try
+ {
+ var asm = Assembly.LoadFile(exec);
+ foreach(var type in asm.GetTypes().Where(x => x.GetInterfaces().Contains(typeof(Server))))
+ {
+ var attrib = type.GetCustomAttributes().FirstOrDefault(x => x is ServerAttribute) as ServerAttribute;
+ if(attrib != null)
+ {
+ if(split[0] == SaveSystem.CurrentSave.SystemName && split[1] == attrib.Port.ToString())
+ {
+ if (Shiftorium.UpgradeAttributesUnlocked(type))
+ {
+ type.GetMethods(BindingFlags.Public | BindingFlags.Instance).FirstOrDefault(x => x.Name == "MessageReceived")?.Invoke(Activator.CreateInstance(type), null);
+ finished = true;
+ }
+ }
+ }
+ }
+ }
+ catch { }
+ }
+ }
+ if (finished == false)
+ {
+ Forward(split[2], "Error", $"{split[0]}:{split[1]}: connection refused");
+ }
+ }
+
+
private static void ServerManager_MessageReceived(ServerMessage msg)
{
switch(msg.Name)
@@ -119,12 +158,35 @@ Ping: {ServerManager.DigitalSocietyPing} ms
}));
}
break;
+ case "msgtosys":
+ try
+ {
+ var m = JsonConvert.DeserializeObject<ServerMessage>(msg.Contents);
+ if(m.GUID.Split('|')[2] != thisGuid.ToString())
+ {
+ delegateToServer(m);
+ }
+ }
+ catch { }
+ break;
case "getguid_reply":
GUIDReceived?.Invoke(msg.Contents);
break;
}
}
+ public static void SendMessageToIngameServer(string sysname, int port, string title, string contents)
+ {
+ var smsg = new ServerMessage
+ {
+ Name = title,
+ GUID = $"{sysname}|{port}|{thisGuid.ToString()}",
+ Contents = contents
+ };
+ Forward("all", "msgtosys", JsonConvert.SerializeObject(smsg));
+
+ }
+
public static void Detach_ServerManager_MessageReceived()
{
MessageReceived -= new ServerMessageReceived(ServerManager_MessageReceived);