diff --git a/CHANGELOG.md b/CHANGELOG.md index 10f1d8b2..6d312cce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Rojo Changelog ## Unreleased Changes +* Add `blockedPlaceIds` project config field to allow blocking place ids from being live synced ([#1021]) * Adds support for `.plugin.lua(u)` files - this applies the `Plugin` RunContext. ([#1008]) * Added support for Roblox's `Content` type. This replaces the old `Content` type with `ContentId` to reflect Roblox's change. If you were previously using the fully-qualified syntax for `Content` you will need to switch it to `ContentId`. @@ -108,6 +109,7 @@ [#987]: https://github.com/rojo-rbx/rojo/pull/987 [#988]: https://github.com/rojo-rbx/rojo/pull/988 [#1008]: https://github.com/rojo-rbx/rojo/pull/1008 +[#1021]: https://github.com/rojo-rbx/rojo/pull/1021 ## [7.4.3] - August 6th, 2024 * Fixed issue with building binary files introduced in 7.4.2 diff --git a/plugin/src/ApiContext.lua b/plugin/src/ApiContext.lua index 68d43095..3eb59003 100644 --- a/plugin/src/ApiContext.lua +++ b/plugin/src/ApiContext.lua @@ -45,14 +45,7 @@ end local function rejectWrongPlaceId(infoResponseBody) if infoResponseBody.expectedPlaceIds ~= nil then - local foundId = false - - for _, id in ipairs(infoResponseBody.expectedPlaceIds) do - if id == game.PlaceId then - foundId = true - break - end - end + local foundId = table.find(infoResponseBody.expectedPlaceIds, game.PlaceId) if not foundId then local idList = {} @@ -62,10 +55,30 @@ local function rejectWrongPlaceId(infoResponseBody) local message = ( "Found a Rojo server, but its project is set to only be used with a specific list of places." - .. "\nYour place ID is %s, but needs to be one of these:" + .. "\nYour place ID is %u, but needs to be one of these:" .. "\n%s" .. "\n\nTo change this list, edit 'servePlaceIds' in your .project.json file." - ):format(tostring(game.PlaceId), table.concat(idList, "\n")) + ):format(game.PlaceId, table.concat(idList, "\n")) + + return Promise.reject(message) + end + end + + if infoResponseBody.unexpectedPlaceIds ~= nil then + local foundId = table.find(infoResponseBody.unexpectedPlaceIds, game.PlaceId) + + if foundId then + local idList = {} + for _, id in ipairs(infoResponseBody.unexpectedPlaceIds) do + table.insert(idList, "- " .. tostring(id)) + end + + local message = ( + "Found a Rojo server, but its project is set to not be used with a specific list of places." + .. "\nYour place ID is %u, but needs to not be one of these:" + .. "\n%s" + .. "\n\nTo change this list, edit 'blockedPlaceIds' in your .project.json file." + ):format(game.PlaceId, table.concat(idList, "\n")) return Promise.reject(message) end diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_info.snap index 95be56ed..ea946219 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_info.snap @@ -1,7 +1,6 @@ --- source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) - --- expectedPlaceIds: ~ gameId: ~ @@ -11,4 +10,4 @@ protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 - +unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__edit_init_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__edit_init_info.snap index 53400451..eb3c203e 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__edit_init_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__edit_init_info.snap @@ -1,7 +1,6 @@ --- source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) - --- expectedPlaceIds: ~ gameId: ~ @@ -11,4 +10,4 @@ protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 - +unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_info.snap index dd97da1a..7dc5960d 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_info.snap @@ -1,7 +1,6 @@ --- source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) - --- expectedPlaceIds: ~ gameId: ~ @@ -11,4 +10,4 @@ protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 - +unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_info.snap index 70168b53..0adbe189 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_info.snap @@ -1,7 +1,6 @@ --- source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) - --- expectedPlaceIds: ~ gameId: ~ @@ -11,4 +10,4 @@ protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 - +unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__move_folder_of_stuff_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__move_folder_of_stuff_info.snap index 9aefc12e..7f482638 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__move_folder_of_stuff_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__move_folder_of_stuff_info.snap @@ -1,7 +1,6 @@ --- source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) - --- expectedPlaceIds: ~ gameId: ~ @@ -11,4 +10,4 @@ protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 - +unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_default_project_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_default_project_info.snap index 954ba622..eb95a44c 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_default_project_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_default_project_info.snap @@ -1,6 +1,5 @@ --- source: tests/tests/serve.rs -assertion_line: 316 expression: redactions.redacted_yaml(info) --- expectedPlaceIds: ~ @@ -11,4 +10,4 @@ protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 - +unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_project_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_project_info.snap index d9772de1..7cd631ee 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_project_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_project_info.snap @@ -1,6 +1,5 @@ --- source: tests/tests/serve.rs -assertion_line: 335 expression: redactions.redacted_yaml(info) --- expectedPlaceIds: ~ @@ -11,4 +10,4 @@ protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 - +unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_top_level_project_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_top_level_project_info.snap index 3ad79c37..3400cc06 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_top_level_project_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_top_level_project_info.snap @@ -1,6 +1,5 @@ --- source: tests/tests/serve.rs -assertion_line: 351 expression: redactions.redacted_yaml(info) --- expectedPlaceIds: ~ @@ -11,4 +10,4 @@ protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 - +unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_info.snap index 46ee7ea0..a37231dd 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_info.snap @@ -10,4 +10,4 @@ protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 - +unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_patch_update_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_patch_update_info.snap index ac25f16b..a37231dd 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_patch_update_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_patch_update_info.snap @@ -10,3 +10,4 @@ protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 +unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_remove_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_remove_info.snap index b51fd1f8..4fea62ef 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_remove_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_remove_info.snap @@ -10,4 +10,4 @@ protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 - +unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_info.snap index 29404cd8..27622724 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_info.snap @@ -1,7 +1,6 @@ --- source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) - --- expectedPlaceIds: ~ gameId: ~ @@ -11,4 +10,4 @@ protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 - +unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_info.snap index 19bc473f..fb85d7cd 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_info.snap @@ -1,7 +1,6 @@ --- source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) - --- expectedPlaceIds: ~ gameId: ~ @@ -11,4 +10,4 @@ protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 - +unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_alone_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_alone_info.snap index 514b8858..8154c8ad 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_alone_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_alone_info.snap @@ -1,6 +1,5 @@ --- source: tests/tests/serve.rs -assertion_line: 265 expression: redactions.redacted_yaml(info) --- expectedPlaceIds: ~ @@ -11,4 +10,4 @@ protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 - +unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_complex_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_complex_info.snap index 3ed2b805..6755cc99 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_complex_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_complex_info.snap @@ -1,6 +1,5 @@ --- source: tests/tests/serve.rs -assertion_line: 281 expression: redactions.redacted_yaml(info) --- expectedPlaceIds: ~ @@ -11,4 +10,4 @@ protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 - +unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_no_extension_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_no_extension_info.snap index 3503e595..cf07c891 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_no_extension_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_no_extension_info.snap @@ -1,6 +1,5 @@ --- source: tests/tests/serve.rs -assertion_line: 297 expression: redactions.redacted_yaml(info) --- expectedPlaceIds: ~ @@ -11,4 +10,4 @@ protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 - +unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_no_name_project_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_no_name_project_info.snap index 532e8b2e..8eeb02f9 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_no_name_project_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_no_name_project_info.snap @@ -1,6 +1,5 @@ --- source: tests/tests/serve.rs -assertion_line: 383 expression: redactions.redacted_yaml(info) --- expectedPlaceIds: ~ @@ -11,3 +10,4 @@ protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 +unexpectedPlaceIds: ~ diff --git a/src/project.rs b/src/project.rs index 1e9c7875..a87d6341 100644 --- a/src/project.rs +++ b/src/project.rs @@ -79,6 +79,14 @@ pub struct Project { #[serde(skip_serializing_if = "Option::is_none")] pub serve_place_ids: Option>, + /// If specified, contains a set of place IDs that this project is + /// not compatible with when doing live sync. + /// + /// This setting is intended to help prevent syncing a Rojo project into the + /// wrong Roblox place. + #[serde(skip_serializing_if = "Option::is_none")] + pub blocked_place_ids: Option>, + /// If specified, sets the current place's place ID when connecting to the /// Rojo server from Roblox Studio. #[serde(skip_serializing_if = "Option::is_none")] diff --git a/src/serve_session.rs b/src/serve_session.rs index 25317d74..4f585018 100644 --- a/src/serve_session.rs +++ b/src/serve_session.rs @@ -208,6 +208,10 @@ impl ServeSession { self.root_project.serve_place_ids.as_ref() } + pub fn blocked_place_ids(&self) -> Option<&HashSet> { + self.root_project.blocked_place_ids.as_ref() + } + pub fn serve_address(&self) -> Option { self.root_project.serve_address } diff --git a/src/web/api.rs b/src/web/api.rs index a7d283a2..ca39eccc 100644 --- a/src/web/api.rs +++ b/src/web/api.rs @@ -64,6 +64,7 @@ impl ApiService { session_id: self.serve_session.session_id(), project_name: self.serve_session.project_name().to_owned(), expected_place_ids: self.serve_session.serve_place_ids().cloned(), + unexpected_place_ids: self.serve_session.blocked_place_ids().cloned(), place_id: self.serve_session.place_id(), game_id: self.serve_session.game_id(), root_instance_id, diff --git a/src/web/interface.rs b/src/web/interface.rs index 64d08834..4ac80999 100644 --- a/src/web/interface.rs +++ b/src/web/interface.rs @@ -160,6 +160,7 @@ pub struct ServerInfoResponse { pub protocol_version: u64, pub project_name: String, pub expected_place_ids: Option>, + pub unexpected_place_ids: Option>, pub game_id: Option, pub place_id: Option, pub root_instance_id: Ref,