diff --git a/.github/workflows/e2e-images-cleanup.yml b/.github/workflows/e2e-images-cleanup.yml new file mode 100644 index 000000000..3becda3d2 --- /dev/null +++ b/.github/workflows/e2e-images-cleanup.yml @@ -0,0 +1,52 @@ +name: Cleanup E2E GHCR Images + +on: + schedule: + - cron: "30 4 * * 0" # weekly, after rebuild + workflow_dispatch: + +permissions: + contents: read + packages: write + +jobs: + cleanup: + name: Prune old sha-tagged images + runs-on: ubuntu-latest + steps: + - name: Delete old sha-tagged package versions + env: + GH_TOKEN: ${{ github.token }} + PACKAGE_NAME: banmanager-e2e-tests + KEEP_SHA_VERSIONS: "20" + run: | + set -euo pipefail + + OWNER="${GITHUB_REPOSITORY_OWNER}" + API_PATH="/orgs/${OWNER}/packages/container/${PACKAGE_NAME}/versions?per_page=100" + + VERSIONS="$(gh api "$API_PATH")" + + DELETE_IDS="$(echo "$VERSIONS" | jq -r --argjson keep "$KEEP_SHA_VERSIONS" ' + map( + . as $v + | ($v.metadata.container.tags // []) as $tags + | select(($tags | index("main")) | not) + | select(($tags | length) > 0) + | select(($tags | all(test("^sha-")))) + ) + | sort_by(.created_at) | reverse + | .[$keep:] + | .[].id + ')" + + if [[ -z "$DELETE_IDS" ]]; then + echo "No old sha-tagged versions to delete." + exit 0 + fi + + while read -r version_id; do + [[ -z "$version_id" ]] && continue + echo "Deleting package version ${version_id}" + gh api --method DELETE "/orgs/${OWNER}/packages/container/${PACKAGE_NAME}/versions/${version_id}" + done <<< "$DELETE_IDS" diff --git a/.github/workflows/e2e-images.yml b/.github/workflows/e2e-images.yml new file mode 100644 index 000000000..3a46e2697 --- /dev/null +++ b/.github/workflows/e2e-images.yml @@ -0,0 +1,57 @@ +name: Publish E2E Test Runner Image + +on: + push: + branches: + - master + paths: + - "e2e/Dockerfile.tests" + - "e2e/tests/package.json" + - "e2e/tests/package-lock.json" + - ".github/workflows/e2e-images.yml" + schedule: + - cron: "0 4 * * 0" # weekly rebuild + workflow_dispatch: + +permissions: + contents: read + packages: write + +jobs: + publish: + name: Publish GHCR E2E test image + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Compute image repository + id: vars + run: echo "image_repo=ghcr.io/${GITHUB_REPOSITORY_OWNER,,}/banmanager-e2e-tests" >> "$GITHUB_OUTPUT" + + - name: Log in to GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ steps.vars.outputs.image_repo }} + tags: | + type=raw,value=main + type=sha,format=short,prefix=sha- + + - name: Build and push test runner image + uses: docker/build-push-action@v6 + with: + context: e2e + file: e2e/Dockerfile.tests + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha,scope=e2e-tests-runner + cache-to: type=gha,mode=max,scope=e2e-tests-runner diff --git a/.github/workflows/e2e-metrics.yml b/.github/workflows/e2e-metrics.yml new file mode 100644 index 000000000..4f0308a02 --- /dev/null +++ b/.github/workflows/e2e-metrics.yml @@ -0,0 +1,91 @@ +name: E2E Metrics Snapshot + +on: + workflow_dispatch: + +permissions: + actions: read + contents: read + +jobs: + snapshot: + name: Capture PR E2E metrics + runs-on: ubuntu-latest + + steps: + - name: Collect latest 20 completed PR runs + env: + GH_TOKEN: ${{ github.token }} + run: | + set -euo pipefail + + RUNS_JSON="$(gh api \ + "repos/${GITHUB_REPOSITORY}/actions/workflows/e2e.yml/runs?event=pull_request&status=completed&per_page=100")" + + SELECTED_RUNS="$(echo "$RUNS_JSON" | jq ' + .workflow_runs + | map({ + id, + html_url, + head_sha, + conclusion, + run_started_at, + updated_at, + duration_seconds: ((.updated_at | fromdateiso8601) - (.run_started_at | fromdateiso8601)) + }) + | sort_by(.run_started_at) | reverse + | .[:20] + ')" + + RUN_COUNT="$(echo "$SELECTED_RUNS" | jq 'length')" + if [[ "$RUN_COUNT" -lt 20 ]]; then + echo "Expected at least 20 completed pull_request runs for e2e.yml, found $RUN_COUNT." >&2 + exit 1 + fi + + FAILURE_RATE="$(echo "$SELECTED_RUNS" | jq ' + (map(select(.conclusion != "success")) | length) as $failures + | ($failures / length) * 100 + ')" + + MEDIAN_DURATION="$(echo "$SELECTED_RUNS" | jq ' + [.[].duration_seconds] | sort + | if (length % 2) == 1 + then .[length / 2] + else ((.[(length / 2) - 1] + .[length / 2]) / 2) + end + ')" + + AVG_DURATION="$(echo "$SELECTED_RUNS" | jq '[.[].duration_seconds] | add / length')" + + SNAPSHOT_FILE="e2e-metrics-snapshot.json" + jq -n \ + --arg generated_at "$(date -u +"%Y-%m-%dT%H:%M:%SZ")" \ + --argjson run_count "$RUN_COUNT" \ + --argjson median_duration_seconds "$MEDIAN_DURATION" \ + --argjson average_duration_seconds "$AVG_DURATION" \ + --argjson failure_rate_percent "$FAILURE_RATE" \ + --argjson runs "$SELECTED_RUNS" \ + '{ + generated_at, + run_count, + median_duration_seconds, + average_duration_seconds, + failure_rate_percent, + runs + }' > "$SNAPSHOT_FILE" + + { + echo "## E2E PR Metrics (Latest 20 Runs)" + echo "" + echo "- Median duration: ${MEDIAN_DURATION}s" + echo "- Average duration: ${AVG_DURATION}s" + echo "- Failure rate: ${FAILURE_RATE}%" + } >> "$GITHUB_STEP_SUMMARY" + + - name: Upload metrics snapshot + uses: actions/upload-artifact@v4 + with: + name: e2e-metrics-snapshot + path: e2e-metrics-snapshot.json + retention-days: 30 diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 52e1f12d6..e20837b3f 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -2,6 +2,7 @@ name: E2E Tests permissions: contents: read + packages: read on: pull_request: @@ -11,7 +12,74 @@ on: workflow_dispatch: # Allow manual triggering jobs: + build-jars: + runs-on: ubuntu-latest + name: Build plugin artifacts + + steps: + - uses: actions/checkout@v4 + + # Also set up JDK 17 for Fabric 1.20.x builds + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: 17 + distribution: "temurin" + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: 21 + distribution: "temurin" + + # Ensure JDK 21 is the default + - name: Set JDK 21 as default + run: echo "JAVA_HOME=$JAVA_HOME_21_X64" >> $GITHUB_ENV + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + with: + cache-read-only: ${{ github.ref != 'refs/heads/master' }} + + - uses: actions/cache@v4 + with: + path: | + .gradle/loom-cache + key: ${{ runner.os }}-loom-${{ hashFiles('**/libs.versions.*', '**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: ${{ runner.os }}-loom- + + - name: Build plugin JARs + run: > + ./gradlew + :BanManagerBukkit:shadowJar + :BanManagerBungee:shadowJar + :BanManagerVelocity:shadowJar + :BanManagerSponge:shadowJar + :BanManagerSponge7:shadowJar + :fabric:1.20.1:remapJar + :fabric:1.21.1:remapJar + :fabric:1.21.4:remapJar + :fabric:1.21.11:remapJar + --build-cache + + - name: Upload plugin artifacts + uses: actions/upload-artifact@v4 + with: + name: e2e-plugin-jars + path: | + bukkit/build/libs/BanManagerBukkit.jar + bungee/build/libs/BanManagerBungeeCord.jar + velocity/build/libs/BanManagerVelocity.jar + sponge/build/libs/BanManagerSponge.jar + sponge-api7/build/libs/BanManagerSponge7.jar + fabric/versions/1.20.1/build/libs/BanManagerFabric-mc1.20.1.jar + fabric/versions/1.21.1/build/libs/BanManagerFabric-mc1.21.1.jar + fabric/versions/1.21.4/build/libs/BanManagerFabric-mc1.21.4.jar + fabric/versions/1.21.11/build/libs/BanManagerFabric-mc1.21.11.jar + retention-days: 7 + e2e: + needs: build-jars runs-on: ubuntu-latest name: E2E - ${{ matrix.platform }} strategy: @@ -21,12 +89,10 @@ jobs: # Bukkit/Paper - platform: Bukkit task: testBukkit - build_task: ":BanManagerBukkit:shadowJar" compose_dir: platforms/bukkit # Fabric 1.20.1 (legacy modded, Java 17) - platform: Fabric-1.20.1 task: testFabric_1_20_1 - build_task: ":fabric:1.20.1:remapJar" compose_dir: platforms/fabric mc_version: "1.20.1" java_image: "java17" @@ -34,15 +100,13 @@ jobs: # Fabric 1.21.1 (stable 1.21, Java 21) - platform: Fabric-1.21.1 task: testFabric_1_21_1 - build_task: ":fabric:1.21.1:remapJar" compose_dir: platforms/fabric mc_version: "1.21.1" java_image: "java21" fabric_loader: "0.16.9" - # Fabric 1.21.4 (Java 21) + # Fabric 1.21.4 (current latest, Java 21) - platform: Fabric-1.21.4 task: testFabric_1_21_4 - build_task: ":fabric:1.21.4:remapJar" compose_dir: platforms/fabric mc_version: "1.21.4" java_image: "java21" @@ -50,7 +114,6 @@ jobs: # Fabric 1.21.11 (current latest, Java 21) - platform: Fabric-1.21.11 task: testFabric_1_21_11 - build_task: ":fabric:1.21.11:remapJar" compose_dir: platforms/fabric mc_version: "1.21.11" java_image: "java21" @@ -58,7 +121,6 @@ jobs: # Sponge API 11 (MC 1.20.6, Java 21) - platform: Sponge-1.20.6 task: testSponge_1_20_6 - build_task: ":BanManagerSponge:shadowJar" compose_dir: platforms/sponge mc_version: "1.20.6" java_image: "java21" @@ -66,7 +128,6 @@ jobs: # Sponge API 12 (MC 1.21.1, Java 21) - platform: Sponge-1.21.1 task: testSponge_1_21_1 - build_task: ":BanManagerSponge:shadowJar" compose_dir: platforms/sponge mc_version: "1.21.1" java_image: "java21" @@ -74,7 +135,6 @@ jobs: # Sponge API 13 (MC 1.21.3, Java 21) - platform: Sponge-1.21.3 task: testSponge_1_21_3 - build_task: ":BanManagerSponge:shadowJar" compose_dir: platforms/sponge mc_version: "1.21.3" java_image: "java21" @@ -82,91 +142,93 @@ jobs: # Sponge API 7 (Legacy - MC 1.12.2, Java 8) - platform: Sponge7-1.12.2 task: testSponge7 - build_task: ":BanManagerSponge7:shadowJar" compose_dir: platforms/sponge7 mc_version: "1.12.2" java_image: "java8" # Velocity Proxy - platform: Velocity task: testVelocity - build_task: ":BanManagerVelocity:shadowJar" compose_dir: platforms/velocity # BungeeCord Proxy - platform: BungeeCord task: testBungee - build_task: ":BanManagerBungee:shadowJar" compose_dir: platforms/bungee steps: - uses: actions/checkout@v4 - - name: Set up JDK 21 - uses: actions/setup-java@v4 + - name: Download plugin artifacts + uses: actions/download-artifact@v4 with: - java-version: 21 - distribution: "temurin" + name: e2e-plugin-jars + path: . - # Also set up JDK 17 for Fabric 1.20.x builds - - name: Set up JDK 17 + - name: Detect E2E runner image input changes + id: runner_changes + uses: dorny/paths-filter@v3 + with: + filters: | + runner_image_inputs: + - "e2e/Dockerfile.tests" + - "e2e/tests/**" + + - name: Set up JDK 21 uses: actions/setup-java@v4 with: - java-version: 17 + java-version: 21 distribution: "temurin" - # Ensure JDK 21 is the default - - name: Set JDK 21 as default - run: echo "JAVA_HOME=$JAVA_HOME_21_X64" >> $GITHUB_ENV - - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 with: cache-read-only: ${{ github.ref != 'refs/heads/master' }} - - uses: actions/cache@v4 - with: - path: | - .gradle/loom-cache - key: ${{ runner.os }}-loom-${{ hashFiles('**/libs.versions.*', '**/*.gradle*', '**/gradle-wrapper.properties') }} - restore-keys: ${{ runner.os }}-loom- + - name: Resolve test runner image + run: | + IMAGE_REPO="ghcr.io/${GITHUB_REPOSITORY_OWNER,,}/banmanager-e2e-tests" + echo "E2E_IMAGE_REPO=$IMAGE_REPO" >> "$GITHUB_ENV" - # Docker Buildx for better caching - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + if [[ "${{ steps.runner_changes.outputs.runner_image_inputs }}" == "true" ]]; then + echo "E2E_TEST_IMAGE_MODE=local" >> "$GITHUB_ENV" + echo "E2E_TEST_IMAGE=e2e-tests:local-${GITHUB_SHA}" >> "$GITHUB_ENV" + exit 0 + fi - # Cache Docker layers for test runner image - - name: Cache Docker layers - uses: actions/cache@v4 - with: - path: /tmp/.buildx-cache - key: ${{ runner.os }}-docker-e2e-${{ hashFiles('e2e/Dockerfile.tests', 'e2e/tests/package*.json') }} - restore-keys: | - ${{ runner.os }}-docker-e2e- - - # Pre-build the test runner image with cache - - name: Build test runner image - uses: docker/build-push-action@v5 - with: - context: e2e - file: e2e/Dockerfile.tests - push: false - load: true - tags: e2e-tests:latest - cache-from: type=local,src=/tmp/.buildx-cache - cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max - - # Move cache to avoid ever-growing cache - - name: Move Docker cache + if [[ "${GITHUB_EVENT_NAME}" == "push" && "${GITHUB_REF}" == "refs/heads/master" ]]; then + SHORT_SHA="${GITHUB_SHA::7}" + echo "E2E_TEST_IMAGE=${IMAGE_REPO}:sha-${SHORT_SHA}" >> "$GITHUB_ENV" + else + echo "E2E_TEST_IMAGE=${IMAGE_REPO}:main" >> "$GITHUB_ENV" + fi + + echo "E2E_TEST_IMAGE_MODE=registry" >> "$GITHUB_ENV" + + - name: Pull test runner image from GHCR + if: env.E2E_TEST_IMAGE_MODE == 'registry' run: | - rm -rf /tmp/.buildx-cache - mv /tmp/.buildx-cache-new /tmp/.buildx-cache + if docker pull "$E2E_TEST_IMAGE"; then + exit 0 + fi - - name: Build plugin JARs - run: ./gradlew ${{ matrix.build_task }} --build-cache + FALLBACK_IMAGE="${E2E_IMAGE_REPO}:main" + if docker pull "$FALLBACK_IMAGE"; then + echo "E2E_TEST_IMAGE=$FALLBACK_IMAGE" >> "$GITHUB_ENV" + exit 0 + fi + + echo "E2E_TEST_IMAGE_MODE=local" >> "$GITHUB_ENV" + echo "E2E_TEST_IMAGE=e2e-tests:local-${GITHUB_SHA}" >> "$GITHUB_ENV" + + - name: Build local test runner image when needed + if: env.E2E_TEST_IMAGE_MODE == 'local' + run: docker build -t "$E2E_TEST_IMAGE" -f e2e/Dockerfile.tests e2e - name: Run E2E tests run: ./gradlew :BanManagerE2E:${{ matrix.task }} timeout-minutes: 15 env: + BM_E2E_SKIP_PLUGIN_BUILD: "true" + E2E_TEST_IMAGE: ${{ env.E2E_TEST_IMAGE }} MC_VERSION: ${{ matrix.mc_version }} JAVA_IMAGE: ${{ matrix.java_image }} FABRIC_LOADER: ${{ matrix.fabric_loader }} diff --git a/e2e/build.gradle.kts b/e2e/build.gradle.kts index 087cbdea2..0721587c0 100644 --- a/e2e/build.gradle.kts +++ b/e2e/build.gradle.kts @@ -37,7 +37,10 @@ fun createPlatformTestTask( group = "verification" this.description = description - dependsOn(pluginTask) + val skipPluginBuild = System.getenv("BM_E2E_SKIP_PLUGIN_BUILD")?.equals("true", ignoreCase = true) == true + if (!skipPluginBuild) { + dependsOn(pluginTask) + } workingDir = file("platforms/$platformDir") @@ -46,12 +49,13 @@ fun createPlatformTestTask( environment(key, value) } - commandLine( - "docker", "compose", "up", - "--build", - "--abort-on-container-exit", - "--exit-code-from", "tests" - ) + val composeArgs = mutableListOf("docker", "compose", "up") + val forceComposeBuild = System.getenv("BM_E2E_COMPOSE_BUILD")?.equals("true", ignoreCase = true) == true + if (forceComposeBuild) { + composeArgs.add("--build") + } + composeArgs.addAll(listOf("--abort-on-container-exit", "--exit-code-from", "tests")) + commandLine(*composeArgs.toTypedArray()) doLast { providers.exec { diff --git a/e2e/platforms/bukkit/docker-compose.yml b/e2e/platforms/bukkit/docker-compose.yml index 2a9b05fd5..519cd1242 100644 --- a/e2e/platforms/bukkit/docker-compose.yml +++ b/e2e/platforms/bukkit/docker-compose.yml @@ -67,6 +67,7 @@ services: - banmanager tests: + image: ${E2E_TEST_IMAGE:-ghcr.io/banmanagement/banmanager-e2e-tests:main} build: context: ../.. dockerfile: Dockerfile.tests diff --git a/e2e/platforms/bungee/configs/banmanager/messages.yml b/e2e/platforms/bungee/configs/banmanager/messages.yml index 50203aa0a..689b5c8c8 100644 --- a/e2e/platforms/bungee/configs/banmanager/messages.yml +++ b/e2e/platforms/bungee/configs/banmanager/messages.yml @@ -52,6 +52,11 @@ messages: invalidReason: '&c[reason] is no valid reason.' alts: header: 'Possible alts found:' + names: + header: 'Known names for [player]:' + row: '&e[name] &7(first: [firstSeen], last: [lastSeen])' + dateTimeFormat: dd-MM-yyyy + none: '&7No name history found' export: error: inProgress: '&cAn export is already in progress, please wait' diff --git a/e2e/platforms/bungee/configs/banmanager/schedules.yml b/e2e/platforms/bungee/configs/banmanager/schedules.yml index 1bb6ca04c..dd8867ea6 100644 --- a/e2e/platforms/bungee/configs/banmanager/schedules.yml +++ b/e2e/platforms/bungee/configs/banmanager/schedules.yml @@ -16,15 +16,15 @@ scheduler: externalIpBans: 5 saveLastChecked: 60 lastChecked: - playerMutes: 1767276627 - expiresCheck: 1767276627 - nameBans: 1767276627 - playerBans: 1767276627 - playerWarnings: 1767276627 + playerMutes: 1770749692 + expiresCheck: 1770749693 + nameBans: 1770749693 + playerBans: 1770749693 + playerWarnings: 1770749693 externalPlayerNotes: 0 - ipRangeBans: 1767276627 + ipRangeBans: 1770749692 externalPlayerMutes: 0 - rollbacks: 1767276626 + rollbacks: 1770749692 externalPlayerBans: 0 externalIpBans: 0 - ipBans: 1767276627 + ipBans: 1770749693 diff --git a/e2e/platforms/bungee/configs/bungee/config.yml b/e2e/platforms/bungee/configs/bungee/config.yml index 1ae3786f7..e0fdc31bd 100644 --- a/e2e/platforms/bungee/configs/bungee/config.yml +++ b/e2e/platforms/bungee/configs/bungee/config.yml @@ -1,24 +1,39 @@ network_compression_threshold: 256 remote_ping_timeout: 5000 -online_mode: false remote_ping_cache: -1 +online_mode: false forge_support: false max_packets_per_second: 4096 -ip_forward: true +listeners: +- query_port: 25577 + motd: BanManager E2E Test Server + tab_list: GLOBAL_PING + query_enabled: false + proxy_protocol: false + forced_hosts: + pvp.md-5.net: paper + ping_passthrough: false + priorities: + - paper + bind_local_address: true + host: 0.0.0.0:25577 + max_players: 100 + tab_size: 60 + force_default_server: true disabled_commands: - disabledcommandhere max_packets_data_per_second: 33554432 -player_limit: -1 reject_transfers: false -log_commands: false +player_limit: -1 +connection_throttle: -1 connection_throttle_limit: 3 prevent_proxy_connections: false -connection_throttle: -1 +log_commands: false log_pings: false +stats: 00000000-0000-0000-0000-000000000000 groups: admin: - admin -stats: 00000000-0000-0000-0000-000000000000 servers: paper: motd: Paper Backend @@ -33,22 +48,7 @@ permissions: - bungeecord.command.end - bungeecord.command.ip - bungeecord.command.reload -listeners: -- query_port: 25577 - motd: BanManager E2E Test Server - tab_list: GLOBAL_PING - query_enabled: false - proxy_protocol: false - forced_hosts: - pvp.md-5.net: paper - ping_passthrough: false - priorities: - - paper - bind_local_address: true - host: 0.0.0.0:25577 - max_players: 100 - tab_size: 60 - force_default_server: true +ip_forward: true enforce_secure_profile: false server_connect_timeout: 5000 timeout: 30000 diff --git a/e2e/platforms/bungee/configs/luckperms/translations/repository/id_ID.properties b/e2e/platforms/bungee/configs/luckperms/translations/repository/id_ID.properties index 45780bf4e..5d319a7d5 100644 --- a/e2e/platforms/bungee/configs/luckperms/translations/repository/id_ID.properties +++ b/e2e/platforms/bungee/configs/luckperms/translations/repository/id_ID.properties @@ -464,6 +464,7 @@ luckperms.usage.parent-info.argument.sort-mode=bagaimana cara mengurutkan entri luckperms.usage.parent-set.argument.group=kelompok ditetapkan ke luckperms.usage.parent-remove.argument.group=kelompok untuk dihapus luckperms.usage.parent-remove-temp.argument.group=kelompok untuk dihapus +luckperms.usage.parent-remove-temp.argument.duration=durasi untuk mengurangi luckperms.usage.parent-clear.argument.context=konteks untuk difilter berdasarkan luckperms.usage.parent-clear-track.argument.context=konteks untuk difilter berdasarkan luckperms.usage.meta-info.description=Menampilkan semua meta chat diff --git a/e2e/platforms/bungee/configs/luckperms/translations/repository/status.json b/e2e/platforms/bungee/configs/luckperms/translations/repository/status.json index 629e3d818..8f7a9c497 100644 --- a/e2e/platforms/bungee/configs/luckperms/translations/repository/status.json +++ b/e2e/platforms/bungee/configs/luckperms/translations/repository/status.json @@ -1,3 +1,3 @@ { - "lastRefresh": 1766966133115 + "lastRefresh": 1770749504980 } \ No newline at end of file diff --git a/e2e/platforms/bungee/configs/luckperms/translations/repository/zh_TW.properties b/e2e/platforms/bungee/configs/luckperms/translations/repository/zh_TW.properties index ae14ac7f8..b1bd9da2a 100644 --- a/e2e/platforms/bungee/configs/luckperms/translations/repository/zh_TW.properties +++ b/e2e/platforms/bungee/configs/luckperms/translations/repository/zh_TW.properties @@ -499,7 +499,7 @@ luckperms.usage.meta-set.argument.value=要設定的值 luckperms.usage.meta-set.argument.context=要增加中繼資料的環境 luckperms.usage.meta-unset.description=解除設定一個元值 luckperms.usage.meta-unset.argument.key=要解除設定的金鑰 -luckperms.usage.meta-unset.argument.context=要移除元資料的環境 +luckperms.usage.meta-unset.argument.context=要移除中繼資料的環境 luckperms.usage.meta-settemp.description=設定一個臨時元值 luckperms.usage.meta-settemp.argument.key=要設定的金鑰 luckperms.usage.meta-settemp.argument.value=要設定的值 diff --git a/e2e/platforms/bungee/docker-compose.yml b/e2e/platforms/bungee/docker-compose.yml index aaeba048e..99e54fa69 100644 --- a/e2e/platforms/bungee/docker-compose.yml +++ b/e2e/platforms/bungee/docker-compose.yml @@ -102,6 +102,7 @@ services: - banmanager tests: + image: ${E2E_TEST_IMAGE:-ghcr.io/banmanagement/banmanager-e2e-tests:main} build: context: ../.. dockerfile: Dockerfile.tests diff --git a/e2e/platforms/fabric/docker-compose.yml b/e2e/platforms/fabric/docker-compose.yml index 8c3e684c4..863fce368 100644 --- a/e2e/platforms/fabric/docker-compose.yml +++ b/e2e/platforms/fabric/docker-compose.yml @@ -73,6 +73,7 @@ services: - banmanager tests: + image: ${E2E_TEST_IMAGE:-ghcr.io/banmanagement/banmanager-e2e-tests:main} build: context: ../.. dockerfile: Dockerfile.tests diff --git a/e2e/platforms/sponge/docker-compose.yml b/e2e/platforms/sponge/docker-compose.yml index 2611c6be3..907611d0c 100644 --- a/e2e/platforms/sponge/docker-compose.yml +++ b/e2e/platforms/sponge/docker-compose.yml @@ -64,6 +64,7 @@ services: - banmanager tests: + image: ${E2E_TEST_IMAGE:-ghcr.io/banmanagement/banmanager-e2e-tests:main} build: context: ../.. dockerfile: Dockerfile.tests diff --git a/e2e/platforms/sponge7/docker-compose.yml b/e2e/platforms/sponge7/docker-compose.yml index cea2e1fdb..9afeca0cd 100644 --- a/e2e/platforms/sponge7/docker-compose.yml +++ b/e2e/platforms/sponge7/docker-compose.yml @@ -60,6 +60,7 @@ services: - banmanager tests: + image: ${E2E_TEST_IMAGE:-ghcr.io/banmanagement/banmanager-e2e-tests:main} build: context: ../.. dockerfile: Dockerfile.tests diff --git a/e2e/platforms/velocity/configs/banmanager/messages.yml b/e2e/platforms/velocity/configs/banmanager/messages.yml index 50203aa0a..689b5c8c8 100644 --- a/e2e/platforms/velocity/configs/banmanager/messages.yml +++ b/e2e/platforms/velocity/configs/banmanager/messages.yml @@ -52,6 +52,11 @@ messages: invalidReason: '&c[reason] is no valid reason.' alts: header: 'Possible alts found:' + names: + header: 'Known names for [player]:' + row: '&e[name] &7(first: [firstSeen], last: [lastSeen])' + dateTimeFormat: dd-MM-yyyy + none: '&7No name history found' export: error: inProgress: '&cAn export is already in progress, please wait' diff --git a/e2e/platforms/velocity/configs/banmanager/schedules.yml b/e2e/platforms/velocity/configs/banmanager/schedules.yml index a9354b4a5..0baeed572 100644 --- a/e2e/platforms/velocity/configs/banmanager/schedules.yml +++ b/e2e/platforms/velocity/configs/banmanager/schedules.yml @@ -16,15 +16,15 @@ scheduler: externalIpBans: 5 saveLastChecked: 60 lastChecked: - playerMutes: 1767276358 - expiresCheck: 1767276358 - nameBans: 1767276358 - playerBans: 1767276358 - playerWarnings: 1767276358 + playerMutes: 1770750160 + expiresCheck: 1770750160 + nameBans: 1770750160 + playerBans: 1770750160 + playerWarnings: 1770750160 externalPlayerNotes: 0 - ipRangeBans: 1767276358 + ipRangeBans: 1770750160 externalPlayerMutes: 0 - rollbacks: 1767276347 + rollbacks: 1770750073 externalPlayerBans: 0 externalIpBans: 0 - ipBans: 1767276358 + ipBans: 1770750160 diff --git a/e2e/platforms/velocity/configs/luckperms/translations/repository/id_ID.properties b/e2e/platforms/velocity/configs/luckperms/translations/repository/id_ID.properties index 45780bf4e..5d319a7d5 100644 --- a/e2e/platforms/velocity/configs/luckperms/translations/repository/id_ID.properties +++ b/e2e/platforms/velocity/configs/luckperms/translations/repository/id_ID.properties @@ -464,6 +464,7 @@ luckperms.usage.parent-info.argument.sort-mode=bagaimana cara mengurutkan entri luckperms.usage.parent-set.argument.group=kelompok ditetapkan ke luckperms.usage.parent-remove.argument.group=kelompok untuk dihapus luckperms.usage.parent-remove-temp.argument.group=kelompok untuk dihapus +luckperms.usage.parent-remove-temp.argument.duration=durasi untuk mengurangi luckperms.usage.parent-clear.argument.context=konteks untuk difilter berdasarkan luckperms.usage.parent-clear-track.argument.context=konteks untuk difilter berdasarkan luckperms.usage.meta-info.description=Menampilkan semua meta chat diff --git a/e2e/platforms/velocity/configs/luckperms/translations/repository/status.json b/e2e/platforms/velocity/configs/luckperms/translations/repository/status.json index a95da7e33..09b44ec59 100644 --- a/e2e/platforms/velocity/configs/luckperms/translations/repository/status.json +++ b/e2e/platforms/velocity/configs/luckperms/translations/repository/status.json @@ -1,3 +1,3 @@ { - "lastRefresh": 1766962601253 + "lastRefresh": 1770749980521 } \ No newline at end of file diff --git a/e2e/platforms/velocity/configs/luckperms/translations/repository/zh_TW.properties b/e2e/platforms/velocity/configs/luckperms/translations/repository/zh_TW.properties index ae14ac7f8..b1bd9da2a 100644 --- a/e2e/platforms/velocity/configs/luckperms/translations/repository/zh_TW.properties +++ b/e2e/platforms/velocity/configs/luckperms/translations/repository/zh_TW.properties @@ -499,7 +499,7 @@ luckperms.usage.meta-set.argument.value=要設定的值 luckperms.usage.meta-set.argument.context=要增加中繼資料的環境 luckperms.usage.meta-unset.description=解除設定一個元值 luckperms.usage.meta-unset.argument.key=要解除設定的金鑰 -luckperms.usage.meta-unset.argument.context=要移除元資料的環境 +luckperms.usage.meta-unset.argument.context=要移除中繼資料的環境 luckperms.usage.meta-settemp.description=設定一個臨時元值 luckperms.usage.meta-settemp.argument.key=要設定的金鑰 luckperms.usage.meta-settemp.argument.value=要設定的值 diff --git a/e2e/platforms/velocity/docker-compose.yml b/e2e/platforms/velocity/docker-compose.yml index bab160633..c5c1d9f35 100644 --- a/e2e/platforms/velocity/docker-compose.yml +++ b/e2e/platforms/velocity/docker-compose.yml @@ -100,6 +100,7 @@ services: - banmanager tests: + image: ${E2E_TEST_IMAGE:-ghcr.io/banmanagement/banmanager-e2e-tests:main} build: context: ../.. dockerfile: Dockerfile.tests