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() =>
event.object?.inRange(
0,
state
.getTableOrDefault(event.cell.table)
.getCell(event.cell.position)
.objects
.length -
1,
) ??
true,
ShuffleCellRequest() =>
state
.getTableOrDefault(event.cell.table)
.cells
.containsKey(event.cell.position),
ObjectsSpawned() => 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() =>
event.from != event.to &&
event.objects.every(
(e) => e.inRange(
0,
state
.getTableOrDefault(event.table)
.getCell(event.from)
.objects
.length -
1,
),
),
CellHideChanged() =>
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,
),
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,
BoardMoveRequest() =>
_isReasonableIdentifier(event.table) &&
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,
};