Start() public method

public Start ( ) : void
return void
コード例 #1
0
ファイル: Program.cs プロジェクト: kopscript/Angl
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        /// <param name="args">Command line arguments.</param>
        public static void Main(string[] args)
        {
            AppDomain.CurrentDomain.ProcessExit += OnProcessExit;
            AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;
            MasterServer = new MasterServer();
            MasterServer.Start();
            PrintStatus();
            PrintCommands();

            while (true)
            {
                Thread.Sleep(100);
                switch (Console.ReadLine())
                {
                    case "?":
                        PrintCommands();
                        break;
                    case "status":
                        PrintStatus();
                        break;
                    case "reboot":
                        MasterServer.Start();
                        break;
                    case "quit":
                        Environment.Exit(0);
                        return;
                }
            }
        }
コード例 #2
0
ファイル: MasterServerService.cs プロジェクト: saiboat/XMPMS
        /// <summary>
        /// Service is being started
        /// </summary>
        /// <param name="args"></param>
        protected override void OnStart(string[] args)
        {
            MasterServer.ParseCommandLineVars(String.Format("xmpms {0}", String.Join(" ", args)));

            ICommandInterface commandInterface = ModuleManager.GetModule <ICommandInterface>(typeof(TelnetCommandLine));

            if (!MasterServer.Start(null, commandInterface))
            {
                throw new InvalidOperationException("Error initialising service");
            }
        }
コード例 #3
0
        public void Invoke()
        {
            MasterServer.Start();
            Task.Run(() => { AcceptClients(); });
            Console.WriteLine("Server socket started");
            Console.WriteLine("Now accepting and handling is threaded");

            // TODO Make master give slaves work

            Workload       = PrepareWorkload(FilePath);
            DictionaryList = PrepareDictionary(DicPath);
        }
コード例 #4
0
        public void Invoke()
        {
            TotalTimeWatch = Stopwatch.StartNew();
            MasterServer.Start();
            Console.WriteLine("Reading the password file");
            Workload = PreparePasswords(FilePath);
            // TODO More dictionaries?
            DictionaryList = PrepareDictionary(DicPath[0]);
            Console.WriteLine("Dictionary completely loaded");
            Task.Run(() => { AcceptClients(); });
            Console.WriteLine("Server socket started");

            LoopTillDone();
        }
コード例 #5
0
ファイル: Form1.cs プロジェクト: mazhufeng/DataSync
        private void btnStartMonitor_Click(object sender, EventArgs e)
        {
            MasterServer _server      = new MasterServer();
            string       displayShell = ConfigurationManager.AppSettings["DisplayShell"];

            _server.DisplayShell = displayShell == "1";
            Task.Factory.StartNew(() =>
            {
                _server.Start();
            });

            MonitorBusiness bll = new MonitorBusiness();

            bll.StartWatcher();
        }
コード例 #6
0
 private void btnServer_Click(object sender, EventArgs e)
 {
     try
     {
         var task = Task.Factory.StartNew(() =>
         {
             _server.Start();
         });
         Task.WaitAll(task);
         Query();
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message);
     }
 }
コード例 #7
0
        private static void Main(string[] args)
        {
            Persist.Initialize();

            var server = new MasterServer();

            server.Start();

            Console.WriteLine("Listening on adress:  " + Constants.HostUrl);

            Console.WriteLine("Press any key to stop server");

            Console.ReadKey();

            server.Stop();
        }
コード例 #8
0
ファイル: NodeService.cs プロジェクト: franknew/SOAFramework
 protected override void OnStart(string[] args)
 {
     _server.Start();
 }
