Esempio n. 1
0
        private async Task UpdateConnection(LobbyConnection lc)
        {
            lc.PendingUpdates++;
            await Messenger.SendMessage(lc.Connection, Messages.GameSettings(lc.Lobby));

            await SetConnectionReady(lc, false);
        }
Esempio n. 2
0
 private void AssertHost(LobbyConnection lc)
 {
     if (lc.Lobby.Host != lc)
     {
         throw new ArgumentException("Connection is not lobby host!");
     }
 }
Esempio n. 3
0
        public async Task <Lobby> CreateLobby(GameWrapper game, LobbyConnection host, string name)
        {
            using (var alock = await Data.Synchronizer.SetStateAsync(ModuleState.Writing))
            {
                log.Debug("creating new lobby '" + name + "' for host " + host);
                var lobby = new Lobby(name)
                {
                    Host    = host,
                    Backend = new LobbyBackendWrapper(game)
                };

                await SetGameMode(lobby, lobby.Backend.DefaultGameMode);

                Data.AddLobby(lobby);

                try
                {
                    await Broadcast(Messages.LobbyCreated(lobby));

                    await JoinLobby(host, lobby);
                }
                catch
                {
                    Data.RemoveLobby(lobby);
                    throw;
                }

                return(lobby);
            }
        }
Esempio n. 4
0
        /// <summary>
        /// Processes the message
        /// </summary>
        /// <param name="connectionBase">The connection base</param>
        /// <param name="message">The playerio message</param>
        /// <param name="handled">Whether the message was already handled</param>
        public void Process(ConnectionBase connectionBase, Message message, bool handled)
        {
            string      title         = message.GetString(0);
            string      text          = message.GetString(1);
            ChatMessage systemMessage = new ChatMessage(null, string.Format("{0} {1}", title, text));

            if (connectionBase is LobbyConnection)
            {
                LobbyConnection lobbyCon = (LobbyConnection)connectionBase;

                if (!handled)
                {
                    lobbyCon.MessageOfTheDay = message.GetString(1);
                }
            }
            else if (connectionBase is WorldConnection)
            {
                if (!handled)
                {
                    WorldConnection worldCon = (WorldConnection)connectionBase;
                    worldCon.Chat.Add(systemMessage);
                }
            }

            InfoEvent infoEvent = new InfoEvent()
            {
                Raw           = message,
                SystemMessage = systemMessage
            };

            connectionBase.RaiseServerEvent <InfoEvent>(infoEvent);
        }
Esempio n. 5
0
 public async Task SetConnectionReady(LobbyConnection connection, bool v)
 {
     if (connection.Lobby == null)
     {
         throw new ArgumentNullException();
     }
     Data.SetReady(connection, v);
     await LobbyBroadcast(connection.Lobby, Messages.ReadyChanged(connection));
 }
Esempio n. 6
0
        public async Task AddConnection(LobbyConnectionInitializer initializer)
        {
            LobbyConnection connection = _connections.AddConnection(initializer.ConnectionId, initializer);

            await _context.Groups.AddToGroupAsync(initializer.ConnectionId, connection.LobbyId);

            await _context.Clients.Group(connection.LobbyId).UpdateUser(connection.ToLobbyUser());

            await _context.Clients.Client(initializer.ConnectionId).UpdateConnectionStatus(connection.ToConnectionStatus());
        }
Esempio n. 7
0
        internal Task ConfirmPendingUpdate(LobbyConnection lc)
        {
            if (Data.Connections[lc.Connection.Id].PendingUpdates == 0)
            {
                throw new ArgumentException();
            }

            Data.Connections[lc.Connection.Id].PendingUpdates--;

            return(Task.CompletedTask);
        }
