isValidClientEvent function

bool isValidClientEvent(
  1. WorldEvent event,
  2. Channel channel,
  3. WorldState state, {
  4. required AssetManager assetManager,
  5. ChallengeManager? challengeManager,
})

Implementation

bool isValidClientEvent(
  WorldEvent event,
  Channel channel,
  WorldState state, {
  required AssetManager assetManager,
  ChallengeManager? challengeManager,
}) => 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 &&
        event.packs.length <= _maxPacksPerRequest &&
        event.packs.every(_isReasonableIdentifier),
  MessageRequest() =>
    event.message.isNotEmpty && event.message.length <= _maxTextLength,
  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,
  DialogCloseRequest() => _isReasonableIdentifier(event.id),
  ImagesRequest() =>
    event.ids.length <= _maxImagesPerRequest &&
        event.ids.every(_isReasonableIdentifier),
  ToolbarActionRequest() => _isReasonableIdentifier(event.actionId),
  _ => true,
};