private async void CreateLobby()
        {
            var lobby = await DiscordLobby.Create((ref LobbyTransaction transaction) =>
            {
                transaction.SetType(LobbyType.Public);
                transaction.SetCapacity(2);
            });

            NetplayGameManager.CreateMatch(lobby);
            _lobbyList.gameObject.SetActive(false);
            _createLobbyButton.gameObject.SetActive(false);
        }
        private async void Update()
        {
            _timeSinceLastUpdate += Time.deltaTime;
            if (_timeSinceLastUpdate < _updateInterval)
            {
                return;
            }
            _timeSinceLastUpdate -= _updateInterval;

            var lobbies = await DiscordLobby.Search();

            foreach (var fightRequest in _fightRequests)
            {
                Destroy(fightRequest);
            }

            _fightRequests.Clear();

            foreach (var lobby in lobbies)
            {
                var gameObject = Instantiate(_fightRequestTemplate, _lobbyList);
                var button     = gameObject.GetComponent <TextButton>();

                var owner = await lobby.Owner;

                gameObject.SetActive(true);
                button.Label = $"{owner.Username}#{owner.Discriminator}";

                if (owner.Id != DiscordManager.CurrentUser.Id)
                {
                    button.OnClick += () =>
                    {
                        NetplayGameManager.JoinMatch(lobby);
                        _lobbyList.gameObject.SetActive(false);
                        _createLobbyButton.gameObject.SetActive(false);
                    };
                }
                else
                {
                    button.OnClick += () =>
                    {
                        lobby.Delete();
                    };
                }

                _fightRequests.Add(gameObject);
            }
        }
    private void CreateMatchInternal(DiscordLobby lobby)
    {
        if (_lobby != null)
        {
            throw new NotImplementedException();
        }

        _lobby = lobby;
        _lobby.ConnectNetwork();
        _lobby.NetworkMessageReceived += NetworkMessageReceived;

        _synchronizer = new GameSynchronizer <GameState, InputState>();
        _synchronizer.SimulateGame   += SimulateGame;
        _synchronizer.SaveGame       += SaveGame;
        _synchronizer.LoadGame       += LoadGame;
        _synchronizer.BroadcastInput += BroadcastInput;

        _localPlayer  = _synchronizer.AddPlayer(PlayerType.Local);
        _remotePlayer = _synchronizer.AddPlayer(PlayerType.Remote);
    }
    private async void JoinMatchInternal(DiscordLobby lobby)
    {
        if (_lobby != null)
        {
            throw new NotImplementedException();
        }

        await lobby.Connect();

        _lobby = lobby;
        _lobby.ConnectNetwork();
        _lobby.NetworkMessageReceived += NetworkMessageReceived;

        _synchronizer = new GameSynchronizer <GameState, InputState>();
        _synchronizer.SimulateGame   += SimulateGame;
        _synchronizer.SaveGame       += SaveGame;
        _synchronizer.LoadGame       += LoadGame;
        _synchronizer.BroadcastInput += BroadcastInput;

        _remotePlayer = _synchronizer.AddPlayer(PlayerType.Remote);
        _localPlayer  = _synchronizer.AddPlayer(PlayerType.Local);

        _lobby.SendNetworkMessage(0, Encoding.UTF8.GetBytes("READY"));
    }
 public static void CreateMatch(DiscordLobby lobby) => _instance.CreateMatchInternal(lobby);
 public static void JoinMatch(DiscordLobby lobby) => _instance.JoinMatchInternal(lobby);