@quenty/permissionprovider 14.19.2 → 14.19.3
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 +8 -0
- package/package.json +13 -13
- package/src/Client/Providers/PermissionProviderClient.lua +32 -21
- package/src/Server/PermissionProviderUtils.lua +34 -11
- package/src/Server/PermissionService.lua +24 -11
- package/src/Server/Providers/BasePermissionProvider.lua +39 -16
- package/src/Server/Providers/CreatorPermissionProvider.lua +14 -3
- package/src/Server/Providers/GroupPermissionProvider.lua +34 -9
- package/src/Shared/PermissionLevel.lua +11 -3
- package/src/Shared/PermissionLevelUtils.lua +5 -2
- package/src/Shared/PermissionProviderConstants.lua +10 -4
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
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
|
+
## [14.19.3](https://github.com/Quenty/NevermoreEngine/compare/@quenty/permissionprovider@14.19.2...@quenty/permissionprovider@14.19.3) (2025-04-10)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @quenty/permissionprovider
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
6
14
|
## [14.19.2](https://github.com/Quenty/NevermoreEngine/compare/@quenty/permissionprovider@14.19.0...@quenty/permissionprovider@14.19.2) (2025-04-07)
|
|
7
15
|
|
|
8
16
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quenty/permissionprovider",
|
|
3
|
-
"version": "14.19.
|
|
3
|
+
"version": "14.19.3",
|
|
4
4
|
"description": "Permission provider for Roblox, including authenticating against group membership",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Roblox",
|
|
@@ -25,20 +25,20 @@
|
|
|
25
25
|
"Quenty"
|
|
26
26
|
],
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@quenty/baseobject": "^10.8.
|
|
29
|
-
"@quenty/brio": "^14.17.
|
|
30
|
-
"@quenty/grouputils": "^10.10.
|
|
31
|
-
"@quenty/loader": "^10.8.
|
|
32
|
-
"@quenty/maid": "^3.4.
|
|
33
|
-
"@quenty/playerutils": "^8.17.
|
|
34
|
-
"@quenty/promise": "^10.10.
|
|
35
|
-
"@quenty/remoting": "^12.18.
|
|
36
|
-
"@quenty/rx": "^13.17.
|
|
37
|
-
"@quenty/servicebag": "^11.11.
|
|
38
|
-
"@quenty/table": "^3.7.
|
|
28
|
+
"@quenty/baseobject": "^10.8.3",
|
|
29
|
+
"@quenty/brio": "^14.17.3",
|
|
30
|
+
"@quenty/grouputils": "^10.10.4",
|
|
31
|
+
"@quenty/loader": "^10.8.3",
|
|
32
|
+
"@quenty/maid": "^3.4.3",
|
|
33
|
+
"@quenty/playerutils": "^8.17.3",
|
|
34
|
+
"@quenty/promise": "^10.10.4",
|
|
35
|
+
"@quenty/remoting": "^12.18.3",
|
|
36
|
+
"@quenty/rx": "^13.17.3",
|
|
37
|
+
"@quenty/servicebag": "^11.11.4",
|
|
38
|
+
"@quenty/table": "^3.7.4"
|
|
39
39
|
},
|
|
40
40
|
"publishConfig": {
|
|
41
41
|
"access": "public"
|
|
42
42
|
},
|
|
43
|
-
"gitHead": "
|
|
43
|
+
"gitHead": "b06c070ae91d5dab7bd8de6e290ad2caabb15d8f"
|
|
44
44
|
}
|
|
@@ -17,8 +17,17 @@ local PermissionProviderClient = {}
|
|
|
17
17
|
PermissionProviderClient.__index = PermissionProviderClient
|
|
18
18
|
PermissionProviderClient.ClassName = "PermissionProviderClient"
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
export type PermissionProviderClient = typeof(setmetatable(
|
|
21
|
+
{} :: {
|
|
22
|
+
_remoteFunctionName: string,
|
|
23
|
+
_remoteFunctionPromise: Promise.Promise<RemoteFunction>?,
|
|
24
|
+
_cachedAdminPromise: Promise.Promise<boolean>?,
|
|
25
|
+
},
|
|
26
|
+
{} :: typeof({ __index = PermissionProviderClient })
|
|
27
|
+
))
|
|
28
|
+
|
|
29
|
+
function PermissionProviderClient.new(remoteFunctionName: string): PermissionProviderClient
|
|
30
|
+
local self: PermissionProviderClient = setmetatable({} :: any, PermissionProviderClient)
|
|
22
31
|
|
|
23
32
|
self._remoteFunctionName = remoteFunctionName or PermissionProviderConstants.DEFAULT_REMOTE_FUNCTION_NAME
|
|
24
33
|
|
|
@@ -31,7 +40,10 @@ end
|
|
|
31
40
|
@param player Player | nil
|
|
32
41
|
@return Promise<boolean>
|
|
33
42
|
]=]
|
|
34
|
-
function PermissionProviderClient
|
|
43
|
+
function PermissionProviderClient.PromiseIsAdmin(
|
|
44
|
+
self: PermissionProviderClient,
|
|
45
|
+
player: Player?
|
|
46
|
+
): Promise.Promise<boolean>
|
|
35
47
|
assert(typeof(player) == "Instance" and player:IsA("Player") or player == nil, "Bad player")
|
|
36
48
|
|
|
37
49
|
if player ~= nil then
|
|
@@ -46,29 +58,28 @@ function PermissionProviderClient:PromiseIsAdmin(player)
|
|
|
46
58
|
return self._cachedAdminPromise
|
|
47
59
|
end
|
|
48
60
|
|
|
49
|
-
self._cachedAdminPromise = self:_promiseRemoteFunction()
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
result = remoteFunction:InvokeServer()
|
|
55
|
-
end)
|
|
56
|
-
if not ok then
|
|
57
|
-
return reject(err)
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
if type(result) ~= "boolean" then
|
|
61
|
-
return reject("Got non-boolean from server")
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
return resolve(result)
|
|
61
|
+
self._cachedAdminPromise = self:_promiseRemoteFunction():Then(function(remoteFunction)
|
|
62
|
+
return Promise.spawn(function(resolve, reject)
|
|
63
|
+
local result = nil
|
|
64
|
+
local ok, err = pcall(function()
|
|
65
|
+
result = remoteFunction:InvokeServer()
|
|
65
66
|
end)
|
|
67
|
+
if not ok then
|
|
68
|
+
return reject(err)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
if type(result) ~= "boolean" then
|
|
72
|
+
return reject("Got non-boolean from server")
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
return resolve(result)
|
|
66
76
|
end)
|
|
77
|
+
end)
|
|
67
78
|
|
|
68
|
-
return self._cachedAdminPromise
|
|
79
|
+
return self._cachedAdminPromise :: any
|
|
69
80
|
end
|
|
70
81
|
|
|
71
|
-
function PermissionProviderClient
|
|
82
|
+
function PermissionProviderClient._promiseRemoteFunction(self: PermissionProviderClient)
|
|
72
83
|
if self._remoteFunctionPromise then
|
|
73
84
|
return self._remoteFunctionPromise
|
|
74
85
|
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
--!strict
|
|
1
2
|
--[=[
|
|
2
3
|
Utility functions to provide/configure a permission. See [BasePermissionProvider] and [PermissionService].
|
|
3
4
|
|
|
@@ -11,22 +12,44 @@ local PermissionProviderConstants = require("PermissionProviderConstants")
|
|
|
11
12
|
|
|
12
13
|
local PermissionProviderUtils = {}
|
|
13
14
|
|
|
15
|
+
type GroupRankConfig_Input = {
|
|
16
|
+
groupId: number,
|
|
17
|
+
minAdminRequiredRank: number,
|
|
18
|
+
minCreatorRequiredRank: number,
|
|
19
|
+
remoteFunctionName: string?,
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export type GroupRankConfig = {
|
|
23
|
+
type: "GroupRankConfigType",
|
|
24
|
+
} & GroupRankConfig_Input
|
|
25
|
+
|
|
26
|
+
export type SingleUserConfig_Input = {
|
|
27
|
+
userId: number,
|
|
28
|
+
remoteFunctionName: string?,
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export type SingleUserConfig = {
|
|
32
|
+
type: "SingleUserConfigType",
|
|
33
|
+
} & SingleUserConfig_Input
|
|
34
|
+
|
|
35
|
+
export type PermissionProviderConfig = GroupRankConfig | SingleUserConfig
|
|
36
|
+
|
|
14
37
|
--[=[
|
|
15
38
|
Creates a group rank config
|
|
16
39
|
@param config { groupId: number, minAdminRequiredRank: number, minCreatorRequiredRank: number }
|
|
17
40
|
@return table
|
|
18
41
|
]=]
|
|
19
|
-
function PermissionProviderUtils.createGroupRankConfig(config)
|
|
42
|
+
function PermissionProviderUtils.createGroupRankConfig(config: GroupRankConfig_Input): GroupRankConfig
|
|
20
43
|
assert(type(config.groupId) == "number", "Bad groupId")
|
|
21
44
|
assert(type(config.minCreatorRequiredRank) == "number", "Bad minCreatorRequiredRank")
|
|
22
45
|
assert(type(config.minAdminRequiredRank) == "number", "Bad minAdminRequiredRank")
|
|
23
46
|
|
|
24
47
|
return {
|
|
25
|
-
type = PermissionProviderConstants.GROUP_RANK_CONFIG_TYPE
|
|
26
|
-
groupId = config.groupId
|
|
27
|
-
minAdminRequiredRank = config.minAdminRequiredRank
|
|
28
|
-
minCreatorRequiredRank = config.minCreatorRequiredRank
|
|
29
|
-
remoteFunctionName = config.remoteFunctionName or PermissionProviderConstants.DEFAULT_REMOTE_FUNCTION_NAME
|
|
48
|
+
type = PermissionProviderConstants.GROUP_RANK_CONFIG_TYPE,
|
|
49
|
+
groupId = config.groupId,
|
|
50
|
+
minAdminRequiredRank = config.minAdminRequiredRank,
|
|
51
|
+
minCreatorRequiredRank = config.minCreatorRequiredRank,
|
|
52
|
+
remoteFunctionName = config.remoteFunctionName or PermissionProviderConstants.DEFAULT_REMOTE_FUNCTION_NAME,
|
|
30
53
|
}
|
|
31
54
|
end
|
|
32
55
|
|
|
@@ -35,13 +58,13 @@ end
|
|
|
35
58
|
@param config { userId: number }
|
|
36
59
|
@return table
|
|
37
60
|
]=]
|
|
38
|
-
function PermissionProviderUtils.createSingleUserConfig(config)
|
|
61
|
+
function PermissionProviderUtils.createSingleUserConfig(config: SingleUserConfig_Input): SingleUserConfig
|
|
39
62
|
assert(type(config.userId) == "number", "Bad userId")
|
|
40
63
|
|
|
41
64
|
return {
|
|
42
|
-
type = PermissionProviderConstants.SINGLE_USER_CONFIG_TYPE
|
|
43
|
-
userId = config.userId
|
|
44
|
-
remoteFunctionName = config.remoteFunctionName or PermissionProviderConstants.DEFAULT_REMOTE_FUNCTION_NAME
|
|
65
|
+
type = PermissionProviderConstants.SINGLE_USER_CONFIG_TYPE,
|
|
66
|
+
userId = config.userId,
|
|
67
|
+
remoteFunctionName = config.remoteFunctionName or PermissionProviderConstants.DEFAULT_REMOTE_FUNCTION_NAME,
|
|
45
68
|
}
|
|
46
69
|
end
|
|
47
70
|
|
|
@@ -49,7 +72,7 @@ end
|
|
|
49
72
|
Creates an automatic configuration from the game.
|
|
50
73
|
@return table
|
|
51
74
|
]=]
|
|
52
|
-
function PermissionProviderUtils.createConfigFromGame()
|
|
75
|
+
function PermissionProviderUtils.createConfigFromGame(): PermissionProviderConfig
|
|
53
76
|
if game.CreatorType == Enum.CreatorType.Group then
|
|
54
77
|
return PermissionProviderUtils.createGroupRankConfig({
|
|
55
78
|
groupId = game.CreatorId;
|
|
@@ -35,24 +35,34 @@ local Rx = require("Rx")
|
|
|
35
35
|
local RxBrioUtils = require("RxBrioUtils")
|
|
36
36
|
local RxPlayerUtils = require("RxPlayerUtils")
|
|
37
37
|
local PermissionLevelUtils = require("PermissionLevelUtils")
|
|
38
|
+
local _ServiceBag = require("ServiceBag")
|
|
39
|
+
local _Observable = require("Observable")
|
|
40
|
+
local _Brio = require("Brio")
|
|
41
|
+
local _BasePermissionProvider = require("BasePermissionProvider")
|
|
38
42
|
|
|
39
43
|
local PermissionService = {}
|
|
40
44
|
PermissionService.ServiceName = "PermissionService"
|
|
41
45
|
|
|
46
|
+
export type PermissionService = typeof(setmetatable(
|
|
47
|
+
{} :: {
|
|
48
|
+
_maid: Maid.Maid,
|
|
49
|
+
_promise: Promise.Promise<()>,
|
|
50
|
+
_provider: any,
|
|
51
|
+
},
|
|
52
|
+
{} :: typeof({ __index = PermissionService })
|
|
53
|
+
))
|
|
54
|
+
|
|
42
55
|
--[=[
|
|
43
56
|
Initializes the service. Should be done via [ServiceBag].
|
|
44
57
|
@param _serviceBag ServiceBag
|
|
45
58
|
]=]
|
|
46
|
-
function PermissionService:Init(_serviceBag)
|
|
59
|
+
function PermissionService:Init(_serviceBag: _ServiceBag.ServiceBag)
|
|
47
60
|
assert(not self._promise, "Already initialized")
|
|
48
61
|
assert(not self._provider, "Already have provider")
|
|
49
62
|
|
|
50
63
|
self._provider = nil
|
|
51
|
-
|
|
52
64
|
self._maid = Maid.new()
|
|
53
|
-
|
|
54
|
-
self._promise = Promise.new()
|
|
55
|
-
self._maid:GiveTask(self._promise)
|
|
65
|
+
self._promise = self._maid:Add(Promise.new())
|
|
56
66
|
end
|
|
57
67
|
|
|
58
68
|
--[=[
|
|
@@ -61,7 +71,7 @@ end
|
|
|
61
71
|
|
|
62
72
|
@param config { type: string }
|
|
63
73
|
]=]
|
|
64
|
-
function PermissionService:SetProviderFromConfig(config)
|
|
74
|
+
function PermissionService:SetProviderFromConfig(config: PermissionProviderUtils.PermissionProviderConfig)
|
|
65
75
|
assert(self._promise, "Not initialized")
|
|
66
76
|
assert(not self._provider, "Already have provider set")
|
|
67
77
|
|
|
@@ -91,7 +101,7 @@ end
|
|
|
91
101
|
Returns the permission provider
|
|
92
102
|
@return Promise<BasePermissionProvider>
|
|
93
103
|
]=]
|
|
94
|
-
function PermissionService:PromisePermissionProvider()
|
|
104
|
+
function PermissionService:PromisePermissionProvider(): Promise.Promise<_BasePermissionProvider.BasePermissionProvider>
|
|
95
105
|
assert(self._promise, "Not initialized")
|
|
96
106
|
|
|
97
107
|
return self._promise
|
|
@@ -102,7 +112,7 @@ end
|
|
|
102
112
|
@param player Player
|
|
103
113
|
@return Promise<boolean>
|
|
104
114
|
]=]
|
|
105
|
-
function PermissionService:PromiseIsAdmin(player: Player)
|
|
115
|
+
function PermissionService:PromiseIsAdmin(player: Player): Promise.Promise<boolean>
|
|
106
116
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "bad player")
|
|
107
117
|
|
|
108
118
|
return self:PromiseIsPermissionLevel(player, PermissionLevel.ADMIN)
|
|
@@ -113,7 +123,7 @@ end
|
|
|
113
123
|
@param player Player
|
|
114
124
|
@return Promise<boolean>
|
|
115
125
|
]=]
|
|
116
|
-
function PermissionService:PromiseIsCreator(player: Player)
|
|
126
|
+
function PermissionService:PromiseIsCreator(player: Player): Promise.Promise<boolean>
|
|
117
127
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "bad player")
|
|
118
128
|
|
|
119
129
|
return self:PromiseIsPermissionLevel(player, PermissionLevel.CREATOR)
|
|
@@ -125,7 +135,10 @@ end
|
|
|
125
135
|
@param permissionLevel PermissionLevel
|
|
126
136
|
@return Promise<boolean>
|
|
127
137
|
]=]
|
|
128
|
-
function PermissionService:PromiseIsPermissionLevel(
|
|
138
|
+
function PermissionService:PromiseIsPermissionLevel(
|
|
139
|
+
player: Player,
|
|
140
|
+
permissionLevel: PermissionLevel.PermissionLevel
|
|
141
|
+
): Promise.Promise<boolean>
|
|
129
142
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "bad player")
|
|
130
143
|
assert(PermissionLevelUtils.isPermissionLevel(permissionLevel), "Bad permissionLevel")
|
|
131
144
|
|
|
@@ -140,7 +153,7 @@ end
|
|
|
140
153
|
@param permissionLevel PermissionLevel
|
|
141
154
|
@return Observable<Brio<Player>>
|
|
142
155
|
]=]
|
|
143
|
-
function PermissionService:ObservePermissionedPlayersBrio(permissionLevel)
|
|
156
|
+
function PermissionService:ObservePermissionedPlayersBrio(permissionLevel: PermissionLevel.PermissionLevel): _Observable.Observable<_Brio.Brio<Player>>
|
|
144
157
|
assert(PermissionLevelUtils.isPermissionLevel(permissionLevel), "Bad permissionLevel")
|
|
145
158
|
|
|
146
159
|
return RxPlayerUtils.observePlayersBrio():Pipe({
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
--!strict
|
|
1
2
|
--[=[
|
|
2
3
|
Basic interface for providing permissions.
|
|
3
4
|
@server
|
|
@@ -11,21 +12,32 @@ local GetRemoteFunction = require("GetRemoteFunction")
|
|
|
11
12
|
local PermissionLevel = require("PermissionLevel")
|
|
12
13
|
local PermissionLevelUtils = require("PermissionLevelUtils")
|
|
13
14
|
local Table = require("Table")
|
|
15
|
+
local _Promise = require("Promise")
|
|
16
|
+
local _PermissionProviderUtils = require("PermissionProviderUtils")
|
|
14
17
|
|
|
15
18
|
local BasePermissionProvider = setmetatable({}, BaseObject)
|
|
16
19
|
BasePermissionProvider.ClassName = "BasePermissionProvider"
|
|
17
20
|
BasePermissionProvider.__index = BasePermissionProvider
|
|
18
21
|
|
|
22
|
+
export type BasePermissionProvider = typeof(setmetatable(
|
|
23
|
+
{} :: {
|
|
24
|
+
_config: { remoteFunctionName: string },
|
|
25
|
+
_remoteFunctionName: string,
|
|
26
|
+
_remoteFunction: RemoteFunction?,
|
|
27
|
+
},
|
|
28
|
+
{} :: typeof({ __index = BasePermissionProvider })
|
|
29
|
+
)) & BaseObject.BaseObject
|
|
30
|
+
|
|
19
31
|
--[=[
|
|
20
32
|
Initializes a new permission provider
|
|
21
33
|
|
|
22
34
|
@param config { remoteFunctionName: string }
|
|
23
35
|
@return BasePermissionProvider
|
|
24
36
|
]=]
|
|
25
|
-
function BasePermissionProvider.new(config)
|
|
26
|
-
local self = setmetatable(BaseObject.new(), BasePermissionProvider)
|
|
37
|
+
function BasePermissionProvider.new(config: _PermissionProviderUtils.PermissionProviderConfig): BasePermissionProvider
|
|
38
|
+
local self: BasePermissionProvider = setmetatable(BaseObject.new() :: any, BasePermissionProvider)
|
|
27
39
|
|
|
28
|
-
self._config = Table.readonly(assert(config, "Bad config"))
|
|
40
|
+
self._config = Table.readonly(assert(config, "Bad config") :: any)
|
|
29
41
|
self._remoteFunctionName = assert(self._config.remoteFunctionName, "Bad config")
|
|
30
42
|
|
|
31
43
|
return self
|
|
@@ -34,13 +46,14 @@ end
|
|
|
34
46
|
--[=[
|
|
35
47
|
Starts the permission provider. Should be done via ServiceBag.
|
|
36
48
|
]=]
|
|
37
|
-
function BasePermissionProvider
|
|
38
|
-
assert(not self._remoteFunction, "No remoteFunction")
|
|
49
|
+
function BasePermissionProvider.Start(self: BasePermissionProvider): ()
|
|
50
|
+
assert(not (self :: any)._remoteFunction, "No remoteFunction")
|
|
39
51
|
|
|
40
|
-
|
|
41
|
-
|
|
52
|
+
local remoteFunction = GetRemoteFunction(self._remoteFunctionName)
|
|
53
|
+
remoteFunction.OnServerInvoke = function(...)
|
|
42
54
|
return self:_onServerInvoke(...)
|
|
43
55
|
end
|
|
56
|
+
self._remoteFunction = remoteFunction
|
|
44
57
|
end
|
|
45
58
|
|
|
46
59
|
--[=[
|
|
@@ -49,7 +62,11 @@ end
|
|
|
49
62
|
@param permissionLevel PermissionLevel
|
|
50
63
|
@return Promise<boolean>
|
|
51
64
|
]=]
|
|
52
|
-
function BasePermissionProvider
|
|
65
|
+
function BasePermissionProvider.PromiseIsPermissionLevel(
|
|
66
|
+
_self: BasePermissionProvider,
|
|
67
|
+
player: Player,
|
|
68
|
+
permissionLevel: PermissionLevel.PermissionLevel
|
|
69
|
+
): _Promise.Promise<boolean>
|
|
53
70
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
54
71
|
assert(PermissionLevelUtils.isPermissionLevel(permissionLevel), "Bad permissionLevel")
|
|
55
72
|
|
|
@@ -62,7 +79,11 @@ end
|
|
|
62
79
|
@param permissionLevel PermissionLevel
|
|
63
80
|
@return Promise<boolean>
|
|
64
81
|
]=]
|
|
65
|
-
function BasePermissionProvider
|
|
82
|
+
function BasePermissionProvider.IsPermissionLevel(
|
|
83
|
+
self: BasePermissionProvider,
|
|
84
|
+
player: Player,
|
|
85
|
+
permissionLevel: PermissionLevel.PermissionLevel
|
|
86
|
+
): boolean
|
|
66
87
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
67
88
|
assert(PermissionLevelUtils.isPermissionLevel(permissionLevel), "Bad permissionLevel")
|
|
68
89
|
|
|
@@ -85,7 +106,10 @@ end
|
|
|
85
106
|
@param player Player
|
|
86
107
|
@return Promise<boolean>
|
|
87
108
|
]=]
|
|
88
|
-
function BasePermissionProvider
|
|
109
|
+
function BasePermissionProvider.PromiseIsCreator(
|
|
110
|
+
self: BasePermissionProvider,
|
|
111
|
+
player: Player
|
|
112
|
+
): _Promise.Promise<boolean>
|
|
89
113
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
90
114
|
|
|
91
115
|
return self:PromiseIsPermissionLevel(player, PermissionLevel.CREATOR)
|
|
@@ -96,7 +120,7 @@ end
|
|
|
96
120
|
@param player Player
|
|
97
121
|
@return Promise<boolean>
|
|
98
122
|
]=]
|
|
99
|
-
function BasePermissionProvider
|
|
123
|
+
function BasePermissionProvider.PromiseIsAdmin(self: BasePermissionProvider, player: Player): _Promise.Promise<boolean>
|
|
100
124
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
101
125
|
|
|
102
126
|
return self:PromiseIsPermissionLevel(player, PermissionLevel.ADMIN)
|
|
@@ -112,10 +136,10 @@ end
|
|
|
112
136
|
@param player Player
|
|
113
137
|
@return boolean
|
|
114
138
|
]=]
|
|
115
|
-
function BasePermissionProvider
|
|
139
|
+
function BasePermissionProvider.IsCreator(self: BasePermissionProvider, player: Player): boolean
|
|
116
140
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
117
141
|
|
|
118
|
-
return self:
|
|
142
|
+
return self:IsPermissionLevel(player, PermissionLevel.CREATOR)
|
|
119
143
|
end
|
|
120
144
|
|
|
121
145
|
--[=[
|
|
@@ -128,13 +152,13 @@ end
|
|
|
128
152
|
@param player Player
|
|
129
153
|
@return boolean
|
|
130
154
|
]=]
|
|
131
|
-
function BasePermissionProvider
|
|
155
|
+
function BasePermissionProvider.IsAdmin(self: BasePermissionProvider, player: Player): boolean
|
|
132
156
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
133
157
|
|
|
134
158
|
return self:IsPermissionLevel(player, PermissionLevel.ADMIN)
|
|
135
159
|
end
|
|
136
160
|
|
|
137
|
-
function BasePermissionProvider
|
|
161
|
+
function BasePermissionProvider._onServerInvoke(self: BasePermissionProvider, player: Player): boolean
|
|
138
162
|
local promise = self:PromiseIsAdmin(player)
|
|
139
163
|
local ok, result = promise:Yield()
|
|
140
164
|
if not ok then
|
|
@@ -145,5 +169,4 @@ function BasePermissionProvider:_onServerInvoke(player)
|
|
|
145
169
|
return result and true or false
|
|
146
170
|
end
|
|
147
171
|
|
|
148
|
-
|
|
149
172
|
return BasePermissionProvider
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
--!strict
|
|
1
2
|
--[=[
|
|
2
3
|
Provides permissions from a single user creator
|
|
3
4
|
|
|
@@ -14,17 +15,27 @@ local PermissionProviderConstants = require("PermissionProviderConstants")
|
|
|
14
15
|
local Promise = require("Promise")
|
|
15
16
|
local PermissionLevel = require("PermissionLevel")
|
|
16
17
|
local PermissionLevelUtils = require("PermissionLevelUtils")
|
|
18
|
+
local _PermissionProviderUtils = require("PermissionProviderUtils")
|
|
17
19
|
|
|
18
20
|
local CreatorPermissionProvider = setmetatable({}, BasePermissionProvider)
|
|
19
21
|
CreatorPermissionProvider.ClassName = "CreatorPermissionProvider"
|
|
20
22
|
CreatorPermissionProvider.__index = CreatorPermissionProvider
|
|
21
23
|
|
|
24
|
+
export type CreatorPermissionProvider = typeof(setmetatable(
|
|
25
|
+
{} :: {
|
|
26
|
+
_config: _PermissionProviderUtils.SingleUserConfig,
|
|
27
|
+
_userId: number,
|
|
28
|
+
},
|
|
29
|
+
{} :: typeof({ __index = CreatorPermissionProvider })
|
|
30
|
+
)) & BasePermissionProvider.BasePermissionProvider
|
|
31
|
+
|
|
22
32
|
--[=[
|
|
23
33
|
@param config table
|
|
24
34
|
@return CreatorPermissionProvider
|
|
25
35
|
]=]
|
|
26
|
-
function CreatorPermissionProvider.new(config)
|
|
27
|
-
local self =
|
|
36
|
+
function CreatorPermissionProvider.new(config: _PermissionProviderUtils.SingleUserConfig): CreatorPermissionProvider
|
|
37
|
+
local self: CreatorPermissionProvider =
|
|
38
|
+
setmetatable(BasePermissionProvider.new(config) :: any, CreatorPermissionProvider)
|
|
28
39
|
|
|
29
40
|
assert(self._config.type == PermissionProviderConstants.SINGLE_USER_CONFIG_TYPE, "Bad configType")
|
|
30
41
|
self._userId = assert(self._config.userId, "No userId")
|
|
@@ -39,7 +50,7 @@ end
|
|
|
39
50
|
@param permissionLevel PermissionLevel
|
|
40
51
|
@return Promise<boolean>
|
|
41
52
|
]=]
|
|
42
|
-
function CreatorPermissionProvider
|
|
53
|
+
function CreatorPermissionProvider.PromiseIsPermissionLevel(self: CreatorPermissionProvider, player: Player, permissionLevel: PermissionLevel.PermissionLevel): Promise.Promise<boolean>
|
|
43
54
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
44
55
|
assert(PermissionLevelUtils.isPermissionLevel(permissionLevel), "Bad permissionLevel")
|
|
45
56
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
--!strict
|
|
1
2
|
--[=[
|
|
2
3
|
Provides permissions from a group
|
|
3
4
|
|
|
@@ -15,17 +16,31 @@ local PermissionLevel = require("PermissionLevel")
|
|
|
15
16
|
local PermissionLevelUtils = require("PermissionLevelUtils")
|
|
16
17
|
local PermissionProviderConstants = require("PermissionProviderConstants")
|
|
17
18
|
local Promise = require("Promise")
|
|
19
|
+
local _PermissionProviderUtils = require("PermissionProviderUtils")
|
|
18
20
|
|
|
19
21
|
local GroupPermissionProvider = setmetatable({}, BasePermissionProvider)
|
|
20
22
|
GroupPermissionProvider.__index = GroupPermissionProvider
|
|
21
23
|
GroupPermissionProvider.ClassName = "GroupPermissionProvider"
|
|
22
24
|
|
|
25
|
+
export type GroupPermissionProvider = typeof(setmetatable(
|
|
26
|
+
{} :: {
|
|
27
|
+
_config: _PermissionProviderUtils.GroupRankConfig,
|
|
28
|
+
_groupId: number,
|
|
29
|
+
_minAdminRequiredRank: number,
|
|
30
|
+
_minCreatorRequiredRank: number,
|
|
31
|
+
_adminsCache: { [number]: true },
|
|
32
|
+
_creatorCache: { [number]: true },
|
|
33
|
+
_promiseRankPromisesCache: { [number]: Promise.Promise<number> },
|
|
34
|
+
},
|
|
35
|
+
{} :: typeof({ __index = GroupPermissionProvider })
|
|
36
|
+
)) & BasePermissionProvider.BasePermissionProvider
|
|
37
|
+
|
|
23
38
|
--[=[
|
|
24
39
|
@param config table
|
|
25
40
|
@return GroupPermissionProvider
|
|
26
41
|
]=]
|
|
27
|
-
function GroupPermissionProvider.new(config)
|
|
28
|
-
local self = setmetatable(BasePermissionProvider.new(config), GroupPermissionProvider)
|
|
42
|
+
function GroupPermissionProvider.new(config: _PermissionProviderUtils.GroupRankConfig): GroupPermissionProvider
|
|
43
|
+
local self = setmetatable(BasePermissionProvider.new(config) :: any, GroupPermissionProvider)
|
|
29
44
|
|
|
30
45
|
assert(self._config.type == PermissionProviderConstants.GROUP_RANK_CONFIG_TYPE, "Bad configType")
|
|
31
46
|
|
|
@@ -40,12 +55,12 @@ end
|
|
|
40
55
|
--[=[
|
|
41
56
|
Starts the permission provider. Should be done via ServiceBag.
|
|
42
57
|
]=]
|
|
43
|
-
function GroupPermissionProvider
|
|
58
|
+
function GroupPermissionProvider.Start(self: GroupPermissionProvider)
|
|
44
59
|
assert(self._config, "Bad config")
|
|
45
60
|
|
|
46
61
|
getmetatable(GroupPermissionProvider).Start(self)
|
|
47
62
|
|
|
48
|
-
self._maid:GiveTask(Players.PlayerRemoving:Connect(function(player)
|
|
63
|
+
self._maid:GiveTask(Players.PlayerRemoving:Connect(function(player: Player)
|
|
49
64
|
local userId = player.UserId
|
|
50
65
|
|
|
51
66
|
self._adminsCache[userId] = nil
|
|
@@ -76,7 +91,11 @@ end
|
|
|
76
91
|
@param permissionLevel PermissionLevel
|
|
77
92
|
@return Promise<boolean>
|
|
78
93
|
]=]
|
|
79
|
-
function GroupPermissionProvider
|
|
94
|
+
function GroupPermissionProvider.PromiseIsPermissionLevel(
|
|
95
|
+
self: GroupPermissionProvider,
|
|
96
|
+
player: Player,
|
|
97
|
+
permissionLevel: PermissionLevel.PermissionLevel
|
|
98
|
+
): Promise.Promise<boolean>
|
|
80
99
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
81
100
|
assert(PermissionLevelUtils.isPermissionLevel(permissionLevel), "Bad permissionLevel")
|
|
82
101
|
|
|
@@ -89,7 +108,10 @@ function GroupPermissionProvider:PromiseIsPermissionLevel(player: Player, permis
|
|
|
89
108
|
end
|
|
90
109
|
end
|
|
91
110
|
|
|
92
|
-
function GroupPermissionProvider
|
|
111
|
+
function GroupPermissionProvider._promiseIsCreator(
|
|
112
|
+
self: GroupPermissionProvider,
|
|
113
|
+
player: Player
|
|
114
|
+
): Promise.Promise<boolean>
|
|
93
115
|
assert(typeof(player) == "Instance" and player:IsA("Player"), "Bad player")
|
|
94
116
|
assert(player:IsDescendantOf(game), "Bad player")
|
|
95
117
|
|
|
@@ -102,7 +124,10 @@ function GroupPermissionProvider:_promiseIsCreator(player: Player)
|
|
|
102
124
|
end)
|
|
103
125
|
end
|
|
104
126
|
|
|
105
|
-
function GroupPermissionProvider
|
|
127
|
+
function GroupPermissionProvider._promiseIsAdmin(
|
|
128
|
+
self: GroupPermissionProvider,
|
|
129
|
+
player: Player
|
|
130
|
+
): Promise.Promise<boolean>
|
|
106
131
|
assert(player:IsDescendantOf(game))
|
|
107
132
|
|
|
108
133
|
-- really not saving much time.
|
|
@@ -119,7 +144,7 @@ function GroupPermissionProvider:_promiseIsAdmin(player: Player)
|
|
|
119
144
|
end)
|
|
120
145
|
end
|
|
121
146
|
|
|
122
|
-
function GroupPermissionProvider
|
|
147
|
+
function GroupPermissionProvider._handlePlayer(self: GroupPermissionProvider, player: Player): ()
|
|
123
148
|
assert(player, "Bad player")
|
|
124
149
|
|
|
125
150
|
self:_promiseRankInGroup(player):Then(function(rank)
|
|
@@ -133,7 +158,7 @@ function GroupPermissionProvider:_handlePlayer(player: Player)
|
|
|
133
158
|
end)
|
|
134
159
|
end
|
|
135
160
|
|
|
136
|
-
function GroupPermissionProvider
|
|
161
|
+
function GroupPermissionProvider._promiseRankInGroup(self: GroupPermissionProvider, player: Player): Promise.Promise<number>
|
|
137
162
|
assert(typeof(player) == "Instance", "Bad player")
|
|
138
163
|
|
|
139
164
|
if self._promiseRankPromisesCache[player.UserId] then
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
--!strict
|
|
1
2
|
--[=[
|
|
2
3
|
@class PermissionLevel
|
|
3
4
|
]=]
|
|
@@ -6,7 +7,14 @@ local require = require(script.Parent.loader).load(script)
|
|
|
6
7
|
|
|
7
8
|
local Table = require("Table")
|
|
8
9
|
|
|
10
|
+
export type PermissionLevel = "admin" | "creator"
|
|
11
|
+
|
|
12
|
+
export type PermissionLevelMap = {
|
|
13
|
+
ADMIN: "admin",
|
|
14
|
+
CREATOR: "creator",
|
|
15
|
+
}
|
|
16
|
+
|
|
9
17
|
return Table.readonly({
|
|
10
|
-
ADMIN = "admin"
|
|
11
|
-
CREATOR = "creator"
|
|
12
|
-
})
|
|
18
|
+
ADMIN = "admin",
|
|
19
|
+
CREATOR = "creator",
|
|
20
|
+
} :: PermissionLevelMap)
|
|
@@ -13,8 +13,11 @@ for _, item in PermissionLevel do
|
|
|
13
13
|
ALLOWED[item] = true
|
|
14
14
|
end
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
--[=[
|
|
17
|
+
Returns true if a permission level
|
|
18
|
+
]=]
|
|
19
|
+
function PermissionLevelUtils.isPermissionLevel(permissionLevel: any): boolean
|
|
20
|
+
return ALLOWED[permissionLevel] == true
|
|
18
21
|
end
|
|
19
22
|
|
|
20
23
|
return PermissionLevelUtils
|
|
@@ -7,10 +7,16 @@ local require = require(script.Parent.loader).load(script)
|
|
|
7
7
|
|
|
8
8
|
local Table = require("Table")
|
|
9
9
|
|
|
10
|
+
export type PermissionProviderConstants = {
|
|
11
|
+
DEFAULT_REMOTE_FUNCTION_NAME: "PermissionProviderDefaultRemoteFunction",
|
|
12
|
+
GROUP_RANK_CONFIG_TYPE: "GroupRankConfigType",
|
|
13
|
+
SINGLE_USER_CONFIG_TYPE: "SingleUserConfigType",
|
|
14
|
+
}
|
|
15
|
+
|
|
10
16
|
return Table.readonly({
|
|
11
|
-
DEFAULT_REMOTE_FUNCTION_NAME = "PermissionProviderDefaultRemoteFunction"
|
|
17
|
+
DEFAULT_REMOTE_FUNCTION_NAME = "PermissionProviderDefaultRemoteFunction",
|
|
12
18
|
|
|
13
19
|
-- types
|
|
14
|
-
GROUP_RANK_CONFIG_TYPE = "GroupRankConfigType"
|
|
15
|
-
SINGLE_USER_CONFIG_TYPE = "SingleUserConfigType"
|
|
16
|
-
})
|
|
20
|
+
GROUP_RANK_CONFIG_TYPE = "GroupRankConfigType",
|
|
21
|
+
SINGLE_USER_CONFIG_TYPE = "SingleUserConfigType",
|
|
22
|
+
} :: PermissionProviderConstants)
|