コード例 #9
0
        private void InitializeCMD()
        {
            #region Map
            _cmdList["map"] = async(string[] args) =>
            {
                if (args?.Length >= 1 && args[0] != "?")
                {
                    switch (args[0])
                    {
                    case "reload":
                        if (args.Length >= 3)
                        {
                            switch (args[1])
                            {
                            case "objects":
                                int id;
                                if (int.TryParse(args[2], out id))
                                {
                                    var maps = _maps.Where(x => x.Map.Id == id).ToArray();
                                    if (maps.Length > 0)
                                    {
                                        await DataMgr.LoadAllAsync();

                                        foreach (var item in maps)
                                        {
                                            item.Objects.Reload();
                                        }
                                    }
                                    else
                                    {
                                        Console.WriteLine($"Error: can't find maps with id {id}");
                                    }
                                }
                                else
                                {
                                    Console.WriteLine("Using: map reload objects mapID");
                                }
                                break;

                            default:
                                Console.WriteLine("Using: map reload objects mapID");
                                break;
                            }
                        }
                        else
                        {
                            Console.WriteLine("Using: map reload objects mapID");
                        }
                        break;
                    }
                }
                else
                {
                    Console.WriteLine("Using: map reload args");
                }
            };
            #endregion
            #region User
            _cmdList["user"] = async(string[] args) =>
            {
                if (args?.Length >= 1 && args[0] != "?")
                {
                    switch (args[0])
                    {
                    case "ban":
                        if (_master == null)
                        {
                            Console.WriteLine("Only Master instance can ban users!");
                            return;
                        }
                        {
                            int id   = -1;
                            int time = -1;
                            if (args.Length < 4 || !int.TryParse(args[1], out id) || !int.TryParse(args[2], out time))
                            {
                                Console.WriteLine("Using: user ban id time reason");
                            }
                            else
                            {
                                var user = await ServerDB.SelectUserAsync(id);

                                if (user.IsEmpty)
                                {
                                    Console.WriteLine($"Error: can't find user whith {id}");
                                }
                                else if (!await ServerDB.CreateBanAsync(id, null, BanType.Ban, -1, time, args[3]))
                                {
                                    Console.WriteLine($"Error: can't create ban entry");
                                }
                                else
                                {
                                    if (_master.TryGetByUserId(id, out var player))
                                    {
                                        player.Player.Disconnect($"Congratulation!{Environment.NewLine}You're Banned!");
                                    }
                                    Console.WriteLine($"User {user.Name} banned");
                                }
                            }
                            break;
                        }

                    case "unban":
                    {
                        int id = -1;
                        if (args.Length < 2 || !int.TryParse(args[1], out id))
                        {
                            Console.WriteLine("Using: user unban id");
                        }
                        else
                        {
                            var user = await ServerDB.SelectUserAsync(id);

                            if (user.IsEmpty)
                            {
                                Console.WriteLine($"Error: can't find user whith {id}");
                            }
                            else if (!await ServerDB.DeleteBanAsync(id, null, BanType.Ban))
                            {
                                Console.WriteLine($"Error: can't delete ban entry");
                            }
                            else
                            {
                                Console.WriteLine($"User {user.Name} unbanned");
                            }
                        }
                        break;
                    }

                    case "mute":
                    {
                        int id   = -1;
                        int time = -1;
                        if (args.Length < 4 || !int.TryParse(args[1], out id) || !int.TryParse(args[2], out time))
                        {
                            Console.WriteLine("Using: user mute id time reason");
                        }
                        else
                        {
                            var user = await ServerDB.SelectUserAsync(id);

                            if (user.IsEmpty)
                            {
                                Console.WriteLine($"Error: can't find user whith {id}");
                            }
                            else if (!await ServerDB.CreateBanAsync(id, null, BanType.Mute, -1, time, args[3]))
                            {
                                Console.WriteLine($"Error: can't create mute entry");
                            }
                            else
                            {
                                Console.WriteLine($"User {user.Name} muted");
                            }
                        }
                        break;
                    }

                    case "unmute":
                    {
                        int id = -1;
                        if (args.Length < 2 || !int.TryParse(args[1], out id))
                        {
                            Console.WriteLine("Using: user unmute id");
                        }
                        else
                        {
                            var user = await ServerDB.SelectUserAsync(id);

                            if (user.IsEmpty)
                            {
                                Console.WriteLine($"Error: can't find user whith {id}");
                            }
                            else if (!await ServerDB.DeleteBanAsync(id, null, BanType.Mute))
                            {
                                Console.WriteLine($"Error: can't delete mute entry");
                            }
                            else
                            {
                                Console.WriteLine($"User {user.Name} unmuted");
                            }
                        }
                        break;
                    }

                    case "create":
                        byte access = 1;
                        if (args.Length < 3 || (args.Length > 3 && !byte.TryParse(args[3], out access)))
                        {
                            Console.WriteLine("Using: user create login password <access>");
                        }
                        else if (!await ServerDB.CreateUserAsync(args[1], args[2], access))
                        {
                            Console.WriteLine($"Error: can't create user {args[1]}:{args[2]}");
                        }
                        else
                        {
                            Console.WriteLine($"Created user {args[1]}");
                        }
                        break;

                    case "info":
                    {
                        int id = -1;
                        if (args.Length < 2 || !int.TryParse(args[1], out id))
                        {
                            Console.WriteLine("Using: user info id");
                        }
                        else
                        {
                            var user = await ServerDB.SelectUserAsync(id);

                            if (user.IsEmpty)
                            {
                                Console.WriteLine($"Error: can't find user whith {id}");
                            }
                            else
                            {
                                Console.WriteLine($"User {id}, {user.Name} access {user.Access}, {(user.Session == null ? "offline" : (_master?.IsOnline(id) ?? false ? "online" : "offline/undefined"))}");
                            }
                        }
                        break;
                    }

                    case "list":
                    {
                        if (_master != null)
                        {
                            Console.WriteLine("Online[Global]:");
                            foreach (var item in _master.GetPlayers())
                            {
                                var user  = item.User;
                                var @char = item.Char;
                                if (user != null)
                                {
                                    Console.WriteLine($"User {user.ID}, \"{user.Name}\", access {user.Access}{(@char != null ? $", char level {@char.Level}, \"{@char.Pony.Name}\", map {@char.Map}" : string.Empty)}");
                                }
                            }
                        }
                        else
                        {
                            Console.WriteLine("Online[Local]:");
                            foreach (var item in _characters.GetPlayers())
                            {
                                var user = item.User;
                                if (user != null)
                                {
                                    Console.WriteLine($"User {user.ID}, {user.Name} access {user.Access}, characters screen");
                                }
                            }
                            foreach (var map in _maps)
                            {
                                foreach (var item in map.GetPlayers())
                                {
                                    var user  = item.User;
                                    var @char = item.Char;
                                    if (user != null)
                                    {
                                        Console.WriteLine($"User {user.ID}, \"{user.Name}\", access {user.Access}{(@char != null ? $", char level {@char.Level}, \"{@char.Pony.Name}\", map {@char.Map}" : string.Empty)}");
                                    }
                                }
                            }
                        }
                        break;
                    }

                    default:
                        Console.WriteLine("Using: user ban|unban|mute|unmute|info|create|list args");
                        break;
                    }
                }
                else
                {
                    Console.WriteLine("Using: user ban|unban|mute|unmute|info|create|list args");
                }
            };
            #endregion
            #region Data
            _cmdList["data"] = async(string[] args) =>
            {
                if (args?.Length >= 1 && args[0] != "?")
                {
                    if (_master != null)
                    {
                        switch (args[0])
                        {
                        case "create":
                            if (args.Length >= 2)
                            {
                                switch (args[1])
                                {
                                case "npc":
                                    if (args.Length == 8 && ushort.TryParse(args[2], out var level) && byte.TryParse(args[3], out var flags) &&
                                        ushort.TryParse(args[4], out var dialog) && byte.TryParse(args[5], out var index) && ushort.TryParse(args[6], out var movement))
                                    {
                                        try
                                        {
                                            var id = await ServerDB.CreateNpcAsync(level, flags, dialog, index, movement, args[7].ToPonyData());

                                            if (id > 0)
                                            {
                                                Console.WriteLine($"new NPC id {id} created!");
                                            }
                                            else
                                            {
                                                Console.WriteLine($"Error: can't create new npc");
                                            }
                                        }
                                        catch
                                        {
                                            Console.WriteLine($"Error: bad ponycode");
                                        }
                                    }
                                    else
                                    {
                                        Console.WriteLine("Using: data create npc level flags dialogID dialogIndex movementID ponycode");
                                    }
                                    break;

                                default:
                                    Console.WriteLine("Using: data create npc args");
                                    break;
                                }
                            }
                            else
                            {
                                Console.WriteLine("Using: data create npc args");
                            }
                            break;
                        }
                    }
                    else
                    {
                        Console.WriteLine("Error: can't find master server in this instance");
                    }
                }
                else
                {
                    Console.WriteLine("Using: data create args");
                }
            };
            #endregion
            #region Payer
            _cmdList["player"] = (string[] args) =>
            {
                if (args?.Length >= 1 && args[0] != "?")
                {
                    if (_master != null)
                    {
                        ushort id;
                        switch (args[0])
                        {
                        case "items":
                            if (args.Length >= 2)
                            {
                                switch (args[1])
                                {
                                case "clear":
                                    if (args.Length >= 3 && ushort.TryParse(args[2], out id))
                                    {
                                        var pClass = _master[id];
                                        if (pClass != null && pClass.OnMap)
                                        {
                                            pClass.Object.Player.Items.RemoveAllItems();
                                        }
                                        else
                                        {
                                            Console.WriteLine($"Error: can't find player {id}");
                                        }
                                    }
                                    else
                                    {
                                        Console.WriteLine("Using: player items clear playerID");
                                    }
                                    break;

                                case "print":
                                    if (args.Length >= 3 && ushort.TryParse(args[2], out id))
                                    {
                                        var pClass = _master[id];
                                        if (pClass != null && pClass.OnMap)
                                        {
                                            foreach (var item in pClass.Char.Data.Items)
                                            {
                                                Console.WriteLine($"{item.Key:X4}[{item.Value.Item.Id:X8}:{item.Value.Amount:X8}]");
                                            }
                                        }
                                        else
                                        {
                                            Console.WriteLine($"Error: can't find player {id}");
                                        }
                                    }
                                    else
                                    {
                                        Console.WriteLine("Using: player items print playerID");
                                    }
                                    break;

                                default:
                                    Console.WriteLine("Using: player items clear|print args");
                                    break;
                                }
                            }
                            else
                            {
                                Console.WriteLine("Using: player items clear|print args");
                            }
                            break;

                        case "dialogs":
                            if (args.Length >= 2)
                            {
                                switch (args[1])
                                {
                                case "clear":
                                    if (args.Length >= 3 && ushort.TryParse(args[2], out id))
                                    {
                                        var pClass = _master[id];
                                        if (pClass != null && pClass.OnMap)
                                        {
                                            pClass.Char.Data.Dialogs.Clear();
                                        }
                                        else
                                        {
                                            Console.WriteLine($"Error: can't find player {id}");
                                        }
                                    }
                                    else
                                    {
                                        Console.WriteLine("Using: player dialogs clear playerID");
                                    }
                                    break;

                                case "print":
                                    if (args.Length >= 3 && ushort.TryParse(args[2], out id))
                                    {
                                        var pClass = _master[id];
                                        if (pClass != null && pClass.OnMap)
                                        {
                                            foreach (var item in pClass.Char.Data.Dialogs)
                                            {
                                                Console.WriteLine($"{item.Key:X8}:{item.Value:X4}");
                                            }
                                        }
                                        else
                                        {
                                            Console.WriteLine($"Error: can't find player {id}");
                                        }
                                    }
                                    else
                                    {
                                        Console.WriteLine("Using: player dialogs print playerID");
                                    }
                                    break;

                                default:
                                    Console.WriteLine("Using: player dialogs clear|print args");
                                    break;
                                }
                            }
                            else
                            {
                                Console.WriteLine("Using: player dialogs clear|print args");
                            }
                            break;

                        case "kill":
                            if (args.Length >= 1 && ushort.TryParse(args[1], out id))
                            {
                                var pClass = _master[id];
                                if (pClass != null && pClass.OnMap)
                                {
                                    (pClass.RoomPlayer as MapPlayer).Object.Despawn();
                                }
                                else
                                {
                                    Console.WriteLine($"Error: can't find player {id}");
                                }
                            }
                            else
                            {
                                Console.WriteLine("Using: player kill playerID");
                            }
                            break;

                        default:
                            Console.WriteLine("Using: player kill|dialogs|items args");
                            break;
                        }
                    }
                    else
                    {
                        Console.WriteLine("Error: can't find master server in this instance");
                    }
                }
                else
                {
                    Console.WriteLine("Using: player kill|dialogs|items args");
                }
            };
            #endregion
            #region Status
            _cmdList["status"] = (string[] args) =>
            {
                if (args?.Length >= 1 && args[0] != "?")
                {
                    switch (args[0])
                    {
                    case "servers":
                        if (_master != null)
                        {
                            Console.WriteLine(_master.Status);
                        }
                        if (_characters != null)
                        {
                            Console.WriteLine(_characters.Status);
                        }
                        foreach (var item in _maps)
                        {
                            Console.WriteLine(item.Status);
                        }
                        break;

                    case "player":
                        ushort player;
                        if (args.Length >= 2 && ushort.TryParse(args[1], out player))
                        {
                            if (_master != null)
                            {
                                var pClass = _master[player];
                                if (pClass != null && pClass.RoomPlayer != null)
                                {
                                    Console.WriteLine(pClass.RoomPlayer.Status);
                                }
                                else
                                {
                                    Console.WriteLine($"Error: can't determine status for {player}");
                                }
                            }
                            else
                            {
                                Console.WriteLine("Error: can't find master server in this instance");
                            }
                        }
                        else
                        {
                            Console.WriteLine("Using: status player id");
                        }
                        break;

                    default:
                        Console.WriteLine("Using: status servers|player args");
                        break;
                    }
                }
                else
                {
                    Console.WriteLine("Using: status servers|player args");
                }
            };
            #endregion
            #region Object
            _cmdList["object"] = async(string[] args) =>
            {
                if (args?.Length >= 1 && args[0] != "?")
                {
                    if (_master != null)
                    {
                        switch (args[0])
                        {
                        case "create":
                            if (args.Length >= 3 && args[1] == "at")
                            {
                                switch (args[2])
                                {
                                case "player":
                                    if (args.Length >= 9 && ushort.TryParse(args[3], out var id) && ushort.TryParse(args[4], out var guid) && int.TryParse(args[5], out var objectID) &&
                                        byte.TryParse(args[6], out var type) && byte.TryParse(args[7], out var flags) && float.TryParse(args[8], out var time))
                                    {
                                        var pClass = _master[id];
                                        if (pClass != null && pClass.OnMap)
                                        {
                                            if (args.Length < 10 || !int.TryParse(args[09], out var data01))
                                            {
                                                data01 = -1;
                                            }
                                            if (args.Length < 11 || !int.TryParse(args[10], out var data02))
                                            {
                                                data02 = -1;
                                            }
                                            if (args.Length < 12 || !int.TryParse(args[11], out var data03))
                                            {
                                                data03 = -1;
                                            }
                                            if (await ServerDB.CreateObjectAtAsync(pClass.Object, pClass.User.Map, guid, objectID, type, flags, time, data01, data02, data03))
                                            {
                                                Console.WriteLine($"Object [{guid}:{objectID}] created at map {pClass.User.Map} pos {pClass.Object.Position}");
                                            }
                                            else
                                            {
                                                Console.WriteLine($"Error: can't create object [{guid}:{objectID}]");
                                            }
                                        }
                                        else
                                        {
                                            Console.WriteLine($"Error: can't determine position for {id}");
                                        }
                                    }
                                    else
                                    {
                                        Console.WriteLine("Using: object create at player playerID guid objectID type flags time dataArgs");
                                    }
                                    break;

                                default:
                                    Console.WriteLine("Using: object create at player args");
                                    break;
                                }
                            }
                            else
                            {
                                Console.WriteLine("Using: object create at player args");
                            }
                            break;
                        }
                    }
                    else
                    {
                        Console.WriteLine("Error: can't find master server in this instance");
                    }
                }
                else
                {
                    Console.WriteLine("Using: object create args");
                }
            };
            #endregion
            #region Restart
            _cmdList["restart"] = async(string[] args) =>
            {
                if (args?.Length >= 1 && args[0] != "?")
                {
                    switch (args[0])
                    {
                    case "all":
                        _master?.Stop();
                        _characters?.Stop();
                        foreach (var item in _maps)
                        {
                            item.Stop();
                        }
                        await DataMgr.LoadAllAsync();

                        _master?.Start();
                        _characters?.Start();
                        foreach (var item in _maps)
                        {
                            item.Start();
                        }
                        break;

                    case "maps":
                        foreach (var item in _maps)
                        {
                            item.Restart();
                        }
                        break;
                    }
                }
                else
                {
                    Console.WriteLine("Using: restart all|maps");
                }
            };
            #endregion
            #region Small CMD
            _cmdList["exit"]  = (string[] args) => { IsRunning = false; };
            _cmdList["clear"] = (string[] args) => { Console.Clear(); };
            _cmdList["help"]  = (string[] args) =>
            {
                Console.WriteLine("Available commands:");
                foreach (var item in _cmdList.Keys)
                {
                    Console.WriteLine(item);
                }
            };
            #endregion
        }