Esempio n. 8
0
        public async Task JoinLobby(LobbyConnection c, Lobby l)
        {
            log.Debug("connection " + c + " joining lobby " + l);
            using (var alock = await Data.Synchronizer.SetStateAsync(ModuleState.Writing))
            {
                if (c.Lobby != null)
                {
                    throw new ArgumentException("Connection has already joined a lobby!");
                }
                if (l.LobbyState == LobbyState.Finished)
                {
                    throw new LobbyStateException("Can not join finished game!");
                }

                Data.AddLobbyConnection(l, c);

                try
                {
                    var players = PlayerStorage.GetPlayerOfConnection(c.Connection);
                    await AddPlayerToLobby(players, l);

                    await Messenger.SendMessage(c.Connection, Messages.LobbyJoined(l));

                    await Messenger.SendMessage(c.Connection, Messages.GameModeChanged(l));

                    await Messenger.SendMessage(c.Connection, Messages.ReadyStates(l));

                    //await Messenger.SendMessage(c.Connection, Messages.LobbySettings(l));

                    await UpdateConnection(c);
                }
                catch (Exception ex)
                {
                    log.Warn("connection " + c + " failed to join lobby " + l + ", reverting changes");
                    l.Connections.Remove(c.Connection.Id);
                    c.Lobby = null;
                    throw ex;
                }
            }
        }
