isValidClientEvent function

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

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,
};