isValidClientEvent function
Implementation
bool isValidClientEvent(
WorldEvent event,
Channel channel,
WorldState state, {
required AssetManager assetManager,
ChallengeManager? challengeManager,
bool allowManagementRequests = false,
}) => switch (event) {
TeamJoinRequest() =>
_isReasonableIdentifier(event.team) &&
state.info.teams.containsKey(event.team),
TeamLeaveRequest() =>
_isReasonableIdentifier(event.team) &&
state.info.teams.containsKey(event.team),
CellRollRequest() =>
_containsCell(state, event.cell.table, event.cell.position) &&
(event.object?.inRange(
0,
state
.getTableOrDefault(event.cell.table)
.getCell(event.cell.position)
.objects
.length -
1,
) ??
true),
ShuffleCellRequest() =>
_containsCell(state, event.cell.table, event.cell.position) &&
state
.getTableOrDefault(event.cell.table)
.cells
.containsKey(event.cell.position),
ObjectsSpawned() =>
event.objects.keys.every(
(cell) => _containsCell(state, event.table, cell),
) &&
event.objects.values.expand((e) => e).every((e) {
final figure = assetManager.getFigure(e.asset);
return figure != null &&
(e.variation == null ||
figure.variations.containsKey(e.variation));
}),
ObjectsMoved() =>
_containsCell(state, event.table, event.from) &&
_containsCell(state, event.table, event.to) &&
event.from != event.to &&
event.objects.every(
(e) => e.inRange(
0,
state
.getTableOrDefault(event.table)
.getCell(event.from)
.objects
.length -
1,
),
),
CellHideChanged() =>
_containsCell(state, event.cell.table, event.cell.position) &&
(event.object?.inRange(
0,
state
.getTableOrDefault(event.cell.table)
.getCell(event.cell.position)
.objects
.length -
1,
) ??
true),
ObjectIndexChanged() =>
event.index.inRange(
0,
state
.getTableOrDefault(event.cell.table)
.getCell(event.cell.position)
.objects
.length -
1,
) &&
_containsCell(state, event.cell.table, event.cell.position),
CellMergeStrategyChanged() => _canMerge(state, event),
TableBoundsChanged() => _hasTable(state, event.table),
TeamRemoved() => state.info.teams.containsKey(event.team),
PacksChangeRequest() =>
(channel == kAuthorityChannel || allowManagementRequests) &&
event.packs.length <= _maxPacksPerRequest &&
event.packs.every(_isReasonableIdentifier),
MessageRequest() =>
event.message.isNotEmpty && event.message.length <= _maxTextLength,
KickPlayerRequest() =>
(channel == kAuthorityChannel || allowManagementRequests) &&
(event.reason?.length ?? 0) <= _maxTextLength,
BanPlayerRequest() =>
(channel == kAuthorityChannel || allowManagementRequests) &&
(event.reason?.length ?? 0) <= _maxTextLength &&
_isPlausibleBanExpiry(event.expiresAt),
UnbanPlayerRequest() =>
(channel == kAuthorityChannel || allowManagementRequests) &&
_isReasonableIdentifier(event.userId),
PlayerNameChangeRequest() =>
(event.player == channel ||
channel == kAuthorityChannel ||
allowManagementRequests) &&
event.name == event.name.trim() &&
_isReasonableIdentifier(event.name),
ServerRoleChangeRequest() =>
(channel == kAuthorityChannel || allowManagementRequests) &&
event.roles.length <= _maxRolesPerRequest &&
event.roles.every(_isReasonableIdentifier),
GameRolesChangeRequest() =>
(channel == kAuthorityChannel || allowManagementRequests) &&
event.roles.length <= _maxRolesPerRequest &&
event.roles.every(_isReasonableIdentifier),
BoardsSpawnRequest() =>
_isReasonableIdentifier(event.table) &&
event.assets.length <= _maxBoardsPerRequest &&
event.assets.values.expand((e) => e).length <= _maxBoardsPerRequest &&
event.assets.keys.every(
(cell) => _containsCell(state, event.table, cell),
),
BoardMoveRequest() =>
_isReasonableIdentifier(event.table) &&
_containsCell(state, event.table, event.from) &&
_containsCell(state, event.table, event.to) &&
event.from != event.to &&
event.index.inRange(
0,
state
.getTableOrDefault(event.table)
.getCell(event.from)
.tiles
.length -
1,
),
ModeChangeRequest() =>
channel == kAuthorityChannel || allowManagementRequests,
DialogCloseRequest() => _isReasonableIdentifier(event.id),
ImagesRequest() =>
event.ids.length <= _maxImagesPerRequest &&
event.ids.every(_isReasonableIdentifier),
ToolbarActionRequest() => _isReasonableIdentifier(event.actionId),
_ => true,
};