@quenty/settings 11.9.0 → 11.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/package.json +25 -25
- package/src/Client/SettingsServiceClient.lua +8 -12
- package/src/Server/Player/PlayerSettings.lua +3 -3
- package/src/Server/SettingsService.lua +8 -14
- package/src/Shared/Cmdr/SettingsCmdrUtils.lua +4 -4
- package/src/Shared/Interface/PlayerSettingsInterface.lua +1 -0
- package/src/Shared/Player/PlayerSettingsBase.lua +1 -1
- package/src/Shared/Player/PlayerSettingsUtils.lua +0 -45
- package/src/Shared/Setting/SettingDefinition.lua +3 -3
- package/src/Shared/Setting/SettingDefinitionProvider.lua +3 -3
- package/src/Shared/Setting/SettingProperty.lua +2 -2
- package/src/Shared/SettingsDataService.lua +174 -0
- package/src/Shared/SettingRegistryServiceShared.lua +0 -148
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,25 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [11.11.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/settings@11.10.0...@quenty/settings@11.11.0) (2024-10-04)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Performance Improvements
|
|
10
|
+
|
|
11
|
+
* Fix settings to use a cache which reduces memory usage by 10 MB approximately ([990d0a6](https://github.com/Quenty/NevermoreEngine/commit/990d0a678ad405740acd045f041c0bbd51eca660))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# [11.10.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/settings@11.9.0...@quenty/settings@11.10.0) (2024-09-25)
|
|
18
|
+
|
|
19
|
+
**Note:** Version bump only for package @quenty/settings
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
6
25
|
# [11.9.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/settings@11.8.2...@quenty/settings@11.9.0) (2024-09-25)
|
|
7
26
|
|
|
8
27
|
**Note:** Version bump only for package @quenty/settings
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quenty/settings",
|
|
3
|
-
"version": "11.
|
|
3
|
+
"version": "11.11.0",
|
|
4
4
|
"description": "Centralized player settings service",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Roblox",
|
|
@@ -25,35 +25,35 @@
|
|
|
25
25
|
"Quenty"
|
|
26
26
|
],
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@quenty/attributeutils": "^14.
|
|
29
|
-
"@quenty/baseobject": "^10.
|
|
30
|
-
"@quenty/binder": "^14.
|
|
31
|
-
"@quenty/cmdrservice": "^13.
|
|
32
|
-
"@quenty/datastore": "^13.
|
|
33
|
-
"@quenty/ducktype": "^5.
|
|
28
|
+
"@quenty/attributeutils": "^14.8.0",
|
|
29
|
+
"@quenty/baseobject": "^10.6.0",
|
|
30
|
+
"@quenty/binder": "^14.9.0",
|
|
31
|
+
"@quenty/cmdrservice": "^13.10.0",
|
|
32
|
+
"@quenty/datastore": "^13.10.0",
|
|
33
|
+
"@quenty/ducktype": "^5.6.0",
|
|
34
34
|
"@quenty/enumutils": "^3.3.0",
|
|
35
|
-
"@quenty/jsonutils": "^10.
|
|
36
|
-
"@quenty/loader": "^10.
|
|
37
|
-
"@quenty/maid": "^3.
|
|
38
|
-
"@quenty/observablecollection": "^12.
|
|
39
|
-
"@quenty/playerbinder": "^14.
|
|
40
|
-
"@quenty/playerutils": "^8.
|
|
41
|
-
"@quenty/remotefunctionutils": "^10.
|
|
42
|
-
"@quenty/remoting": "^12.
|
|
43
|
-
"@quenty/rx": "^13.
|
|
44
|
-
"@quenty/rxbinderutils": "^14.
|
|
45
|
-
"@quenty/servicebag": "^11.
|
|
46
|
-
"@quenty/signal": "^7.
|
|
47
|
-
"@quenty/statestack": "^14.
|
|
35
|
+
"@quenty/jsonutils": "^10.6.0",
|
|
36
|
+
"@quenty/loader": "^10.6.0",
|
|
37
|
+
"@quenty/maid": "^3.4.0",
|
|
38
|
+
"@quenty/observablecollection": "^12.8.0",
|
|
39
|
+
"@quenty/playerbinder": "^14.9.0",
|
|
40
|
+
"@quenty/playerutils": "^8.8.0",
|
|
41
|
+
"@quenty/remotefunctionutils": "^10.6.0",
|
|
42
|
+
"@quenty/remoting": "^12.9.0",
|
|
43
|
+
"@quenty/rx": "^13.8.0",
|
|
44
|
+
"@quenty/rxbinderutils": "^14.9.0",
|
|
45
|
+
"@quenty/servicebag": "^11.8.0",
|
|
46
|
+
"@quenty/signal": "^7.7.0",
|
|
47
|
+
"@quenty/statestack": "^14.9.0",
|
|
48
48
|
"@quenty/string": "^3.3.0",
|
|
49
|
-
"@quenty/symbol": "^3.
|
|
49
|
+
"@quenty/symbol": "^3.2.0",
|
|
50
50
|
"@quenty/table": "^3.5.0",
|
|
51
|
-
"@quenty/throttle": "^10.
|
|
52
|
-
"@quenty/tie": "^10.
|
|
53
|
-
"@quenty/valueobject": "^13.
|
|
51
|
+
"@quenty/throttle": "^10.7.0",
|
|
52
|
+
"@quenty/tie": "^10.10.0",
|
|
53
|
+
"@quenty/valueobject": "^13.8.0"
|
|
54
54
|
},
|
|
55
55
|
"publishConfig": {
|
|
56
56
|
"access": "public"
|
|
57
57
|
},
|
|
58
|
-
"gitHead": "
|
|
58
|
+
"gitHead": "035abfa088c854a73e1c65b350267eaa17669646"
|
|
59
59
|
}
|
|
@@ -10,8 +10,6 @@ local require = require(script.Parent.loader).load(script)
|
|
|
10
10
|
|
|
11
11
|
local Players = game:GetService("Players")
|
|
12
12
|
|
|
13
|
-
local PlayerSettingsUtils = require("PlayerSettingsUtils")
|
|
14
|
-
local Rx = require("Rx")
|
|
15
13
|
local Maid = require("Maid")
|
|
16
14
|
local SettingsCmdrUtils = require("SettingsCmdrUtils")
|
|
17
15
|
|
|
@@ -31,8 +29,10 @@ function SettingsServiceClient:Init(serviceBag)
|
|
|
31
29
|
self._serviceBag:GetService(require("CmdrServiceClient"))
|
|
32
30
|
|
|
33
31
|
-- Internal
|
|
34
|
-
self._serviceBag:GetService(require("
|
|
35
|
-
|
|
32
|
+
self._settingsDataService = self._serviceBag:GetService(require("SettingsDataService"))
|
|
33
|
+
|
|
34
|
+
-- Binders
|
|
35
|
+
self._serviceBag:GetService(require("PlayerSettingsClient"))
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
function SettingsServiceClient:Start()
|
|
@@ -84,7 +84,7 @@ end
|
|
|
84
84
|
function SettingsServiceClient:ObservePlayerSettings(player)
|
|
85
85
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
86
86
|
|
|
87
|
-
return
|
|
87
|
+
return self._settingsDataService:ObservePlayerSettings(player)
|
|
88
88
|
end
|
|
89
89
|
|
|
90
90
|
--[=[
|
|
@@ -96,7 +96,7 @@ end
|
|
|
96
96
|
function SettingsServiceClient:ObservePlayerSettingsBrio(player)
|
|
97
97
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
98
98
|
|
|
99
|
-
return
|
|
99
|
+
return self._settingsDataService:ObservePlayerSettingsBrio(player)
|
|
100
100
|
end
|
|
101
101
|
|
|
102
102
|
--[=[
|
|
@@ -108,7 +108,7 @@ end
|
|
|
108
108
|
function SettingsServiceClient:GetPlayerSettings(player)
|
|
109
109
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
110
110
|
|
|
111
|
-
return
|
|
111
|
+
return self._settingsDataService:GetPlayerSettings(player)
|
|
112
112
|
end
|
|
113
113
|
|
|
114
114
|
--[=[
|
|
@@ -121,11 +121,7 @@ end
|
|
|
121
121
|
function SettingsServiceClient:PromisePlayerSettings(player, cancelToken)
|
|
122
122
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
123
123
|
|
|
124
|
-
return
|
|
125
|
-
Rx.where(function(x)
|
|
126
|
-
return x ~= nil
|
|
127
|
-
end)
|
|
128
|
-
}), cancelToken)
|
|
124
|
+
return self._settingsDataService:PromisePlayerSettings(player, cancelToken)
|
|
129
125
|
end
|
|
130
126
|
|
|
131
127
|
|
|
@@ -11,7 +11,7 @@ local PlayerSettingsConstants = require("PlayerSettingsConstants")
|
|
|
11
11
|
local PlayerSettingsInterface = require("PlayerSettingsInterface")
|
|
12
12
|
local PlayerSettingsUtils = require("PlayerSettingsUtils")
|
|
13
13
|
local Remoting = require("Remoting")
|
|
14
|
-
local
|
|
14
|
+
local SettingsDataService = require("SettingsDataService")
|
|
15
15
|
|
|
16
16
|
local PlayerSettings = setmetatable({}, PlayerSettingsBase)
|
|
17
17
|
PlayerSettings.ClassName = "PlayerSettings"
|
|
@@ -21,11 +21,11 @@ function PlayerSettings.new(obj, serviceBag)
|
|
|
21
21
|
local self = setmetatable(PlayerSettingsBase.new(obj, serviceBag), PlayerSettings)
|
|
22
22
|
|
|
23
23
|
self._serviceBag = assert(serviceBag, "No serviceBag")
|
|
24
|
-
self.
|
|
24
|
+
self._settingsDataService = self._serviceBag:GetService(SettingsDataService)
|
|
25
25
|
|
|
26
26
|
self:_setupRemoting()
|
|
27
27
|
|
|
28
|
-
self._maid:GiveTask(self.
|
|
28
|
+
self._maid:GiveTask(self._settingsDataService:ObserveRegisteredDefinitionsBrio():Subscribe(function(brio)
|
|
29
29
|
if brio:IsDead() then
|
|
30
30
|
return
|
|
31
31
|
end
|
|
@@ -4,8 +4,6 @@
|
|
|
4
4
|
|
|
5
5
|
local require = require(script.Parent.loader).load(script)
|
|
6
6
|
|
|
7
|
-
local PlayerSettingsUtils = require("PlayerSettingsUtils")
|
|
8
|
-
local Rx = require("Rx")
|
|
9
7
|
local Maid = require("Maid")
|
|
10
8
|
|
|
11
9
|
local SettingsService = {}
|
|
@@ -20,40 +18,36 @@ function SettingsService:Init(serviceBag)
|
|
|
20
18
|
self._serviceBag:GetService(require("PlayerDataStoreService"))
|
|
21
19
|
self._serviceBag:GetService(require("SettingsCmdrService"))
|
|
22
20
|
|
|
23
|
-
|
|
24
21
|
-- Internal
|
|
25
|
-
self.
|
|
26
|
-
self._serviceBag:GetService(require("PlayerHasSettings"))
|
|
22
|
+
self._settingsDataService = self._serviceBag:GetService(require("SettingsDataService"))
|
|
27
23
|
|
|
28
|
-
|
|
24
|
+
-- Binders
|
|
25
|
+
self._serviceBag:GetService(require("PlayerHasSettings"))
|
|
26
|
+
self._serviceBag:GetService(require("PlayerSettings"))
|
|
29
27
|
end
|
|
30
28
|
|
|
31
29
|
function SettingsService:ObservePlayerSettingsBrio(player)
|
|
32
30
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
33
31
|
|
|
34
|
-
return
|
|
32
|
+
return self._settingsDataService:ObservePlayerSettingsBrio(player)
|
|
35
33
|
end
|
|
36
34
|
|
|
37
35
|
function SettingsService:ObservePlayerSettings(player)
|
|
38
36
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
39
37
|
|
|
40
|
-
return
|
|
38
|
+
return self._settingsDataService:ObservePlayerSettings(player)
|
|
41
39
|
end
|
|
42
40
|
|
|
43
41
|
function SettingsService:GetPlayerSettings(player)
|
|
44
42
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
45
43
|
|
|
46
|
-
return
|
|
44
|
+
return self._settingsDataService:GetPlayerSettings(player)
|
|
47
45
|
end
|
|
48
46
|
|
|
49
47
|
function SettingsService:PromisePlayerSettings(player, cancelToken)
|
|
50
48
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
51
49
|
|
|
52
|
-
return
|
|
53
|
-
Rx.where(function(x)
|
|
54
|
-
return x ~= nil
|
|
55
|
-
end)
|
|
56
|
-
}), cancelToken)
|
|
50
|
+
return self._settingsDataService:PromisePlayerSettings(player, cancelToken)
|
|
57
51
|
end
|
|
58
52
|
|
|
59
53
|
function SettingsService:Destroy()
|
|
@@ -5,18 +5,18 @@
|
|
|
5
5
|
local require = require(script.Parent.loader).load(script)
|
|
6
6
|
|
|
7
7
|
local ServiceBag = require("ServiceBag")
|
|
8
|
-
local
|
|
8
|
+
local SettingsDataService = require("SettingsDataService")
|
|
9
9
|
|
|
10
10
|
local SettingsCmdrUtils = {}
|
|
11
11
|
|
|
12
12
|
function SettingsCmdrUtils.registerSettingDefinition(cmdr, serviceBag)
|
|
13
13
|
assert(ServiceBag.isServiceBag(serviceBag), "Bad serviceBag")
|
|
14
14
|
|
|
15
|
-
local
|
|
15
|
+
local settingsDataService = serviceBag:GetService(SettingsDataService)
|
|
16
16
|
|
|
17
17
|
local settingDefinitionType = {
|
|
18
18
|
Transform = function(text)
|
|
19
|
-
local definitions =
|
|
19
|
+
local definitions = settingsDataService:GetSettingDefinitions()
|
|
20
20
|
local settingNames = {}
|
|
21
21
|
for _, settingDefinition in pairs(definitions) do
|
|
22
22
|
table.insert(settingNames, settingDefinition:GetSettingName())
|
|
@@ -34,7 +34,7 @@ function SettingsCmdrUtils.registerSettingDefinition(cmdr, serviceBag)
|
|
|
34
34
|
Parse = function(keys)
|
|
35
35
|
local name = keys[1]
|
|
36
36
|
|
|
37
|
-
local definitions =
|
|
37
|
+
local definitions = settingsDataService:GetSettingDefinitions()
|
|
38
38
|
for _, settingDefinition in pairs(definitions) do
|
|
39
39
|
if settingDefinition:GetSettingName() == name then
|
|
40
40
|
return settingDefinition
|
|
@@ -8,10 +8,6 @@ local require = require(script.Parent.loader).load(script)
|
|
|
8
8
|
|
|
9
9
|
local PlayerSettingsConstants = require("PlayerSettingsConstants")
|
|
10
10
|
local String = require("String")
|
|
11
|
-
local RxBinderUtils = require("RxBinderUtils")
|
|
12
|
-
local BinderUtils = require("BinderUtils")
|
|
13
|
-
local Binder = require("Binder")
|
|
14
|
-
local RxStateStackUtils = require("RxStateStackUtils")
|
|
15
11
|
local EnumUtils = require("EnumUtils")
|
|
16
12
|
local DataStoreStringUtils = require("DataStoreStringUtils")
|
|
17
13
|
|
|
@@ -30,47 +26,6 @@ function PlayerSettingsUtils.create()
|
|
|
30
26
|
return playerSettings
|
|
31
27
|
end
|
|
32
28
|
|
|
33
|
-
--[=[
|
|
34
|
-
Observe a player settings for a player.
|
|
35
|
-
|
|
36
|
-
@param binder Binder<PlayerSettings>
|
|
37
|
-
@param player Player
|
|
38
|
-
@return Observable<PlayerSettings>
|
|
39
|
-
]=]
|
|
40
|
-
function PlayerSettingsUtils.observePlayerSettingsBrio(binder, player)
|
|
41
|
-
assert(Binder.isBinder(binder), "No binder")
|
|
42
|
-
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
43
|
-
|
|
44
|
-
return RxBinderUtils.observeBoundChildClassBrio(binder, player)
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
--[=[
|
|
48
|
-
Observe a player's latest settings
|
|
49
|
-
|
|
50
|
-
@param binder Binder<PlayerSettings>
|
|
51
|
-
@param player Player
|
|
52
|
-
@return Observable<PlayerSettings>
|
|
53
|
-
]=]
|
|
54
|
-
function PlayerSettingsUtils.observePlayerSettings(binder, player)
|
|
55
|
-
return RxBinderUtils.observeBoundChildClassBrio(binder, player):Pipe({
|
|
56
|
-
RxStateStackUtils.topOfStack()
|
|
57
|
-
})
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
--[=[
|
|
61
|
-
Gets a player's latest settings
|
|
62
|
-
|
|
63
|
-
@param binder Binder<PlayerSettings>
|
|
64
|
-
@param player Player
|
|
65
|
-
@return PlayerSettings
|
|
66
|
-
]=]
|
|
67
|
-
function PlayerSettingsUtils.getPlayerSettings(binder, player)
|
|
68
|
-
assert(Binder.isBinder(binder), "No binder")
|
|
69
|
-
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
70
|
-
|
|
71
|
-
return BinderUtils.findFirstChild(binder, player)
|
|
72
|
-
end
|
|
73
|
-
|
|
74
29
|
--[=[
|
|
75
30
|
Gets the attribute name for a setting
|
|
76
31
|
|
|
@@ -22,7 +22,7 @@ local require = require(script.Parent.loader).load(script)
|
|
|
22
22
|
|
|
23
23
|
local Players = game:GetService("Players")
|
|
24
24
|
|
|
25
|
-
local
|
|
25
|
+
local SettingsDataService = require("SettingsDataService")
|
|
26
26
|
local SettingProperty = require("SettingProperty")
|
|
27
27
|
local ServiceBag = require("ServiceBag")
|
|
28
28
|
local DuckTypeUtils = require("DuckTypeUtils")
|
|
@@ -66,8 +66,8 @@ function SettingDefinition:Init(serviceBag)
|
|
|
66
66
|
self._maid = Maid.new()
|
|
67
67
|
self._serviceBag = assert(serviceBag, "No serviceBag")
|
|
68
68
|
|
|
69
|
-
local
|
|
70
|
-
self._maid:GiveTask(
|
|
69
|
+
local settingsDataService = self._serviceBag:GetService(SettingsDataService)
|
|
70
|
+
self._maid:GiveTask(settingsDataService:RegisterSettingDefinition(self))
|
|
71
71
|
end
|
|
72
72
|
|
|
73
73
|
--[=[
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
|
|
5
5
|
:::tip
|
|
6
6
|
These settings providers should be used on both the client and the server. On the client, these
|
|
7
|
-
are registered with the [
|
|
7
|
+
are registered with the [SettingsDataService] so that they can be shown in UI automatically
|
|
8
8
|
if desired.
|
|
9
9
|
|
|
10
|
-
On the server, these are registered with [
|
|
10
|
+
On the server, these are registered with [SettingsDataService] and then are checked before
|
|
11
11
|
arbitrary data can e sent.
|
|
12
12
|
:::
|
|
13
13
|
|
|
@@ -100,7 +100,7 @@ function SettingDefinitionProvider:_addSettingDefinition(settingDefinition)
|
|
|
100
100
|
end
|
|
101
101
|
|
|
102
102
|
--[=[
|
|
103
|
-
Initializes the provider, storing the data in [
|
|
103
|
+
Initializes the provider, storing the data in [SettingsDataService]
|
|
104
104
|
|
|
105
105
|
@param serviceBag ServiceBag
|
|
106
106
|
]=]
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
local require = require(script.Parent.loader).load(script)
|
|
6
6
|
|
|
7
|
-
local
|
|
7
|
+
local SettingsDataService = require("SettingsDataService")
|
|
8
8
|
local Rx = require("Rx")
|
|
9
9
|
|
|
10
10
|
local SettingProperty = {}
|
|
@@ -23,7 +23,7 @@ function SettingProperty.new(serviceBag, player, definition)
|
|
|
23
23
|
local self = setmetatable({}, SettingProperty)
|
|
24
24
|
|
|
25
25
|
self._serviceBag = assert(serviceBag, "No serviceBag")
|
|
26
|
-
self._bridge = self._serviceBag:GetService(
|
|
26
|
+
self._bridge = self._serviceBag:GetService(SettingsDataService)
|
|
27
27
|
|
|
28
28
|
self._player = assert(player, "No player")
|
|
29
29
|
self._definition = assert(definition, "No definition")
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
--[=[
|
|
2
|
+
Shared between client and server, letting us centralize definitions in one place.
|
|
3
|
+
|
|
4
|
+
@class SettingsDataService
|
|
5
|
+
]=]
|
|
6
|
+
|
|
7
|
+
local require = require(script.Parent.loader).load(script)
|
|
8
|
+
|
|
9
|
+
local Players = game:GetService("Players")
|
|
10
|
+
|
|
11
|
+
local Maid = require("Maid")
|
|
12
|
+
local ObservableMap = require("ObservableMap")
|
|
13
|
+
local ObservableSet = require("ObservableSet")
|
|
14
|
+
local PlayerSettingsInterface = require("PlayerSettingsInterface")
|
|
15
|
+
local Rx = require("Rx")
|
|
16
|
+
local RxBrioUtils = require("RxBrioUtils")
|
|
17
|
+
local RxInstanceUtils = require("RxInstanceUtils")
|
|
18
|
+
|
|
19
|
+
local SettingsDataService = {}
|
|
20
|
+
|
|
21
|
+
--[=[
|
|
22
|
+
Initializes the shared registry service. Should be done via [ServiceBag].
|
|
23
|
+
|
|
24
|
+
@param serviceBag ServiceBag
|
|
25
|
+
]=]
|
|
26
|
+
function SettingsDataService:Init(serviceBag)
|
|
27
|
+
assert(not self._serviceBag, "Already initialized")
|
|
28
|
+
self._serviceBag = assert(serviceBag, "No serviceBag")
|
|
29
|
+
self._maid = Maid.new()
|
|
30
|
+
|
|
31
|
+
-- External
|
|
32
|
+
self._tieRealmService = self._serviceBag:GetService(require("TieRealmService"))
|
|
33
|
+
|
|
34
|
+
-- State
|
|
35
|
+
self._settingDefinitions = self._maid:Add(ObservableSet.new())
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
function SettingsDataService:_getPlayerSettingsCacheMap()
|
|
39
|
+
-- Avoid hydrating
|
|
40
|
+
if self._playerSettingsCacheMap then
|
|
41
|
+
return self._playerSettingsCacheMap
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
self._playerSettingsCacheMap = self._maid:Add(ObservableMap.new())
|
|
45
|
+
self._hydratedPlayersMaid = self._maid:Add(Maid.new())
|
|
46
|
+
|
|
47
|
+
self._maid:GiveTask(Players.PlayerRemoving:Connect(function(player)
|
|
48
|
+
self._hydratedPlayersMaid[player] = nil
|
|
49
|
+
end))
|
|
50
|
+
|
|
51
|
+
return self._playerSettingsCacheMap
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
function SettingsDataService:_getPlayerSettingsMapForPlayer(player)
|
|
55
|
+
local playerSettingsCacheMap = self:_getPlayerSettingsCacheMap()
|
|
56
|
+
|
|
57
|
+
if self._hydratedPlayersMaid[player] then
|
|
58
|
+
return playerSettingsCacheMap
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
-- Note we only do this as requested to save memory. On the client, we're unlikely
|
|
62
|
+
-- to even query other player's settings.
|
|
63
|
+
self._hydratedPlayersMaid[player] = self:_hydrateCacheForPlayer(player)
|
|
64
|
+
|
|
65
|
+
return playerSettingsCacheMap
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
function SettingsDataService:_hydrateCacheForPlayer(player)
|
|
69
|
+
local playerMaid = Maid.new()
|
|
70
|
+
|
|
71
|
+
playerMaid:GiveTask(RxInstanceUtils.observeChildrenBrio(player, function(value)
|
|
72
|
+
-- We really only care about this, and we can assume we have the tag immediately
|
|
73
|
+
return value:HasTag("PlayerSettings")
|
|
74
|
+
end):Pipe({
|
|
75
|
+
RxBrioUtils.flatMapBrio(function(playerSettingsInstance)
|
|
76
|
+
return PlayerSettingsInterface:ObserveBrio(playerSettingsInstance, self._tieRealmService:GetTieRealm())
|
|
77
|
+
end)
|
|
78
|
+
}):Subscribe(function(brio)
|
|
79
|
+
if brio:IsDead() then
|
|
80
|
+
return
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
local maid, playerSettings = brio:ToMaidAndValue()
|
|
84
|
+
maid:GiveTask(self._playerSettingsCacheMap:Set(playerSettings:GetPlayer(), playerSettings))
|
|
85
|
+
end))
|
|
86
|
+
|
|
87
|
+
return playerMaid
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
function SettingsDataService:GetSettingDefinitions()
|
|
91
|
+
return self._settingDefinitions:GetList()
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
--[=[
|
|
95
|
+
Registers settings definitions
|
|
96
|
+
|
|
97
|
+
@param definition SettingDefinition
|
|
98
|
+
@return callback -- Cleanup callback
|
|
99
|
+
]=]
|
|
100
|
+
function SettingsDataService:RegisterSettingDefinition(definition)
|
|
101
|
+
assert(definition, "No definition")
|
|
102
|
+
|
|
103
|
+
return self._settingDefinitions:Add(definition)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
--[=[
|
|
107
|
+
Observes the registered definitions
|
|
108
|
+
|
|
109
|
+
@return Observable<Brio<SettingDefinition>>
|
|
110
|
+
]=]
|
|
111
|
+
function SettingsDataService:ObserveRegisteredDefinitionsBrio()
|
|
112
|
+
return self._settingDefinitions:ObserveItemsBrio()
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
--[=[
|
|
117
|
+
Observes the player's settings
|
|
118
|
+
|
|
119
|
+
@param player Player
|
|
120
|
+
@return Observable<PlayerSettingsBase>
|
|
121
|
+
]=]
|
|
122
|
+
function SettingsDataService:ObservePlayerSettings(player)
|
|
123
|
+
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
124
|
+
|
|
125
|
+
return self:_getPlayerSettingsMapForPlayer(player):ObserveAtKey(player, self._tieRealmService:GetTieRealm())
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
--[=[
|
|
129
|
+
Observes the player settings in a brio
|
|
130
|
+
|
|
131
|
+
@param player Player
|
|
132
|
+
@return Observable<Brio<PlayerSettingsClient>>
|
|
133
|
+
]=]
|
|
134
|
+
function SettingsDataService:ObservePlayerSettingsBrio(player)
|
|
135
|
+
return self:_getPlayerSettingsMapForPlayer(player):ObserveAtKeyBrio(player, self._tieRealmService:GetTieRealm())
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
--[=[
|
|
139
|
+
Promises the player's settings
|
|
140
|
+
|
|
141
|
+
@param player Player
|
|
142
|
+
@param cancelToken CancelToken
|
|
143
|
+
@return Promise<PlayerSettingsBase>
|
|
144
|
+
]=]
|
|
145
|
+
function SettingsDataService:PromisePlayerSettings(player, cancelToken)
|
|
146
|
+
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
147
|
+
|
|
148
|
+
return Rx.toPromise(self:ObservePlayerSettings(player):Pipe({
|
|
149
|
+
Rx.where(function(playerSettings)
|
|
150
|
+
return playerSettings ~= nil
|
|
151
|
+
end)
|
|
152
|
+
}), cancelToken)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
--[=[
|
|
156
|
+
Gets the player's settings
|
|
157
|
+
|
|
158
|
+
@param player Player
|
|
159
|
+
@return Promise<PlayerSettingsBase>
|
|
160
|
+
]=]
|
|
161
|
+
function SettingsDataService:GetPlayerSettings(player)
|
|
162
|
+
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
163
|
+
|
|
164
|
+
return self:_getPlayerSettingsMapForPlayer(player):Get(player)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
--[=[
|
|
168
|
+
Cleans up the shared registry service
|
|
169
|
+
]=]
|
|
170
|
+
function SettingsDataService:Destroy()
|
|
171
|
+
self._maid:DoCleaning()
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
return SettingsDataService
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
--[=[
|
|
2
|
-
Shared between client and server, letting us centralize definitions in one place.
|
|
3
|
-
|
|
4
|
-
@class SettingRegistryServiceShared
|
|
5
|
-
]=]
|
|
6
|
-
|
|
7
|
-
local require = require(script.Parent.loader).load(script)
|
|
8
|
-
|
|
9
|
-
local ValueObject = require("ValueObject")
|
|
10
|
-
local Rx = require("Rx")
|
|
11
|
-
local ObservableSet = require("ObservableSet")
|
|
12
|
-
local Maid = require("Maid")
|
|
13
|
-
|
|
14
|
-
local SettingRegistryServiceShared = {}
|
|
15
|
-
|
|
16
|
-
--[=[
|
|
17
|
-
Initializes the shared registry service. Should be done via [ServiceBag].
|
|
18
|
-
|
|
19
|
-
@param serviceBag ServiceBag
|
|
20
|
-
]=]
|
|
21
|
-
function SettingRegistryServiceShared:Init(serviceBag)
|
|
22
|
-
assert(not self._serviceBag, "Already initialized")
|
|
23
|
-
self._serviceBag = assert(serviceBag, "No serviceBag")
|
|
24
|
-
self._maid = Maid.new()
|
|
25
|
-
|
|
26
|
-
self._settingService = ValueObject.new()
|
|
27
|
-
self._maid:GiveTask(self._settingService)
|
|
28
|
-
|
|
29
|
-
self._settingDefinitions = ObservableSet.new()
|
|
30
|
-
self._maid:GiveTask(self._settingDefinitions)
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
function SettingRegistryServiceShared:GetSettingDefinitions()
|
|
34
|
-
return self._settingDefinitions:GetList()
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
--[=[
|
|
38
|
-
Registers the shared setting service for this bridge
|
|
39
|
-
|
|
40
|
-
@param settingService SettingService
|
|
41
|
-
]=]
|
|
42
|
-
function SettingRegistryServiceShared:RegisterSettingService(settingService)
|
|
43
|
-
self._settingService.Value = settingService
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
--[=[
|
|
47
|
-
Registers settings definitions
|
|
48
|
-
|
|
49
|
-
@param definition SettingDefinition
|
|
50
|
-
@return callback -- Cleanup callback
|
|
51
|
-
]=]
|
|
52
|
-
function SettingRegistryServiceShared:RegisterSettingDefinition(definition)
|
|
53
|
-
assert(definition, "No definition")
|
|
54
|
-
|
|
55
|
-
return self._settingDefinitions:Add(definition)
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
--[=[
|
|
59
|
-
Observes the registered definitions
|
|
60
|
-
|
|
61
|
-
@return Observable<Brio<SettingDefinition>>
|
|
62
|
-
]=]
|
|
63
|
-
function SettingRegistryServiceShared:ObserveRegisteredDefinitionsBrio()
|
|
64
|
-
return self._settingDefinitions:ObserveItemsBrio()
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
--[=[
|
|
68
|
-
Gets the current settings service
|
|
69
|
-
|
|
70
|
-
@return SettingService
|
|
71
|
-
]=]
|
|
72
|
-
function SettingRegistryServiceShared:GetSettingsService()
|
|
73
|
-
return self._settingService.Value
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
--[=[
|
|
77
|
-
Observes the current settings service
|
|
78
|
-
|
|
79
|
-
@return Observable<SettingService>
|
|
80
|
-
]=]
|
|
81
|
-
function SettingRegistryServiceShared:ObserveSettingsService()
|
|
82
|
-
return self._settingService:Observe()
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
--[=[
|
|
86
|
-
Observes the player's settings
|
|
87
|
-
|
|
88
|
-
@param player Player
|
|
89
|
-
@return Observable<PlayerSettingsBase>
|
|
90
|
-
]=]
|
|
91
|
-
function SettingRegistryServiceShared:ObservePlayerSettings(player)
|
|
92
|
-
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
93
|
-
|
|
94
|
-
return self:ObserveSettingsService():Pipe({
|
|
95
|
-
Rx.switchMap(function(settingService)
|
|
96
|
-
if settingService then
|
|
97
|
-
return settingService:ObservePlayerSettings(player)
|
|
98
|
-
else
|
|
99
|
-
return Rx.of(nil)
|
|
100
|
-
end
|
|
101
|
-
end)
|
|
102
|
-
})
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
--[=[
|
|
106
|
-
Promises the player's settings
|
|
107
|
-
|
|
108
|
-
@param player Player
|
|
109
|
-
@return Promise<PlayerSettingsBase>
|
|
110
|
-
]=]
|
|
111
|
-
function SettingRegistryServiceShared:PromisePlayerSettings(player)
|
|
112
|
-
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
113
|
-
|
|
114
|
-
return Rx.toPromise(self._settingService:Observe():Pipe({
|
|
115
|
-
Rx.where(function(x)
|
|
116
|
-
return x ~= nil
|
|
117
|
-
end)
|
|
118
|
-
}))
|
|
119
|
-
:Then(function(settingService)
|
|
120
|
-
return settingService:PromisePlayerSettings(player)
|
|
121
|
-
end)
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
--[=[
|
|
125
|
-
Gets the player's settings
|
|
126
|
-
|
|
127
|
-
@param player Player
|
|
128
|
-
@return Promise<PlayerSettingsBase>
|
|
129
|
-
]=]
|
|
130
|
-
function SettingRegistryServiceShared:GetPlayerSettings(player)
|
|
131
|
-
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
132
|
-
|
|
133
|
-
local settingService = self._settingService.Value
|
|
134
|
-
if settingService then
|
|
135
|
-
return settingService:GetPlayerSettings(player)
|
|
136
|
-
else
|
|
137
|
-
return nil
|
|
138
|
-
end
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
--[=[
|
|
142
|
-
Cleans up the shared registry service
|
|
143
|
-
]=]
|
|
144
|
-
function SettingRegistryServiceShared:Destroy()
|
|
145
|
-
self._maid:DoCleaning()
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
return SettingRegistryServiceShared
|