コード例 #10
0
        static async Task Main(string[] args)
        {
            var serilogger = new LoggerConfiguration()
                             .WriteTo.File("log.txt", rollingInterval: RollingInterval.Day)
                             .CreateLogger();
            var loggerFactory = LoggerFactory.Create(builder =>
            {
                builder
                // .AddFilter("Microsoft", LogLevel.Warning)
                // .AddFilter("System", LogLevel.Warning)
                // .AddFilter("LoggingConsoleApp.Program", LogLevel.Debug)
                .AddSerilog(serilogger)
                .AddConsole();
            });

            _logger = loggerFactory.CreateLogger <Program>();

            // Register extensions to Json.NET Serialization
            JsonConvert.DefaultSettings = () => new JsonSerializerSettings
            {
                Converters = new List <JsonConverter>
                {
                    new MathJsonConverter(),
                    Converter.DateTimeConverter,
                    Converter.BinaryConverter,
                    Converter.GroupingConverter,
                    Converter.PocoExprConverter
                }
            };
            Converter.Serializer.Converters.Add(new MathJsonConverter());

            // Register extensions to MessagePack Serialization
            var resolver = CompositeResolver.Create(
                MathResolver.Instance,
                NativeGuidResolver.Instance,
                StandardResolver.Instance
                );
            var options = MessagePackSerializerOptions.Standard.WithResolver(resolver);

            MessagePackSerializer.DefaultOptions = options;

            var connection = R.Connection().Hostname("asgard.gamecult.games")
                             .Port(RethinkDBConstants.DefaultPort).Timeout(60).Connect();

            var cache = new DatabaseCache();

            // When entries are changed locally, push the changes to RethinkDB
            cache.OnDataUpdateLocal += async entry =>
            {
                var table  = entry.GetType().GetCustomAttribute <RethinkTableAttribute>()?.TableName ?? "Other";
                var result = await R.Db("Aetheria").Table(table).Update(entry).RunAsync(connection);

                _logger.Log(LogLevel.Information, $"Uploaded entry to RethinkDB: {entry.ID} result: {result}");
            };

            cache.OnDataInsertLocal += async entry =>
            {
                var table    = entry.GetType().GetCustomAttribute <RethinkTableAttribute>()?.TableName ?? "Other";
                var inserted = false;
                for (int i = 0; i < 5 && !inserted; i++)
                {
                    try
                    {
                        var result = await R.Db("Aetheria").Table(table).Insert(entry).RunAsync(connection);

                        _logger.Log(LogLevel.Information, $"Inserted entry to RethinkDB: {entry.ID} result: {result}");
                        inserted = true;
                    }
                    catch (Exception e)
                    {
                        _logger.LogError(e, e.Message);
                    }
                }
                if (!inserted)
                {
                    _logger.LogError("Failed to insert after 5 attempts!");
                }
            };

            cache.OnDataDeleteLocal += async entry =>
            {
                var table  = entry.GetType().GetCustomAttribute <RethinkTableAttribute>()?.TableName ?? "Other";
                var result = await R.Db("Aetheria").Table(table).Get(entry.ID).Delete().RunAsync(connection);

                _logger.Log(LogLevel.Information, $"Deleted entry from RethinkDB: {entry.ID} result: {result}");
            };

            // Get data from RethinkDB
            await GetTable("Items", connection, cache);
            await GetTable("Galaxy", connection, cache);
            await GetTable("Users", connection, cache);

            // Subscribe to changes from RethinkDB
            SubscribeTable("Items", connection, cache);
            SubscribeTable("Galaxy", connection, cache);
            SubscribeTable("Users", connection, cache);

            var server = new MasterServer(cache)
            {
                Logger = _logger
            };

            server.Start();

            var context = new GameContext(cache, s => _logger.Log(LogLevel.Information, s));

            context.MapLayers = cache.GetAll <GalaxyMapLayerData>().ToDictionary(m => m.Name);

            server.AddMessageListener <GalaxyRequestMessage>(galaxyRequest => galaxyRequest.Peer.Send(
                                                                 new GalaxyResponseMessage
            {
                Zones = cache.GetAll <ZoneData>().Select(zd =>
                                                         new GalaxyResponseZone
                {
                    Name     = zd.Name,
                    Position = zd.Position,
                    ZoneID   = zd.ID,
                    Links    = zd.Wormholes?.ToArray() ?? Array.Empty <Guid>()
                }).ToArray(),
                GlobalData  = context.GlobalData,
                StarDensity = context.MapLayers["StarDensity"]
            }));

            server.AddMessageListener <BlueprintsRequestMessage>(blueprintRequest => blueprintRequest.Peer.Send(
                                                                     new BlueprintsResponseMessage
            {
                Blueprints = cache.GetAll <BlueprintData>().ToArray()
            }));

            server.AddMessageListener <ZoneRequestMessage>(zoneRequest =>
            {
                var zone = cache.Get <ZoneData>(zoneRequest.ZoneID);

                // Zone has not been populated, generate the contents now!
                if (!zone.Visited)
                {
                    zone.Visited = true;
                    OrbitData[] orbits;
                    PlanetData[] planets;
                    ZoneGenerator.GenerateZone(
                        global: context.GlobalData,
                        zone: zone,
                        mapLayers: context.MapLayers.Values,
                        resources: cache.GetAll <SimpleCommodityData>().Where(i => i.ResourceDensity.Any()),
                        orbitData: out orbits,
                        planetsData: out planets);
                    cache.AddAll(orbits);
                    cache.AddAll(planets);
                    cache.Add(zone);
                }
                zoneRequest.Peer.Send(
                    new ZoneResponseMessage
                {
                    Zone     = zone,
                    Contents = zone.Orbits.Select(id => cache.Get(id))
                               .Concat(zone.Planets.Select(id => cache.Get(id)))
                               .Concat(zone.Stations.Select(id => cache.Get(id))).ToArray()
                });
            });

            Observable.Timer(DateTimeOffset.Now, TimeSpan.FromSeconds(60)).SubscribeOn(NewThreadScheduler.Default).Subscribe(_ =>
            {
                _logger.Log(LogLevel.Information, R.Now().Run <DateTime>(connection).ToString() as string);
            });

            while (true)
            {
                Thread.Sleep(100);
            }
        }