public async Task MainAsync() { WriteTitle(); if (!File.Exists(CONFIG_PATH)) { File.WriteAllText(CONFIG_PATH, JsonConvert.SerializeObject(new Config(), Formatting.Indented)); WriteLogMessage("A config.json file was generated. Please configure it to the proper settings and re-run!", ConsoleColor.Yellow); Console.ReadKey(); Environment.Exit(0); } else { conf = JsonConvert.DeserializeObject <Config>(File.ReadAllText(CONFIG_PATH)); try { var asm = Assembly.LoadFile(Directory.GetCurrentDirectory() + @"\" + conf.TransportDLL); WriteLogMessage($"Loaded Assembly: {asm.FullName}", ConsoleColor.Green); transport = asm.CreateInstance(conf.TransportClass) as Transport; if (transport != null) { var transportClass = asm.GetType(conf.TransportClass); WriteLogMessage($"Loaded Transport: {transportClass.Name}! Loading Methods...", ConsoleColor.Green); CheckMethods(transportClass); if (_awakeMethod != null) { _awakeMethod.Invoke(transport, null); WriteLogMessage("Called Awake on transport.", ConsoleColor.Yellow); } if (_startMethod != null) { _awakeMethod.Invoke(transport, null); WriteLogMessage("Called Start on transport.", ConsoleColor.Yellow); } WriteLogMessage("Starting Transport...", ConsoleColor.Green); transport.OnServerError = (clientID, error) => { WriteLogMessage($"Transport Error, Client: {clientID}, Error: {error}", ConsoleColor.Red); }; transport.OnServerConnected = (clientID) => { WriteLogMessage($"Transport Connected, Client: {clientID}", ConsoleColor.Cyan); _currentConnections.Add(clientID); _relay.ClientConnected(clientID); }; _relay = new RelayHandler(transport.GetMaxPacketSize(0)); transport.OnServerDataReceived = _relay.HandleMessage; transport.OnServerDisconnected = (clientID) => { _currentConnections.Remove(clientID); _relay.HandleDisconnect(clientID); }; transport.ServerStart(); WriteLogMessage("Transport Started!", ConsoleColor.Green); } else { WriteLogMessage("Transport Class not found! Please make sure to include namespaces.", ConsoleColor.Red); Console.ReadKey(); Environment.Exit(0); } } catch (Exception e) { WriteLogMessage("Exception: " + e, ConsoleColor.Red); Console.ReadKey(); Environment.Exit(0); } } while (true) { if (_updateMethod != null) { _updateMethod.Invoke(transport, null); } if (_lateUpdateMethod != null) { _lateUpdateMethod.Invoke(transport, null); } _currentHeartbeatTimer++; if (_currentHeartbeatTimer >= conf.UpdateHeartbeatInterval) { _currentHeartbeatTimer = 0; for (int i = 0; i < _currentConnections.Count; i++) { transport.ServerSend(_currentConnections[i], 0, new ArraySegment <byte>(new byte[] { 200 })); } GC.Collect(); } await Task.Delay(conf.UpdateLoopTime); } }
private void ConfigureTransport(Assembly asm) { var transportClass = asm.GetType(conf.TransportClass); WriteLogMessage("OK", ConsoleColor.Green); WriteLogMessage("\nLoading Transport Methods... ", ConsoleColor.White, true); CheckMethods(transportClass); WriteLogMessage("OK", ConsoleColor.Green); WriteLogMessage("\nInvoking Transport Methods..."); if (_awakeMethod != null) { _awakeMethod.Invoke(transport, null); } if (_startMethod != null) { _startMethod.Invoke(transport, null); } WriteLogMessage("\nStarting Transport... ", ConsoleColor.White, true); transport.OnServerError = (clientID, error) => { WriteLogMessage($"Transport Error, Client: {clientID}, Error: {error}", ConsoleColor.Red); }; transport.OnServerConnected = (clientID) => { WriteLogMessage($"Transport Connected, Client: {clientID}", ConsoleColor.Cyan); _currentConnections.Add(clientID); _relay.ClientConnected(clientID); if (conf.EnableNATPunchtroughServer) { string natID = Guid.NewGuid().ToString(); _pendingNATPunches.Add(clientID, natID); _NATRequestPosition = 0; _NATRequest.WriteByte(ref _NATRequestPosition, (byte)OpCodes.RequestNATConnection); _NATRequest.WriteString(ref _NATRequestPosition, natID); _NATRequest.WriteInt(ref _NATRequestPosition, conf.NATPunchtroughPort); transport.ServerSend(clientID, 0, new ArraySegment <byte>(_NATRequest, 0, _NATRequestPosition)); } }; _relay = new RelayHandler(transport.GetMaxPacketSize(0)); transport.OnServerDataReceived = _relay.HandleMessage; transport.OnServerDisconnected = (clientID) => { _currentConnections.Remove(clientID); _relay.HandleDisconnect(clientID); if (NATConnections.ContainsKey(clientID)) { NATConnections.Remove(clientID); } if (_pendingNATPunches.TryGetByFirst(clientID, out _)) { _pendingNATPunches.Remove(clientID); } }; transport.ServerStart(conf.TransportPort); WriteLogMessage("OK", ConsoleColor.Green); }