@expcluster/permission-groups 7.0.1
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/LICENSE.md +21 -0
- package/controller.ts +434 -0
- package/dist/browser/messages.d.ts +527 -0
- package/dist/browser/messages.d.ts.map +1 -0
- package/dist/browser/messages.js +561 -0
- package/dist/browser/messages.js.map +1 -0
- package/dist/browser/package.json +49 -0
- package/dist/browser/tsconfig.browser.tsbuildinfo +1 -0
- package/dist/browser/web/components/AssignmentForm.d.ts +7 -0
- package/dist/browser/web/components/AssignmentForm.d.ts.map +1 -0
- package/dist/browser/web/components/AssignmentForm.js +29 -0
- package/dist/browser/web/components/AssignmentForm.js.map +1 -0
- package/dist/browser/web/components/AssignmentsTable.d.ts +2 -0
- package/dist/browser/web/components/AssignmentsTable.d.ts.map +1 -0
- package/dist/browser/web/components/AssignmentsTable.js +61 -0
- package/dist/browser/web/components/AssignmentsTable.js.map +1 -0
- package/dist/browser/web/components/DeleteConfirm.d.ts +6 -0
- package/dist/browser/web/components/DeleteConfirm.d.ts.map +1 -0
- package/dist/browser/web/components/DeleteConfirm.js +7 -0
- package/dist/browser/web/components/DeleteConfirm.js.map +1 -0
- package/dist/browser/web/components/GroupForm.d.ts +5 -0
- package/dist/browser/web/components/GroupForm.d.ts.map +1 -0
- package/dist/browser/web/components/GroupForm.js +22 -0
- package/dist/browser/web/components/GroupForm.js.map +1 -0
- package/dist/browser/web/components/GroupViewPage.d.ts +2 -0
- package/dist/browser/web/components/GroupViewPage.d.ts.map +1 -0
- package/dist/browser/web/components/GroupViewPage.js +161 -0
- package/dist/browser/web/components/GroupViewPage.js.map +1 -0
- package/dist/browser/web/components/GroupsTable.d.ts +2 -0
- package/dist/browser/web/components/GroupsTable.d.ts.map +1 -0
- package/dist/browser/web/components/GroupsTable.js +29 -0
- package/dist/browser/web/components/GroupsTable.js.map +1 -0
- package/dist/browser/web/components/RoleMappingForm.d.ts +7 -0
- package/dist/browser/web/components/RoleMappingForm.d.ts.map +1 -0
- package/dist/browser/web/components/RoleMappingForm.js +32 -0
- package/dist/browser/web/components/RoleMappingForm.js.map +1 -0
- package/dist/browser/web/components/RoleMappingsTable.d.ts +2 -0
- package/dist/browser/web/components/RoleMappingsTable.d.ts.map +1 -0
- package/dist/browser/web/components/RoleMappingsTable.js +64 -0
- package/dist/browser/web/components/RoleMappingsTable.js.map +1 -0
- package/dist/browser/web/index.d.ts +13 -0
- package/dist/browser/web/index.d.ts.map +1 -0
- package/dist/browser/web/index.js +60 -0
- package/dist/browser/web/index.js.map +1 -0
- package/dist/node/controller.d.ts +37 -0
- package/dist/node/controller.d.ts.map +1 -0
- package/dist/node/controller.js +372 -0
- package/dist/node/controller.js.map +1 -0
- package/dist/node/index.d.ts +10 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +196 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/instance.d.ts +40 -0
- package/dist/node/instance.d.ts.map +1 -0
- package/dist/node/instance.js +155 -0
- package/dist/node/instance.js.map +1 -0
- package/dist/node/messages.d.ts +527 -0
- package/dist/node/messages.d.ts.map +1 -0
- package/dist/node/messages.js +620 -0
- package/dist/node/messages.js.map +1 -0
- package/dist/node/tsconfig.node.tsbuildinfo +1 -0
- package/dist/web/manifest.json +10 -0
- package/dist/web/static/exp_groups.afefd90b210f7c8e0df2.js +543 -0
- package/dist/web/static/index_ts.f7d30aa0c13ff0be393a.js +22 -0
- package/dist/web/static/main.c2178975889c1c720e80.js +653 -0
- package/dist/web/static/messages_ts.65a81c17fb37953c5d68.js +22 -0
- package/dist/web/static/package_json.aab0d3f37da0567c250c.js +22 -0
- package/dist/web/static/vendors-node_modules_pnpm_ant-design_icons_6_2_3_rea_94b50600dfe79448cabf92d130d83059_node_mo-c79f54.cf768c64b40c811ce6c9.js +273 -0
- package/dist/web/static/vendors-node_modules_pnpm_sinclair_typebox_0_30_4_node_modules_sinclair_typebox_typebox_js.7fa46fac84f2e9324e54.js +22 -0
- package/dist/web/static/web_index_tsx-webpack_sharing_consume_default_react.b4766180f4d467b7b24f.js +102 -0
- package/index.ts +183 -0
- package/instance.ts +171 -0
- package/messages.ts +692 -0
- package/module/control.lua +438 -0
- package/module/globals.lua +11 -0
- package/module/module.json +12 -0
- package/module/module_exports.lua +3 -0
- package/package.json +47 -0
- package/tsconfig.browser.json +4 -0
- package/tsconfig.json +7 -0
- package/tsconfig.node.json +5 -0
- package/web/components/AssignmentForm.tsx +74 -0
- package/web/components/AssignmentsTable.tsx +111 -0
- package/web/components/DeleteConfirm.tsx +16 -0
- package/web/components/GroupForm.tsx +45 -0
- package/web/components/GroupViewPage.tsx +287 -0
- package/web/components/GroupsTable.tsx +49 -0
- package/web/components/RoleMappingForm.tsx +106 -0
- package/web/components/RoleMappingsTable.tsx +107 -0
- package/web/index.tsx +108 -0
- package/webpack.config.js +34 -0
package/index.ts
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import * as lib from "@clusterio/lib";
|
|
2
|
+
import * as messages from "./messages";
|
|
3
|
+
|
|
4
|
+
declare module "@clusterio/lib" {
|
|
5
|
+
export interface InstanceConfigFields {
|
|
6
|
+
"exp_groups.sync_mode": "enabled" | "disabled" | "bidirectional"
|
|
7
|
+
}
|
|
8
|
+
export interface ControllerConfigFields {
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// Group permissions
|
|
13
|
+
|
|
14
|
+
lib.definePermission({
|
|
15
|
+
name: "exp_groups.group.get",
|
|
16
|
+
title: "Get Groups",
|
|
17
|
+
description: "Retrieve a specific Factorio permission group by ID.",
|
|
18
|
+
grantByDefault: true,
|
|
19
|
+
});
|
|
20
|
+
lib.definePermission({
|
|
21
|
+
name: "exp_groups.group.list",
|
|
22
|
+
title: "List Groups",
|
|
23
|
+
description: "List all Factorio permission groups.",
|
|
24
|
+
grantByDefault: true,
|
|
25
|
+
});
|
|
26
|
+
lib.definePermission({
|
|
27
|
+
name: "exp_groups.group.subscribe",
|
|
28
|
+
title: "Subscribe to Group Updates",
|
|
29
|
+
description: "Receive updates when Factorio permission groups change.",
|
|
30
|
+
grantByDefault: true,
|
|
31
|
+
});
|
|
32
|
+
lib.definePermission({
|
|
33
|
+
name: "exp_groups.group.create",
|
|
34
|
+
title: "Create Groups",
|
|
35
|
+
description: "Create new Factorio permission groups.",
|
|
36
|
+
grantByDefault: false,
|
|
37
|
+
});
|
|
38
|
+
lib.definePermission({
|
|
39
|
+
name: "exp_groups.group.update",
|
|
40
|
+
title: "Update Groups",
|
|
41
|
+
description: "Modify existing Factorio permission groups.",
|
|
42
|
+
grantByDefault: false,
|
|
43
|
+
});
|
|
44
|
+
lib.definePermission({
|
|
45
|
+
name: "exp_groups.group.delete",
|
|
46
|
+
title: "Delete Groups",
|
|
47
|
+
description: "Delete Factorio permission groups.",
|
|
48
|
+
grantByDefault: false,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// Assignment permissions
|
|
52
|
+
|
|
53
|
+
lib.definePermission({
|
|
54
|
+
name: "exp_groups.assignment.get",
|
|
55
|
+
title: "Get Assignments",
|
|
56
|
+
description: "Retrieve a specific manual group assignment for a player.",
|
|
57
|
+
grantByDefault: true,
|
|
58
|
+
});
|
|
59
|
+
lib.definePermission({
|
|
60
|
+
name: "exp_groups.assignment.list",
|
|
61
|
+
title: "List Assignments",
|
|
62
|
+
description: "List all manual group assignments.",
|
|
63
|
+
grantByDefault: true,
|
|
64
|
+
});
|
|
65
|
+
lib.definePermission({
|
|
66
|
+
name: "exp_groups.assignment.subscribe",
|
|
67
|
+
title: "Subscribe to Assignment Updates",
|
|
68
|
+
description: "Receive updates when manual group assignments change.",
|
|
69
|
+
grantByDefault: true,
|
|
70
|
+
});
|
|
71
|
+
lib.definePermission({
|
|
72
|
+
name: "exp_groups.assignment.create",
|
|
73
|
+
title: "Create Assignments",
|
|
74
|
+
description: "Manually assign players to groups, overriding role mappings.",
|
|
75
|
+
grantByDefault: false,
|
|
76
|
+
});
|
|
77
|
+
lib.definePermission({
|
|
78
|
+
name: "exp_groups.assignment.update",
|
|
79
|
+
title: "Update Assignments",
|
|
80
|
+
description: "Modify existing manual group assignments.",
|
|
81
|
+
grantByDefault: false,
|
|
82
|
+
});
|
|
83
|
+
lib.definePermission({
|
|
84
|
+
name: "exp_groups.assignment.delete",
|
|
85
|
+
title: "Delete Assignments",
|
|
86
|
+
description: "Remove manual group assignments.",
|
|
87
|
+
grantByDefault: false,
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
// Role mapping permissions
|
|
91
|
+
|
|
92
|
+
lib.definePermission({
|
|
93
|
+
name: "exp_groups.role_mapping.get",
|
|
94
|
+
title: "Get Role Mappings",
|
|
95
|
+
description: "Retrieve a specific role mapping rule.",
|
|
96
|
+
grantByDefault: true,
|
|
97
|
+
});
|
|
98
|
+
lib.definePermission({
|
|
99
|
+
name: "exp_groups.role_mapping.list",
|
|
100
|
+
title: "List Role Mappings",
|
|
101
|
+
description: "List all role mapping rules.",
|
|
102
|
+
grantByDefault: true,
|
|
103
|
+
});
|
|
104
|
+
lib.definePermission({
|
|
105
|
+
name: "exp_groups.role_mapping.subscribe",
|
|
106
|
+
title: "Subscribe to Role Mapping Updates",
|
|
107
|
+
description: "Receive updates when role mapping rules change.",
|
|
108
|
+
grantByDefault: true,
|
|
109
|
+
});
|
|
110
|
+
lib.definePermission({
|
|
111
|
+
name: "exp_groups.role_mapping.create",
|
|
112
|
+
title: "Create Role Mappings",
|
|
113
|
+
description: "Create rules that map user roles to Factorio permission groups.",
|
|
114
|
+
grantByDefault: false,
|
|
115
|
+
});
|
|
116
|
+
lib.definePermission({
|
|
117
|
+
name: "exp_groups.role_mapping.update",
|
|
118
|
+
title: "Update Role Mappings",
|
|
119
|
+
description: "Modify existing role mapping rules.",
|
|
120
|
+
grantByDefault: false,
|
|
121
|
+
});
|
|
122
|
+
lib.definePermission({
|
|
123
|
+
name: "exp_groups.role_mapping.delete",
|
|
124
|
+
title: "Delete Role Mappings",
|
|
125
|
+
description: "Delete role mapping rules.",
|
|
126
|
+
grantByDefault: false,
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
export const plugin: lib.PluginDeclaration = {
|
|
130
|
+
name: "exp_groups",
|
|
131
|
+
title: "ExpGaming - Permission Groups",
|
|
132
|
+
description: "Clusterio plugin providing syncing of permission groups",
|
|
133
|
+
|
|
134
|
+
features: [
|
|
135
|
+
"SavePatching",
|
|
136
|
+
"ScriptCommands",
|
|
137
|
+
],
|
|
138
|
+
|
|
139
|
+
messages: [
|
|
140
|
+
messages.GroupUpdatedEvent,
|
|
141
|
+
messages.ManualAssignmentUpdatedEvent,
|
|
142
|
+
messages.ResolvedAssignmentUpdatedEvent,
|
|
143
|
+
messages.RoleMappingUpdatedEvent,
|
|
144
|
+
|
|
145
|
+
messages.GroupCreateRequest,
|
|
146
|
+
messages.GroupUpdateRequest,
|
|
147
|
+
messages.GroupDeleteRequest,
|
|
148
|
+
messages.GroupGetRequest,
|
|
149
|
+
messages.GroupListRequest,
|
|
150
|
+
|
|
151
|
+
messages.AssignmentCreateRequest,
|
|
152
|
+
messages.AssignmentUpdateRequest,
|
|
153
|
+
messages.AssignmentDeleteRequest,
|
|
154
|
+
messages.AssignmentGetRequest,
|
|
155
|
+
messages.AssignmentListRequest,
|
|
156
|
+
|
|
157
|
+
messages.RoleMappingCreateRequest,
|
|
158
|
+
messages.RoleMappingUpdateRequest,
|
|
159
|
+
messages.RoleMappingDeleteRequest,
|
|
160
|
+
messages.RoleMappingGetRequest,
|
|
161
|
+
messages.RoleMappingListRequest,
|
|
162
|
+
],
|
|
163
|
+
|
|
164
|
+
instanceEntrypoint: "./dist/node/instance",
|
|
165
|
+
instanceConfigFields: {
|
|
166
|
+
"exp_groups.sync_mode": {
|
|
167
|
+
description: "Synchronize permission groups with the controller",
|
|
168
|
+
type: "string",
|
|
169
|
+
enum: ["disabled", "enabled", "bidirectional"],
|
|
170
|
+
initialValue: "bidirectional",
|
|
171
|
+
},
|
|
172
|
+
},
|
|
173
|
+
|
|
174
|
+
controllerEntrypoint: "./dist/node/controller",
|
|
175
|
+
controllerConfigFields: {
|
|
176
|
+
},
|
|
177
|
+
|
|
178
|
+
webEntrypoint: "./web",
|
|
179
|
+
routes: [
|
|
180
|
+
"/permission_groups",
|
|
181
|
+
"/permission_groups/:id/view",
|
|
182
|
+
]
|
|
183
|
+
};
|
package/instance.ts
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { BaseInstancePlugin } from "@clusterio/host";
|
|
2
|
+
import * as lib from "@clusterio/lib";
|
|
3
|
+
import * as messages from "./messages";
|
|
4
|
+
|
|
5
|
+
export type IpcGroupUpdated = {
|
|
6
|
+
group_name: string,
|
|
7
|
+
group_id: number | undefined,
|
|
8
|
+
permissions: { is_blacklist: boolean, permissions: string[] | undefined },
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export type IpcGroupDeleted = {
|
|
12
|
+
group_name: string,
|
|
13
|
+
group_id: number | undefined,
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export type IpcPlayerAssignments = {
|
|
17
|
+
assignments: Record<string, number>,
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export class InstancePlugin extends BaseInstancePlugin {
|
|
21
|
+
// Once only, don't send permissions for these groups
|
|
22
|
+
// This is used for groups created on this instance that only need the controller generated id
|
|
23
|
+
skipSendingPermissions = new Set<string>();
|
|
24
|
+
// This is used for groups updated / deleted on this instance to stop cycles
|
|
25
|
+
skipSendingUpdate = new Set<number>();
|
|
26
|
+
// Track known online players so that we only apply assignment updates for them
|
|
27
|
+
onlinePlayers = new Set<string>();
|
|
28
|
+
|
|
29
|
+
async init() {
|
|
30
|
+
this.instance.handle(messages.GroupUpdatedEvent, this.handleGroupUpdatedEvent.bind(this));
|
|
31
|
+
this.instance.handle(messages.ResolvedAssignmentUpdatedEvent, this.handleResolvedAssignmentUpdatedEvent.bind(this));
|
|
32
|
+
this.instance.server.handle(`exp_group:group_updated`, this.handleGroupUpdatedIPC.bind(this))
|
|
33
|
+
this.instance.server.handle(`exp_group:group_deleted`, this.handleGroupDeletedIPC.bind(this))
|
|
34
|
+
this.instance.server.handle(`exp_group:player_assignments`, this.handlePlayerAssignmentsIPC.bind(this))
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async onInstanceConfigFieldChanged(field: string, curr: unknown, prev: unknown) {
|
|
38
|
+
switch(field) {
|
|
39
|
+
case "exp_groups.sync_mode":
|
|
40
|
+
await this.luaSetEmitEvents(curr == "bidirectional")
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async onStart() {
|
|
46
|
+
// We use Date.now() because we need to manually initialise the groups on the lua side
|
|
47
|
+
await this.instance.sendTo("controller", new lib.SubscriptionRequest(
|
|
48
|
+
`exp_groups:${messages.GroupUpdatedEvent.name}`, "subscribe", Date.now()
|
|
49
|
+
));
|
|
50
|
+
const groups = await this.instance.sendTo("controller", new messages.GroupListRequest())
|
|
51
|
+
await this.luaSendInitialGroups(groups);
|
|
52
|
+
await this.luaSetEmitEvents(this.instance.config.get("exp_groups.sync_mode") == "bidirectional")
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async onPlayerEvent(event: lib.PlayerEvent) {
|
|
56
|
+
switch(event.type) {
|
|
57
|
+
case "join":
|
|
58
|
+
this.onlinePlayers.add(event.name);
|
|
59
|
+
await this.subscribePlayerAssignment(event.name);
|
|
60
|
+
break;
|
|
61
|
+
case "leave":
|
|
62
|
+
this.onlinePlayers.delete(event.name);
|
|
63
|
+
await this.unsubscribePlayerAssignment(event.name);
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async handleGroupUpdatedEvent(event: messages.GroupUpdatedEvent) {
|
|
69
|
+
for (const group of event.updates) {
|
|
70
|
+
await this.luaSendGroupUpdate(group);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async handleResolvedAssignmentUpdatedEvent(event: messages.ManualAssignmentUpdatedEvent) {
|
|
75
|
+
for (const assignment of event.updates) {
|
|
76
|
+
if (this.onlinePlayers.has(assignment.name)) {
|
|
77
|
+
await this.luaSendAssignmentUpdate(assignment);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async handleGroupUpdatedIPC(event: IpcGroupUpdated) {
|
|
83
|
+
const permissions = new messages.GroupPermissions(
|
|
84
|
+
event.permissions.is_blacklist,
|
|
85
|
+
event.permissions.permissions ?? [],
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
if (event.group_id === undefined) {
|
|
89
|
+
this.skipSendingPermissions.add(event.group_name);
|
|
90
|
+
await this.instance.sendTo("controller",
|
|
91
|
+
new messages.GroupCreateRequest(event.group_name, permissions),
|
|
92
|
+
);
|
|
93
|
+
} else {
|
|
94
|
+
this.skipSendingUpdate.add(event.group_id);
|
|
95
|
+
await this.instance.sendTo("controller", new messages.GroupUpdateRequest(
|
|
96
|
+
new messages.GroupRecord(event.group_id, event.group_name, permissions),
|
|
97
|
+
));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
async handleGroupDeletedIPC(event: IpcGroupDeleted) {
|
|
102
|
+
if (event.group_id === undefined) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
this.skipSendingUpdate.add(event.group_id);
|
|
106
|
+
await this.instance.sendTo("controller", new messages.GroupDeleteRequest(event.group_id));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
async handlePlayerAssignmentsIPC(event: IpcPlayerAssignments) {
|
|
110
|
+
await Promise.all(
|
|
111
|
+
Object.entries(event.assignments).map(([playerName, groupId]) =>
|
|
112
|
+
this.instance.sendTo("controller",
|
|
113
|
+
new messages.AssignmentUpdateRequest(new messages.AssignmentRecord(playerName, groupId)),
|
|
114
|
+
)
|
|
115
|
+
)
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
async subscribePlayerAssignment(playerName: string) {
|
|
120
|
+
await this.instance.sendTo("controller", new lib.SubscriptionRequest(
|
|
121
|
+
`exp_groups:${messages.ResolvedAssignmentUpdatedEvent.name}`, "subscribe", 0, lib.SubscriptionFilters.fromShorthand(playerName)
|
|
122
|
+
));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
async unsubscribePlayerAssignment(playerName: string) {
|
|
126
|
+
await this.instance.sendTo("controller", new lib.SubscriptionRequest(
|
|
127
|
+
`exp_groups:${messages.ResolvedAssignmentUpdatedEvent.name}`, "unsubscribe", 0, lib.SubscriptionFilters.fromShorthand(playerName)
|
|
128
|
+
));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
async luaSendInitialGroups(groups: messages.GroupRecord[]) {
|
|
132
|
+
if (this.instance.config.get("exp_groups.sync_mode") === "disabled") {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
await this.luaSend("initialise_groups", groups);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
async luaSendGroupUpdate(group: messages.GroupRecord) {
|
|
139
|
+
if (this.instance.config.get("exp_groups.sync_mode") === "disabled") {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (this.skipSendingUpdate.has(group.id)) {
|
|
144
|
+
this.skipSendingUpdate.delete(group.id);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const json = group.toJSON();
|
|
149
|
+
if (this.skipSendingPermissions.has(group.name)) {
|
|
150
|
+
this.skipSendingPermissions.delete(group.name);
|
|
151
|
+
delete (json as any).permissions;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
await this.luaSend("receive_group_update", json);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
async luaSendAssignmentUpdate(assignment: messages.AssignmentRecord) {
|
|
158
|
+
if (this.instance.config.get("exp_groups.sync_mode") === "disabled") {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
await this.luaSend("receive_assignment_update", assignment);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
async luaSetEmitEvents(emitEvents: boolean) {
|
|
165
|
+
await this.luaSend("set_emit_events", emitEvents);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
async luaSend(receiver: string, json: any) {
|
|
169
|
+
await this.instance.sendRcon(`/sc exp_groups.${receiver}(helpers.json_to_table[=[${JSON.stringify(json)}]=])`, true)
|
|
170
|
+
}
|
|
171
|
+
}
|