public Guid CreateRoom(Dictionary <byte, object> properties, Dictionary <Guid, Dictionary <byte, object> > players, Guid?roomId)
        {
            lock (_syncPeersList)
            {
                if (roomId.HasValue && _rooms.ContainsKey(roomId.Value))
                {
                    var message = $"Failed to create room: room with specified id already exists ({roomId})";
                    _logger.Error(message);
                    throw new Exception(message);
                }

                var roomPropertiesContainer = new RoomPropertiesContainer(_logger);
                var packetSender            = new PacketBatchSender(_taskSchedulerFactory, _config, _logger);

                packetSender.Start(true);

                roomPropertiesContainer.Initialize(players, properties);

                var room = new Room(_logger, _taskSchedulerFactory, this, roomPropertiesContainer,
                                    _roomControllerFactory, packetSender, roomId ?? Guid.NewGuid(), _roomStateUpdater);

                if (_rooms.TryAdd(room.GetRoomId(), room))
                {
                    _gameMetrics.TrackRoomCreated();
                }
                return(room.GetRoomId());
            }
        }
        public static MmApplication GetMm(ushort mmPort, ushort gamePort, GameApplication gameApplication, int maximumPlayers = 2, int mmTime = 10000, int ddosConnectionsLevel = 300, int ddosConnectionCheckInterval = 5000)
        {
            var socketFactory = new LiteNetSockFactory();
            var serializer    = new BinarySerializer();
            var serverLogger  = new ConsoleLogger("M ", LogLevel.Error | LogLevel.Info | LogLevel.Debug);

            var config = new ApplicationConfig
            {
                PublicDomainNameOrAddress = "127.0.0.1",
                ListenPorts = new List <ushort> {
                    mmPort
                },
                BindToPortHttp               = 7002,
                MaxPacketSize                = 300,
                BasePacketBufferSize         = 64,
                SendTickTimeMs               = 20,
                SocketTickTimeMs             = 10,
                SocketType                   = SocketType.BareSocket,
                ReceiveTickTimeMs            = 20,
                IsConnectionDdosProtectionOn = false
            };
            var roomPropertiesProvider = new FakeRoomPropertiesProvider3(250, maximumPlayers, mmTime);
            var taskSchedulerFactory   = new TaskSchedulerFactory(serverLogger);
            var requestSender          = new FakeSenderWithGameApplication(gameApplication, new Dictionary <byte, object> {
                { PropertyCode.RoomProperties.GameMode, (byte)GameMode.SinglePlayer }
            }, CreateRoomDelegate, UpdateRoomDelegate);

            var _mmPacketSender = new PacketBatchSender(taskSchedulerFactory, config, serverLogger);

            var _playerManager = new PlayersManager(Mock.Of <IMmMetrics>(), serverLogger);

            //_serverProvider = new MatchMakerServerInfoProvider(requestSender, taskSchedulerFactory, config, _serverLogger, _statsProvider);
            var _serverProvider = new FakeMatchMakerServerInfoProvider(requestSender, "127.0.0.1", $"{gamePort}");
            var roomApiProvider = new DefaultRoomApiProvider(requestSender, serverLogger);
            var _mmRoomManager  =
                new MM.Managers.RoomManager(_serverProvider, serverLogger, taskSchedulerFactory, roomApiProvider);

            var sender          = GetSHamanMessageSender(serializer, _mmPacketSender, config, serverLogger);
            var _mmGroupManager = new MatchMakingGroupManager(serverLogger, taskSchedulerFactory, _playerManager,
                                                              sender, Mock.Of <IMmMetrics>(), _mmRoomManager, roomPropertiesProvider, config);

            var matchMaker = new MatchMaker(_playerManager, _mmGroupManager);

            //
            // var _measures = new Dictionary<byte, object>();
            // _measures.Add(FakePropertyCodes.PlayerProperties.Level, 1);
            // matchMaker.AddMatchMakingGroup(_measures);
            matchMaker.AddRequiredProperty(FakePropertyCodes.PlayerProperties.Level);

            var senderFactory            = new ShamanMessageSenderFactory(serializer, config);
            var protectionManagerConfig  = new ConnectionDdosProtectionConfig(ddosConnectionsLevel, ddosConnectionCheckInterval, 5000, 60000);
            var connectionDdosProtection = new ConnectDdosProtection(protectionManagerConfig, taskSchedulerFactory, serverLogger);
            var protectionManager        = new ProtectionManager(connectionDdosProtection, protectionManagerConfig, serverLogger);

            //setup mm server
            return(new MmApplication(serverLogger, config, serializer, socketFactory, matchMaker,
                                     requestSender, taskSchedulerFactory, _mmPacketSender, senderFactory, _serverProvider, _mmRoomManager,
                                     _mmGroupManager, _playerManager, Mock.Of <IMmMetrics>(), protectionManager));
        }
        public static GameApplication GetGame(List <ushort> gamePorts, bool isAuthOn = false)
        {
            var _roomControllerFactory   = new FakeRoomControllerFactory();
            var serverLogger             = new ConsoleLogger("G ", LogLevel.Error | LogLevel.Info | LogLevel.Debug);
            var socketFactory            = new LiteNetSockFactory();
            var serializer               = new BinarySerializer();
            var taskSchedulerFactory     = new TaskSchedulerFactory(serverLogger);
            var protectionManagerConfig  = new ConnectionDdosProtectionConfig(300, 5000, 5000, 60000);
            var connectionDdosProtection = new ConnectDdosProtection(protectionManagerConfig, taskSchedulerFactory, serverLogger);
            var protectionManager        = new ProtectionManager(connectionDdosProtection, protectionManagerConfig, serverLogger);

            var config = new ApplicationConfig
            {
                PublicDomainNameOrAddress = "127.0.0.1",
                ListenPorts                  = gamePorts,
                BindToPortHttp               = 7000,
                MaxPacketSize                = 300,
                BasePacketBufferSize         = 64,
                SendTickTimeMs               = 20,
                SocketTickTimeMs             = 10,
                SocketType                   = SocketType.BareSocket,
                ReceiveTickTimeMs            = 20,
                IsAuthOn                     = isAuthOn,
                IsConnectionDdosProtectionOn = false
            };
            var requestSender = new FakeSenderWithGameApplication(null, new Dictionary <byte, object> {
                { PropertyCode.RoomProperties.GameMode, (byte)GameMode.SinglePlayer }
            }, CreateRoomDelegate, UpdateRoomDelegate);

            var gamePacketSender = new PacketBatchSender(taskSchedulerFactory, config, serverLogger);

            var gameSenderFactory = new ShamanMessageSenderFactory(serializer, config);
            var _roomManager      = new Game.Rooms.RoomManager(serverLogger, serializer, config, taskSchedulerFactory,
                                                               _roomControllerFactory, gamePacketSender, gameSenderFactory, Mock.Of <IGameMetrics>(), new RoomStateUpdaterStub());


            //setup game server
            return(new GameApplication(
                       serverLogger,
                       config,
                       serializer,
                       socketFactory,
                       taskSchedulerFactory,
                       requestSender,
                       _roomManager,
                       gamePacketSender,
                       Mock.Of <IGameMetrics>(),
                       gameSenderFactory,
                       protectionManager));
        }