/// <summary> /// Creates a new lobby with URIs asynchronously /// </summary> /// <param name="httpHostURI">HTTP host URI</param> /// <param name="webSocketHostURI">WebSocket host URI</param> /// <param name="isConnectionSecure">Is connection secure</param> /// <param name="username">Username</param> /// <param name="language">Language</param> /// <param name="isLobbyPublic">Is lobby public</param> /// <param name="maximalPlayerCount">Maximal player count</param> /// <param name="drawingTime">Drawing time</param> /// <param name="roundCount">Round count</param> /// <param name="customWordsString">Custom words string</param> /// <param name="customWordsChance">Custom words chance</param> /// <param name="isVotekickingEnabled">Is votekicking enabled</param> /// <param name="clientsPerIPLimit">Clients per IP limit</param> /// <returns>Lobby task</returns> private async Task<ILobby> CreateLobbyWithURIsAsync(Uri httpHostURI, Uri webSocketHostURI, bool isConnectionSecure, string username, ELanguage language, bool isLobbyPublic, uint maximalPlayerCount, ulong drawingTime, uint roundCount, string customWordsString, uint customWordsChance, bool isVotekickingEnabled, uint clientsPerIPLimit) { ILobby ret = null; ResponseWithUserSessionCookie<CreateLobbyResponseData> response_with_user_session_cookie = await SendHTTPPostRequestAsync<CreateLobbyResponseData>(new Uri(httpHostURI, "/v1/lobby"), new Dictionary<string, string> { { "username", username }, { "language", Naming.GetLanguageString(language) }, { "public", isLobbyPublic.ToString().ToLower() }, { "max_players", maximalPlayerCount.ToString() }, { "drawing_time", drawingTime.ToString() }, { "rounds", roundCount.ToString() }, { "custom_words", customWordsString }, { "custom_words_chance", customWordsChance.ToString() }, { "enable_votekick", isVotekickingEnabled.ToString().ToLower() }, { "clients_per_ip_limit", clientsPerIPLimit.ToString() } }); CreateLobbyResponseData response = response_with_user_session_cookie.Response; if ((response != null) && response.IsValid) { ClientWebSocket client_web_socket = new ClientWebSocket(); client_web_socket.Options.Cookies = cookieContainer; await client_web_socket.ConnectAsync(new Uri(webSocketHostURI, $"/v1/ws?lobby_id={ Uri.EscapeUriString(response.LobbyID) }"), default); if (client_web_socket.State == WebSocketState.Open) { ret = new Lobby ( client_web_socket, isConnectionSecure, response.LobbyID, response.MinimalDrawingTime, response.MaximalDrawingTime, response.MinimalRoundCount, response.MaximalRoundCount, response.MinimalMaximalPlayerCount, response.MaximalMaximalPlayerCount, response.MinimalClientsPerIPLimit, response.MaximalClientsPerIPLimit, response.MaximalPlayerCount, response.CurrentMaximalRoundCount, response.IsLobbyPublic, response.IsVotekickingEnabled, response.CustomWordsChance, response.AllowedClientsPerIPCount, response.DrawingBoardBaseWidth, response.DrawingBoardBaseHeight, response.MinimalBrushSize, response.MaximalBrushSize, response.SuggestedBrushSizes, (Color)response.CanvasColor ); } else { client_web_socket.Dispose(); } } return ret; }
/// <summary> /// Changes lobby rules asynchronously /// </summary> /// <param name="language">Language (optional)</param> /// <param name="isLobbyPublic">Is lobby public (optional)</param> /// <param name="maximalPlayerCount">Maximal player count (optional)</param> /// <param name="drawingTime">Drawing time (optional)</param> /// <param name="roundCount">Round count (optional)</param> /// <param name="customWords">Custom words (optional)</param> /// <param name="customWordsChance">Custom words chance (optional)</param> /// <param name="isVotekickingEnabled">Is votekicking enabled (optional)</param> /// <param name="clientsPerIPLimit">Clients per IP limit (optional)</param> /// <returns>Task</returns> public async Task ChangeLobbyRulesAsync(ELanguage? language = null, bool? isLobbyPublic = null, uint? maximalPlayerCount = null, ulong? drawingTime = null, uint? roundCount = null, IReadOnlyList<string> customWords = null, uint? customWordsChance = null, bool? isVotekickingEnabled = null, uint? clientsPerIPLimit = null) { if ((language != null) && (language == ELanguage.Invalid)) { throw new ArgumentException("Language can't be invalid.", nameof(language)); } if ((maximalPlayerCount != null) && (maximalPlayerCount < 1U)) { throw new ArgumentException("Maximal player count can't be smaller than one.", nameof(maximalPlayerCount)); } if ((drawingTime != null) && (drawingTime < 1U)) { throw new ArgumentException("Drawing time can't be smaller than one.", nameof(drawingTime)); } if ((customWords != null) && !Protection.IsValid(customWords)) { throw new ArgumentException("Custom words can't contain null.", nameof(customWords)); } if ((clientsPerIPLimit != null) && (clientsPerIPLimit < 1U)) { throw new ArgumentException("Clients per IP limit can't be smaller than one.", nameof(clientsPerIPLimit)); } bool are_changes_specified = false; StringBuilder parameters_string_builder = new StringBuilder(); if ((language != null) && (language != ELanguage.Invalid)) { are_changes_specified = true; parameters_string_builder.Append($"language={ Uri.EscapeUriString(Naming.GetLanguageString(language.Value)) }"); } if (isLobbyPublic != null) { if (are_changes_specified) { parameters_string_builder.Append("&"); } else { are_changes_specified = true; } parameters_string_builder.Append($"public={ Uri.EscapeUriString(isLobbyPublic.Value.ToString().ToLower()) }"); } if (maximalPlayerCount != null) { if (are_changes_specified) { parameters_string_builder.Append("&"); } else { are_changes_specified = true; } parameters_string_builder.Append($"max_players={ Uri.EscapeUriString(maximalPlayerCount.Value.ToString()) }"); } if (drawingTime != null) { if (are_changes_specified) { parameters_string_builder.Append("&"); } else { are_changes_specified = true; } parameters_string_builder.Append($"drawing_time={ Uri.EscapeUriString(drawingTime.Value.ToString()) }"); } if (roundCount != null) { if (are_changes_specified) { parameters_string_builder.Append("&"); } else { are_changes_specified = true; } parameters_string_builder.Append($"rounds={ Uri.EscapeUriString(roundCount.Value.ToString()) }"); } if (customWords != null) { if (are_changes_specified) { parameters_string_builder.Append("&"); } else { are_changes_specified = true; } parameters_string_builder.Append($"custom_words="); bool is_first = true; foreach (string custom_word in customWords) { if (is_first) { is_first = false; } else { parameters_string_builder.Append(','); } parameters_string_builder.Append(Uri.EscapeUriString(roundCount.Value.ToString())); } } if (customWordsChance != null) { if (are_changes_specified) { parameters_string_builder.Append("&"); } else { are_changes_specified = true; } parameters_string_builder.Append($"custom_words_chance={ Uri.EscapeUriString(customWordsChance.Value.ToString()) }"); } if (isVotekickingEnabled != null) { if (are_changes_specified) { parameters_string_builder.Append("&"); } else { are_changes_specified = true; } parameters_string_builder.Append($"enable_votekick={ Uri.EscapeUriString(isVotekickingEnabled.Value.ToString().ToLower()) }"); } if (clientsPerIPLimit != null) { if (are_changes_specified) { parameters_string_builder.Append("&"); } else { are_changes_specified = true; } parameters_string_builder.Append($"clients_per_ip_limit={ Uri.EscapeUriString(clientsPerIPLimit.Value.ToString()) }"); } if (are_changes_specified) { bool is_successfull = await SendHTTPPATCHAsync(new Uri(HTTPHostURI, $"/v1/lobby?{ parameters_string_builder }")); if (!is_successfull && IsUsingSecureProtocols && IsAllowedToUseInsecureConnections) { await SendHTTPPATCHAsync(new Uri(InsecureHTTPHostURI, $"/v1/lobby?{ parameters_string_builder }")); } } parameters_string_builder.Clear(); }