Esempio n. 9
0
        static void Main(string[] args)
        {
            //all socket we need
            Socket lobby = new Socket(SocketType.Stream, ProtocolType.IP); //for the lobby

            lobbyClients = new List <LobbyConnection>();
            partecipanti = new List <string>();
            //for the player
            Socket player1 = new Socket(SocketType.Stream, ProtocolType.IP);
            Socket player2 = new Socket(SocketType.Stream, ProtocolType.IP);
            Socket player3 = new Socket(SocketType.Stream, ProtocolType.IP);
            Socket player4 = new Socket(SocketType.Stream, ProtocolType.IP);

            //your mother CANCELLAMI

            //metto la socket lobby in ascolto su 2021
            try
            {
                lobby.Bind(new IPEndPoint(IPAddress.Any, WELL_KNOWN_PORT));
                lobby.Listen(4);
                // Start listening for connections.
                while (true)
                {
                    Console.WriteLine("Waiting for a connection...");

                    // Accetta una nuova connessione
                    Socket clnt_sck = lobby.Accept();

                    // Crea un nuovo thread per gestire la connessione
                    LobbyConnection cc = new LobbyConnection(clnt_sck);
                    lobbyClients.Add(cc);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
Esempio n. 10
0
        public async Task LeaveLobby(LobbyConnection connection, bool silent)
        {
            log.Debug("removing connection " + connection + " from lobby " + connection.Lobby);

            using (var alock = await Data.Synchronizer.SetStateAsync(ModuleState.Writing))
            {
                var lobby = connection.Lobby;

                if (lobby == null)
                {
                    throw new LobbyStateException("Connection is not member in any lobby!");
                }

                log.Debug("connection " + connection.Connection.Id + " leaving lobby " + lobby.Id);

                if (PlayerStorage.IsSynchronized(connection.Connection))
                {
                    var players = PlayerStorage.GetPlayerOfConnection(connection.Connection).Where(p => lobby.Players.Contains(p)).ToArray();

                    await RemovePlayerFromLobby(players, lobby, silent);
                }

                lobby.Connections.Remove(connection.Connection.Id);

                if (!silent && connection.Connection.State != ConnectionState.Disconnected)
                {
                    await Messenger.SendMessage(connection.Connection, Messages.LobbyLeft());
                }
                connection.Lobby          = null;
                connection.PendingUpdates = 0;

                if (lobby.Host == connection)
                {
                    await MigrateHost(lobby);
                }
            }
        }
Esempio n. 11
0
 public Task LeaveLobby(LobbyConnection connection)
 {
     return(LeaveLobby(connection, false));
 }
 public ConnectionEstablishedState(LobbyConnection connection)
 {
     _connection = connection;
 }
Esempio n. 13
0
 internal Message ReadyChanged(LobbyConnection lc)
 {
     return(Messages.CreateMessage("SetReady", lc));
 }
Esempio n. 14
0
        /// <summary>
        /// Creates a new friend
        /// </summary>
        /// <param name="lobbyConnection">The lobby connection</param>
        /// <param name="username">The username</param>
        public Friend(LobbyConnection lobbyConnection, string username)
        {
            this.m_LobbyConnection = lobbyConnection;

            Username = username;
        }
Esempio n. 15
0
        private void NetworkStateMachine()
        {
            const int gameConnectionCount = 2;

            switch (_networkState)
            {
            case NetworkState.Lobby:
                _packetCycle     = 0;
                _noPackCycle     = 0;
                _requireSoftStop = false;
                Interlocked.Exchange(ref _softStopCycle, 0);

                var l_conn = ConnectionPicker.GetConnections(GameProcess);
                if (!l_conn.Any())
                {
                    _networkState = NetworkState.Unconnected;
                    LobbyConnection.Clear();
                    Log.Information($"Network State: NoConnection");
                    break;
                }

                LobbyConnection = ExtractConnections(l_conn, null);
                OnLobbyUpdate?.Invoke();

                var l_game = ExtractConnections(l_conn, LobbyConnection);
                if (l_game.Count == gameConnectionCount)
                {
                    GameConnection = l_game;
                    _networkState  = NetworkState.GameUninitialized;
                    Log.Information($"Network State: GameConnDetected");
                }

                break;

            case NetworkState.Unconnected:
                _networkState = NetworkState.Fail;

                if (!NetworkInterface.GetIsNetworkAvailable())
                {
                    break;
                }
                if (!PingHost(ConnectionPicker.GetLobbyEndPoint(GameProcess)))
                {
                    break;
                }

                _networkState = NetworkState.Pending;
                Log.Information($"Network State: WaitingLogin");

                break;

            case NetworkState.Fail:
                Log.Information($"Network State: FailNetworkCheck");
                IpcClient.SendSignal(Signal.ClientNetworkFail, new[] { GameProcess.Id.ToString() });
                Stopping = true;

                break;

            case NetworkState.Pending:
                if (ConnectionPicker.GetConnections(GameProcess).Any())
                {
                    _networkState = NetworkState.Lobby;
                    Log.Information($"Network State: ConnectedToLobby");
                }

                break;

            case NetworkState.GameUninitialized:
                OnWorldStart?.Invoke();
                _networkState = NetworkState.GameInitialized;
                Log.Information($"Network State: InitializeInvoked");

                break;

            case NetworkState.GameInitialized:
                if (_requireSoftStop)
                {
                    Interlocked.Increment(ref _softStopCycle);
                    _networkState = NetworkState.GameNoPacket;
                    Log.Information($"Network State: ConnectivityCheck");
                    break;
                }

                if (GetPacketAmount != null && _previousGamePacketCount != GetPacketAmount?.Invoke())
                {
                    _noPackCycle             = 0;
                    _previousGamePacketCount = GetPacketAmount.Invoke();
                    break;
                }

                _packetCycle++;
                _noPackCycle++;

                if (_packetCycle > 240)     // 2min, Quality assurance
                {
                    _networkState = NetworkState.GameNoPacket;
                    Log.Information($"Network State: ScheduledQA");
                }

                if (_noPackCycle > 10)    // 5s, Suspected disconnected
                {
                    _networkState = NetworkState.GameNoPacket;
                    Log.Information($"Network State: NoPackNetworkCheck");
                }

                break;

            case NetworkState.GameNoPacket:
                var gnp_conn = ConnectionPicker.GetConnections(GameProcess);

                if (!_connSetEqCp.Equals(gnp_conn, GameConnection))
                {
                    OnWorldStop?.Invoke();
                    _networkState = NetworkState.Lobby;
                    Log.Information($"Network State: ConnectionLost");
                    break;
                }

                if (_softStopCycle > 20)     // 10s, Kept monitoring
                {
                    _requireSoftStop = false;
                    Interlocked.Exchange(ref _softStopCycle, 0);
                }

                _packetCycle  = 0;
                _noPackCycle  = 0;
                _networkState = NetworkState.GameInitialized;
                Log.Information($"Network State: Normal");

                break;

            default:
                _networkState = NetworkState.Lobby;
                Log.Information($"Network State: UnrecognizedToLobby");

                break;
            }
        }
Esempio n. 16
0
 public InQueueState(LobbyConnection connection, string accountId)
 {
     _connection = connection;
       _accountId = accountId;
 }
Esempio n. 17
0
 public AuthenticatingState(LobbyConnection connection, string accountId)
 {
     _connection = connection;
       _accountId = accountId;
 }