From 02f5e3b47b54cf12da7c3ebe791ddd326096e245 Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sat, 18 Oct 2025 19:31:39 +0200 Subject: [PATCH 01/29] chore: update pnpm version and enhance deployment workflow --- .github/workflows/deploy.yml | 108 +++++++++++++++++++++++++---------- pnpm-lock.yaml | 2 +- 2 files changed, 79 insertions(+), 31 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 7f7e07d..63acff1 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -10,9 +10,16 @@ on: # - '.gitignore' # - 'LICENSE' +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + jobs: build-test-deploy: runs-on: ubuntu-latest + permissions: + contents: read + packages: write steps: - name: Checkout code @@ -23,52 +30,93 @@ jobs: with: node-version-file: .nvmrc - - name: Install dependencies + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 10.17.1 + + - name: Get pnpm store directory + shell: bash run: | - if [ -f package-lock.json ]; then - npm ci --no-audit --no-fund - else - npm install --no-audit --no-fund - fi + echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV + + - name: Setup pnpm cache + uses: actions/cache@v4 + with: + path: ${{ env.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Install dependencies + run: pnpm install --frozen-lockfile - name: Lint - run: npm run lint + run: pnpm run lint - name: Build bot - run: npm run build:ci + run: pnpm run build:ci - name: Run tests - run: npm run test:ci + run: pnpm run test:ci - - name: Package build output - run: tar czf bot-build.tar.gz ./dist + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 - - name: Copy build artifact to VPS - uses: appleboy/scp-action@v0.1.7 + - name: Log in to GitHub Container Registry + uses: docker/login-action@v3 with: - host: ${{ secrets.VPS_HOST }} - username: ${{ secrets.VPS_USER }} - key: ${{ secrets.VPS_SSH_KEY }} - source: "bot-build.tar.gz" - target: "/home/${{ secrets.VPS_USER }}/discord-bot/" + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} - - name: Create .env file on VPS - uses: appleboy/ssh-action@v1.0.3 + - name: Extract metadata for Docker + id: meta + uses: docker/metadata-action@v5 with: - host: ${{ secrets.VPS_HOST }} - username: ${{ secrets.VPS_USER }} - key: ${{ secrets.VPS_SSH_KEY }} - script: | - echo "DISCORD_TOKEN=${{ secrets.DISCORD_TOKEN }}" > /home/${{ secrets.VPS_USER }}/discord-bot/.env - echo "CLIENT_ID=${{ secrets.CLIENT_ID }}" >> /home/${{ secrets.VPS_USER }}/discord-bot/.env + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: | + type=sha,prefix={{branch}}- + type=ref,event=branch + type=raw,value=latest,enable={{is_default_branch}} + + - name: Build and push Docker image + uses: docker/build-push-action@v5 + with: + context: . + target: production + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + build-args: | + NODE_VERSION=${{ steps.setup-node.outputs.node-version }} - - name: Extract and restart bot on VPS + - name: Deploy to VPS uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.VPS_HOST }} username: ${{ secrets.VPS_USER }} key: ${{ secrets.VPS_SSH_KEY }} script: | - cd /home/${{ secrets.VPS_USER }}/discord-bot/ - tar xzf bot-build.tar.gz - pm2 restart bot || pm2 start ./dist/index.js --name bot \ No newline at end of file + # Login to GitHub Container Registry + echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin + + # Pull the latest image + docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest + + # Stop and remove old container if it exists + docker stop webdev-bot-prod 2>/dev/null || true + docker rm webdev-bot-prod 2>/dev/null || true + + # Run new container + docker run -d \ + --name webdev-bot-prod \ + --restart unless-stopped \ + -e DISCORD_TOKEN="${{ secrets.DISCORD_TOKEN }}" \ + -e CLIENT_ID="${{ secrets.CLIENT_ID }}" \ + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest + + # Clean up old images + docker image prune -af --filter "until=24h" \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f1d5162..51e6809 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,7 +38,7 @@ importers: version: 4.20.6 typescript: specifier: ^5.9.2 - version: 5.9.2 + version: 5.9.3 packages: From d32f516e69229a43dce296654f6c8b1244fadb89 Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sat, 18 Oct 2025 21:24:18 +0200 Subject: [PATCH 02/29] ci: add id to Node setup step in deployment workflow --- .github/workflows/deploy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 63acff1..741ff24 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -27,6 +27,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v4 + id: setup-node with: node-version-file: .nvmrc From 515c8714d4eba1e9767f84dc9d14ac2cac6071b6 Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sat, 18 Oct 2025 21:26:55 +0200 Subject: [PATCH 03/29] ci: add logging --- .github/workflows/deploy.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 741ff24..81d1fff 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -80,6 +80,12 @@ jobs: type=sha,prefix={{branch}}- type=ref,event=branch type=raw,value=latest,enable={{is_default_branch}} + + - name: Log Step outputs + run: | + echo "Node version: ${{ steps.setup-node.outputs.node-version }}" + echo "Tags: ${{ steps.meta.outputs.tags }}" + echo "Labels: ${{ steps.meta.outputs.labels }}" - name: Build and push Docker image uses: docker/build-push-action@v5 From 0e97dad539bba368fa6d84f44f6f1cb0268f004d Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sat, 18 Oct 2025 21:32:05 +0200 Subject: [PATCH 04/29] ci: store Node version in environment for deployment workflow --- .github/workflows/deploy.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 81d1fff..71ff633 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -30,6 +30,11 @@ jobs: id: setup-node with: node-version-file: .nvmrc + + - name: Store Node version + run: | + NODE_VERSION="${{ steps.setup-node.outputs.node-version }}" + echo "NODE_VERSION=${NODE_VERSION#v}" >> $GITHUB_ENV - name: Install pnpm uses: pnpm/action-setup@v4 @@ -84,6 +89,7 @@ jobs: - name: Log Step outputs run: | echo "Node version: ${{ steps.setup-node.outputs.node-version }}" + echo "NODE_VERSION: ${{ env.NODE_VERSION }}" echo "Tags: ${{ steps.meta.outputs.tags }}" echo "Labels: ${{ steps.meta.outputs.labels }}" @@ -98,7 +104,7 @@ jobs: cache-from: type=gha cache-to: type=gha,mode=max build-args: | - NODE_VERSION=${{ steps.setup-node.outputs.node-version }} + NODE_VERSION=${{ env.NODE_VERSION }} - name: Deploy to VPS uses: appleboy/ssh-action@v1.0.3 From 2fdf6cc2edd345551d003ef1a1f9ec05f4a57b52 Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sat, 18 Oct 2025 21:35:24 +0200 Subject: [PATCH 05/29] chore: update Dockerfile to install production dependencies only --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 51abe05..a918021 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,7 @@ FROM base AS deps COPY package.json pnpm-lock.yaml ./ -RUN pnpm install --prod --frozen-lockfile +RUN pnpm install --frozen-lockfile --production # Dev dependencies stage - Install all dependencies FROM base AS deps-dev From e5e2a4921c399e4838cb9659eb7dfb6a00e60a42 Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sat, 18 Oct 2025 21:41:11 +0200 Subject: [PATCH 06/29] chore: update Dockerfile to ignore scripts during production dependency installation and add TypeScript to dependencies --- Dockerfile | 2 +- package.json | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index a918021..f61ff89 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,7 @@ FROM base AS deps COPY package.json pnpm-lock.yaml ./ -RUN pnpm install --frozen-lockfile --production +RUN pnpm install --frozen-lockfile --production --ignore-scripts # Dev dependencies stage - Install all dependencies FROM base AS deps-dev diff --git a/package.json b/package.json index dab435a..613aec0 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,8 @@ "dependencies": { "@discordjs/core": "^2.2.2", "discord.js": "^14.22.1", - "web-features": "^3.3.0" + "web-features": "^3.3.0", + "typescript": "^5.9.2" }, "devDependencies": { "@biomejs/biome": "2.2.4", @@ -43,8 +44,7 @@ "husky": "^9.1.7", "lint-staged": "^16.2.1", "tsup": "^8.5.0", - "tsx": "^4.20.6", - "typescript": "^5.9.2" + "tsx": "^4.20.6" }, "lint-staged": { "*.{ts,js}": [ From 6eb12662857d3e917016f274e0e26ee7808b1ab0 Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sat, 18 Oct 2025 21:43:18 +0200 Subject: [PATCH 07/29] chore: update TypeScript version in pnpm-lock.yaml --- pnpm-lock.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 51e6809..bb492ab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ importers: discord.js: specifier: ^14.22.1 version: 14.22.1 + typescript: + specifier: ^5.9.2 + version: 5.9.3 web-features: specifier: ^3.3.0 version: 3.3.0 @@ -36,9 +39,6 @@ importers: tsx: specifier: ^4.20.6 version: 4.20.6 - typescript: - specifier: ^5.9.2 - version: 5.9.3 packages: From 8b3a7dcaf10f9ca21e655a1518d44fcec28959df Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sat, 18 Oct 2025 22:07:56 +0200 Subject: [PATCH 08/29] ci: enhance deployment workflow to include file transfer and container management on VPS --- .github/workflows/deploy.yml | 45 +++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 71ff633..d463bbc 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -107,29 +107,48 @@ jobs: NODE_VERSION=${{ env.NODE_VERSION }} - name: Deploy to VPS + uses: appleboy/scp-action@v0.1.7 + with: + host: ${{ secrets.VPS_HOST }} + username: ${{ secrets.VPS_USER }} + key: ${{ secrets.VPS_SSH_KEY }} + source: "docker-compose.yml" + target: "~/webdev-bot-deploy" + strip_components: 0 + + - name: Start containers on VPS uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.VPS_HOST }} username: ${{ secrets.VPS_USER }} key: ${{ secrets.VPS_SSH_KEY }} script: | + cd ~/webdev-bot-deploy + + # Create .env.local file with secrets + cat > .env.local << EOF + DISCORD_TOKEN=${{ secrets.DISCORD_TOKEN }} + CLIENT_ID=${{ secrets.CLIENT_ID }} + EOF + + # Set NODE_VERSION for docker-compose + export NODE_VERSION=${{ env.NODE_VERSION }} + # Login to GitHub Container Registry echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin - # Pull the latest image - docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest - - # Stop and remove old container if it exists - docker stop webdev-bot-prod 2>/dev/null || true - docker rm webdev-bot-prod 2>/dev/null || true + # Update docker-compose.yml to use the pre-built image + cat > docker-compose.override.yml << EOF + version: '3.8' + services: + bot-prod: + image: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest + build: null + EOF - # Run new container - docker run -d \ - --name webdev-bot-prod \ - --restart unless-stopped \ - -e DISCORD_TOKEN="${{ secrets.DISCORD_TOKEN }}" \ - -e CLIENT_ID="${{ secrets.CLIENT_ID }}" \ - ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest + # Pull the latest image and start + docker compose --profile prod pull + docker compose --profile prod up -d # Clean up old images docker image prune -af --filter "until=24h" \ No newline at end of file From bb11e8c3d439dd89e8c706eb06985af7b2b37715 Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sat, 18 Oct 2025 22:26:36 +0200 Subject: [PATCH 09/29] ci: add new deployment workflow for Discord bot to streamline VPS updates --- .github/workflows/shorter-deploy.yml | 38 ++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 .github/workflows/shorter-deploy.yml diff --git a/.github/workflows/shorter-deploy.yml b/.github/workflows/shorter-deploy.yml new file mode 100644 index 0000000..11545be --- /dev/null +++ b/.github/workflows/shorter-deploy.yml @@ -0,0 +1,38 @@ +name: Build, Test and Deploy Discord Bot to VPS but shorter + +on: + workflow_dispatch: # Allow manual deployment + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Deploy to VPS + uses: appleboy/ssh-action@v1.0.3 + with: + host: ${{ secrets.VPS_HOST }} + username: ${{ secrets.VPS_USER }} + key: ${{ secrets.VPS_SSH_KEY }} + script: | + cd /home/${{ secrets.VPS_USER }}/webdev-bot + + # Stash any local changes + git stash push -m "Auto-deploy $(date)" 2>/dev/null || true + + # Pull latest changes + git checkout main + git pull origin main + + # Stop any existing containers + docker-compose down || true + + # Build and start production container with profile + docker-compose --profile prod up -d --build + + # Check status + echo "Deployment completed. Container status:" + docker-compose ps \ No newline at end of file From 471ef2bd07c965bdf1cf60dc5a824b205b92117a Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sat, 18 Oct 2025 22:28:02 +0200 Subject: [PATCH 10/29] ci: simplify deployment workflow for Discord bot by consolidating steps and improving container management on VPS --- .github/workflows/deploy.yml | 178 ++++++----------------------------- 1 file changed, 31 insertions(+), 147 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index d463bbc..11545be 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,154 +1,38 @@ -name: Build, Test and Deploy Discord Bot to VPS +name: Build, Test and Deploy Discord Bot to VPS but shorter on: - workflow_dispatch: # Manual trigger only - # Uncomment below when VPS is ready: - # push: - # branches: [ "main" ] - # paths-ignore: - # - 'docs/**' - # - '.gitignore' - # - 'LICENSE' - -env: - REGISTRY: ghcr.io - IMAGE_NAME: ${{ github.repository }} + workflow_dispatch: # Allow manual deployment jobs: - build-test-deploy: + deploy: runs-on: ubuntu-latest - permissions: - contents: read - packages: write steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Node - uses: actions/setup-node@v4 - id: setup-node - with: - node-version-file: .nvmrc - - - name: Store Node version - run: | - NODE_VERSION="${{ steps.setup-node.outputs.node-version }}" - echo "NODE_VERSION=${NODE_VERSION#v}" >> $GITHUB_ENV - - - name: Install pnpm - uses: pnpm/action-setup@v4 - with: - version: 10.17.1 - - - name: Get pnpm store directory - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV - - - name: Setup pnpm cache - uses: actions/cache@v4 - with: - path: ${{ env.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store- - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Lint - run: pnpm run lint - - - name: Build bot - run: pnpm run build:ci - - - name: Run tests - run: pnpm run test:ci - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to GitHub Container Registry - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata for Docker - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - tags: | - type=sha,prefix={{branch}}- - type=ref,event=branch - type=raw,value=latest,enable={{is_default_branch}} - - - name: Log Step outputs - run: | - echo "Node version: ${{ steps.setup-node.outputs.node-version }}" - echo "NODE_VERSION: ${{ env.NODE_VERSION }}" - echo "Tags: ${{ steps.meta.outputs.tags }}" - echo "Labels: ${{ steps.meta.outputs.labels }}" - - - name: Build and push Docker image - uses: docker/build-push-action@v5 - with: - context: . - target: production - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - cache-from: type=gha - cache-to: type=gha,mode=max - build-args: | - NODE_VERSION=${{ env.NODE_VERSION }} - - - name: Deploy to VPS - uses: appleboy/scp-action@v0.1.7 - with: - host: ${{ secrets.VPS_HOST }} - username: ${{ secrets.VPS_USER }} - key: ${{ secrets.VPS_SSH_KEY }} - source: "docker-compose.yml" - target: "~/webdev-bot-deploy" - strip_components: 0 - - - name: Start containers on VPS - uses: appleboy/ssh-action@v1.0.3 - with: - host: ${{ secrets.VPS_HOST }} - username: ${{ secrets.VPS_USER }} - key: ${{ secrets.VPS_SSH_KEY }} - script: | - cd ~/webdev-bot-deploy - - # Create .env.local file with secrets - cat > .env.local << EOF - DISCORD_TOKEN=${{ secrets.DISCORD_TOKEN }} - CLIENT_ID=${{ secrets.CLIENT_ID }} - EOF - - # Set NODE_VERSION for docker-compose - export NODE_VERSION=${{ env.NODE_VERSION }} - - # Login to GitHub Container Registry - echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin - - # Update docker-compose.yml to use the pre-built image - cat > docker-compose.override.yml << EOF - version: '3.8' - services: - bot-prod: - image: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest - build: null - EOF - - # Pull the latest image and start - docker compose --profile prod pull - docker compose --profile prod up -d - - # Clean up old images - docker image prune -af --filter "until=24h" \ No newline at end of file + - name: Checkout code + uses: actions/checkout@v4 + + - name: Deploy to VPS + uses: appleboy/ssh-action@v1.0.3 + with: + host: ${{ secrets.VPS_HOST }} + username: ${{ secrets.VPS_USER }} + key: ${{ secrets.VPS_SSH_KEY }} + script: | + cd /home/${{ secrets.VPS_USER }}/webdev-bot + + # Stash any local changes + git stash push -m "Auto-deploy $(date)" 2>/dev/null || true + + # Pull latest changes + git checkout main + git pull origin main + + # Stop any existing containers + docker-compose down || true + + # Build and start production container with profile + docker-compose --profile prod up -d --build + + # Check status + echo "Deployment completed. Container status:" + docker-compose ps \ No newline at end of file From 9bbc2cf76881cbdc9f9a0f9a8a04ec1ff28d196e Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sat, 18 Oct 2025 22:29:43 +0200 Subject: [PATCH 11/29] ci: update deployment workflow to include .env.local file creation with secrets for Discord bot --- .github/workflows/deploy.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 11545be..ef1b554 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,6 +1,8 @@ -name: Build, Test and Deploy Discord Bot to VPS but shorter +name: Build, Test and Deploy Discord Bot to VPS on: + push: + branches: [ "main" ] workflow_dispatch: # Allow manual deployment jobs: @@ -27,6 +29,13 @@ jobs: git checkout main git pull origin main + # Create .env.local file with secrets + cat > .env.local << EOF + DISCORD_TOKEN=${{ secrets.DISCORD_TOKEN }} + CLIENT_ID=${{ secrets.CLIENT_ID }} + NODE_VERSION=$(cat .nvmrc | tr -d 'v') + EOF + # Stop any existing containers docker-compose down || true From 4c70007cfb7cee3f3929b7c638b23ecad2953db9 Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sat, 18 Oct 2025 22:31:50 +0200 Subject: [PATCH 12/29] ci: read Node version from .nvmrc and set it in the environment for deployment workflow --- .github/workflows/deploy.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index ef1b554..970059e 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -13,6 +13,11 @@ jobs: - name: Checkout code uses: actions/checkout@v4 + - name: Read Node version + run: | + NODE_VERSION=$(cat .nvmrc | sed 's/v//') + echo "NODE_VERSION=$NODE_VERSION" >> $GITHUB_ENV + - name: Deploy to VPS uses: appleboy/ssh-action@v1.0.3 with: @@ -33,7 +38,7 @@ jobs: cat > .env.local << EOF DISCORD_TOKEN=${{ secrets.DISCORD_TOKEN }} CLIENT_ID=${{ secrets.CLIENT_ID }} - NODE_VERSION=$(cat .nvmrc | tr -d 'v') + NODE_VERSION=${{ env.NODE_VERSION }} EOF # Stop any existing containers From 89e752032aaa6903de4b1c5235ccbfe35fdd11c5 Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sat, 18 Oct 2025 22:33:09 +0200 Subject: [PATCH 13/29] ci: update deployment workflow to use 'docker compose' command for improved compatibility --- .github/workflows/deploy.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 970059e..d21ac3b 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -25,7 +25,7 @@ jobs: username: ${{ secrets.VPS_USER }} key: ${{ secrets.VPS_SSH_KEY }} script: | - cd /home/${{ secrets.VPS_USER }}/webdev-bot + cd /home/${{ secrets.VPS_USER }}/webdev-bot-deploy # Stash any local changes git stash push -m "Auto-deploy $(date)" 2>/dev/null || true @@ -42,11 +42,11 @@ jobs: EOF # Stop any existing containers - docker-compose down || true + docker compose down || true # Build and start production container with profile - docker-compose --profile prod up -d --build + docker compose --profile prod up -d --build # Check status echo "Deployment completed. Container status:" - docker-compose ps \ No newline at end of file + docker compose ps \ No newline at end of file From aef229eaf953118dfaae36f2dd901971d36cf857 Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sat, 18 Oct 2025 22:42:34 +0200 Subject: [PATCH 14/29] ci: read Node version from .nvmrc and output it during deployment workflow --- .github/workflows/deploy.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index d21ac3b..138c300 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -34,11 +34,14 @@ jobs: git checkout main git pull origin main + # Read NODE_VERSION from .nvmrc + export NODE_VERSION=$(cat .nvmrc | sed 's/v//') + echo "Using Node version: $NODE_VERSION" + # Create .env.local file with secrets cat > .env.local << EOF DISCORD_TOKEN=${{ secrets.DISCORD_TOKEN }} CLIENT_ID=${{ secrets.CLIENT_ID }} - NODE_VERSION=${{ env.NODE_VERSION }} EOF # Stop any existing containers From 2be4ccb8fdd10b935e10c0a2dd29d478615ed5f3 Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sat, 18 Oct 2025 22:45:19 +0200 Subject: [PATCH 15/29] ci: remove version specification from docker-compose.yml for streamlined configuration --- docker-compose.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 1c190a3..6e2d7f0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: # Production service - optimized runtime bot-prod: From c0120f8cd6e16090e8fdacd92f2ca6d7ba93cdf4 Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sat, 18 Oct 2025 22:46:12 +0200 Subject: [PATCH 16/29] chore: update TypeScript version to 5.9.3 in package.json and pnpm-lock.yaml --- package.json | 4 ++-- pnpm-lock.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 613aec0..124cc8d 100644 --- a/package.json +++ b/package.json @@ -35,8 +35,8 @@ "dependencies": { "@discordjs/core": "^2.2.2", "discord.js": "^14.22.1", - "web-features": "^3.3.0", - "typescript": "^5.9.2" + "typescript": "^5.9.3", + "web-features": "^3.3.0" }, "devDependencies": { "@biomejs/biome": "2.2.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bb492ab..cafba70 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,7 +15,7 @@ importers: specifier: ^14.22.1 version: 14.22.1 typescript: - specifier: ^5.9.2 + specifier: ^5.9.3 version: 5.9.3 web-features: specifier: ^3.3.0 From c9084033c44988be8477586c08f8c56e043c125a Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sat, 18 Oct 2025 22:50:28 +0200 Subject: [PATCH 17/29] chore: modify Dockerfile to ignore scripts during pnpm install for improved build efficiency --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index f61ff89..52f0b96 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,7 +20,7 @@ FROM base AS deps-dev COPY package.json pnpm-lock.yaml ./ -RUN pnpm install --frozen-lockfile +RUN pnpm install --frozen-lockfile --ignore-scripts # Build stage - Compile TypeScript FROM deps-dev AS build From a79b76f78f90161fa347fbabbfea51d66d7dfeba Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sat, 18 Oct 2025 22:51:38 +0200 Subject: [PATCH 18/29] ci: update deployment workflow to switch to 'ci/deploy-with-docker' branch for pulling latest changes --- .github/workflows/deploy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 138c300..9353009 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -31,8 +31,8 @@ jobs: git stash push -m "Auto-deploy $(date)" 2>/dev/null || true # Pull latest changes - git checkout main - git pull origin main + git checkout ci/deploy-with-docker + git pull origin ci/deploy-with-docker # Read NODE_VERSION from .nvmrc export NODE_VERSION=$(cat .nvmrc | sed 's/v//') From 118c47f3070a288e51523cd722ac070301ecb781 Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sat, 18 Oct 2025 23:07:34 +0200 Subject: [PATCH 19/29] ci: enhance docker-compose.yml to include guides tracker configuration and persist data --- .github/workflows/deploy.yml | 1 + docker-compose.yml | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 9353009..4b792bd 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -42,6 +42,7 @@ jobs: cat > .env.local << EOF DISCORD_TOKEN=${{ secrets.DISCORD_TOKEN }} CLIENT_ID=${{ secrets.CLIENT_ID }} + GUIDES_CHANNEL_ID=${{ secrets.GUIDES_CHANNEL_ID }} EOF # Stop any existing containers diff --git a/docker-compose.yml b/docker-compose.yml index 6e2d7f0..0978750 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,6 +10,11 @@ services: restart: unless-stopped env_file: - .env.local + environment: + - GUIDES_TRACKER_PATH=/app/data/guides-tracker.json + volumes: + # Persist guides tracker data + - guides-data:/app/data profiles: - prod @@ -24,6 +29,8 @@ services: restart: unless-stopped env_file: - .env.local + environment: + - GUIDES_TRACKER_PATH=/app/data/guides-tracker.json volumes: # Mount source code for hot reload - ./src:/app/src:ro @@ -33,6 +40,11 @@ services: # Mount package files (in case dependencies change) - ./package.json:/app/package.json:ro - ./pnpm-lock.yaml:/app/pnpm-lock.yaml:ro + # Persist guides tracker data + - guides-data:/app/data profiles: - dev +volumes: + guides-data: + driver: local \ No newline at end of file From 8d6067850112ea184211d48607c1c44fdfd16866 Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sat, 18 Oct 2025 23:58:19 +0200 Subject: [PATCH 20/29] chore: add data directory creation and permissions setup for node user in Dockerfile --- Dockerfile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Dockerfile b/Dockerfile index 52f0b96..60f7635 100644 --- a/Dockerfile +++ b/Dockerfile @@ -41,6 +41,9 @@ COPY --from=deps /app/node_modules ./node_modules COPY --from=build /app/dist ./dist COPY package.json ./ +# Create data directory and set permissions for node user +RUN mkdir -p /app/data && chown -R node:node /app/data + # Run as non-root user for security USER node @@ -53,6 +56,9 @@ ENV NODE_ENV=development COPY . . +# Create data directory and set permissions for node user +RUN mkdir -p /app/data && chown -R node:node /app/data + # Run as non-root user for security USER node From a159aa241870b94831b09b763943615c811acaa4 Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sun, 19 Oct 2025 00:07:10 +0200 Subject: [PATCH 21/29] feat: enhance command deployment logic to support both global and guild-specific commands based on server ID --- src/util/deploy.ts | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/util/deploy.ts b/src/util/deploy.ts index 9a089a3..db013ac 100644 --- a/src/util/deploy.ts +++ b/src/util/deploy.ts @@ -1,18 +1,34 @@ import { API } from '@discordjs/core/http-only'; -import { REST, type RESTPutAPIApplicationCommandsResult } from 'discord.js'; +import { + REST, + type RESTPutAPIApplicationCommandsResult, + type RESTPutAPIApplicationGuildCommandsJSONBody, +} from 'discord.js'; import { commands } from '../commands/index.js'; import { config } from '../env.js'; export async function deployCommands(): Promise { const commandData = [...commands.values()].map((command) => command.data); + const guildId = config.discord.serverId; + const rest = new REST({ version: '10' }).setToken(config.discord.token); const api = new API(rest); - const result = await api.applicationCommands.bulkOverwriteGlobalCommands( - config.discord.clientId, - commandData - ); + let result: RESTPutAPIApplicationCommandsResult; + + if (guildId) { + result = await api.applicationCommands.bulkOverwriteGuildCommands( + config.discord.clientId, + guildId, + commandData as RESTPutAPIApplicationGuildCommandsJSONBody + ); + } else { + result = await api.applicationCommands.bulkOverwriteGlobalCommands( + config.discord.clientId, + commandData + ); + } console.log(`Successfully registered ${result.length} commands.`); return result; From 8df61509a5d983652782377e43cd6942f4a905d8 Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sun, 19 Oct 2025 00:07:15 +0200 Subject: [PATCH 22/29] feat: add server ID configuration to Discord settings for enhanced command handling --- src/env.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/env.ts b/src/env.ts index 98da1f7..a55ed76 100644 --- a/src/env.ts +++ b/src/env.ts @@ -19,6 +19,7 @@ export const config = { discord: { token: requireEnv('DISCORD_TOKEN'), clientId: requireEnv('CLIENT_ID'), + serverId: requireEnv('SERVER_ID'), }, guides: { channelId: requireEnv('GUIDES_CHANNEL_ID'), From 222be71863c1e171609262ac56ccfe942cb3278c Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sun, 19 Oct 2025 00:07:36 +0200 Subject: [PATCH 23/29] feat: add SERVER_ID to deployment workflow for Discord integration --- .github/workflows/deploy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 4b792bd..c79a9c2 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -43,6 +43,7 @@ jobs: DISCORD_TOKEN=${{ secrets.DISCORD_TOKEN }} CLIENT_ID=${{ secrets.CLIENT_ID }} GUIDES_CHANNEL_ID=${{ secrets.GUIDES_CHANNEL_ID }} + SERVER_ID=${{ secrets.SERVER_ID }} EOF # Stop any existing containers From a3ca10e6b280ac126e269160fde492e89a3a5fd8 Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sun, 19 Oct 2025 16:22:41 +0200 Subject: [PATCH 24/29] chore: update dependencies in pnpm-lock.yaml --- pnpm-lock.yaml | 503 ++++++++++++++++++++++++------------------------- 1 file changed, 247 insertions(+), 256 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 67a295b..a35a473 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,35 +10,32 @@ importers: dependencies: discord.js: specifier: ^14.22.1 - version: 14.22.1 + version: 14.23.2 typescript: specifier: ^5.9.3 version: 5.9.3 web-features: specifier: ^3.3.0 - version: 3.3.0 + version: 3.5.0 devDependencies: '@biomejs/biome': specifier: 2.2.4 version: 2.2.4 '@types/node': specifier: ^24.5.2 - version: 24.7.0 + version: 24.8.1 husky: specifier: ^9.1.7 version: 9.1.7 lint-staged: specifier: ^16.2.1 - version: 16.2.3 + version: 16.2.4 tsup: specifier: ^8.5.0 version: 8.5.0(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) tsx: specifier: ^4.20.6 version: 4.20.6 - typescript: - specifier: ^5.9.2 - version: 5.9.3 packages: @@ -95,8 +92,8 @@ packages: cpu: [x64] os: [win32] - '@discordjs/builders@1.11.3': - resolution: {integrity: sha512-p3kf5eV49CJiRTfhtutUCeivSyQ/l2JlKodW1ZquRwwvlOWmG9+6jFShX6x8rUiYhnP6wKI96rgN/SXMy5e5aw==} + '@discordjs/builders@1.12.2': + resolution: {integrity: sha512-AugKmrgRJOHXEyMkABH/hXpAmIBKbYokCEl9VAM4Kh6FvkdobQ+Zhv7AR6K+y5hS7+VQ7gKXPYCe1JQmV07H1g==} engines: {node: '>=16.11.0'} '@discordjs/collection@1.5.3': @@ -123,158 +120,158 @@ packages: resolution: {integrity: sha512-wPlQDxEmlDg5IxhJPuxXr3Vy9AjYq5xCvFWGJyD7w7Np8ZGu+Mc+97LCoEc/+AYCo2IDpKioiH0/c/mj5ZR9Uw==} engines: {node: '>=16.11.0'} - '@esbuild/aix-ppc64@0.25.10': - resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} + '@esbuild/aix-ppc64@0.25.11': + resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.10': - resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} + '@esbuild/android-arm64@0.25.11': + resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.10': - resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} + '@esbuild/android-arm@0.25.11': + resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.10': - resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} + '@esbuild/android-x64@0.25.11': + resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.10': - resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} + '@esbuild/darwin-arm64@0.25.11': + resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.10': - resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} + '@esbuild/darwin-x64@0.25.11': + resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.10': - resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} + '@esbuild/freebsd-arm64@0.25.11': + resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.10': - resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} + '@esbuild/freebsd-x64@0.25.11': + resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.10': - resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} + '@esbuild/linux-arm64@0.25.11': + resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.10': - resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} + '@esbuild/linux-arm@0.25.11': + resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.10': - resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} + '@esbuild/linux-ia32@0.25.11': + resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.10': - resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} + '@esbuild/linux-loong64@0.25.11': + resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.10': - resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} + '@esbuild/linux-mips64el@0.25.11': + resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.10': - resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} + '@esbuild/linux-ppc64@0.25.11': + resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.10': - resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} + '@esbuild/linux-riscv64@0.25.11': + resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.10': - resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} + '@esbuild/linux-s390x@0.25.11': + resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.10': - resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} + '@esbuild/linux-x64@0.25.11': + resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.10': - resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} + '@esbuild/netbsd-arm64@0.25.11': + resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.10': - resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} + '@esbuild/netbsd-x64@0.25.11': + resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.10': - resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} + '@esbuild/openbsd-arm64@0.25.11': + resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.10': - resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} + '@esbuild/openbsd-x64@0.25.11': + resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.10': - resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + '@esbuild/openharmony-arm64@0.25.11': + resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.10': - resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + '@esbuild/sunos-x64@0.25.11': + resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.10': - resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} + '@esbuild/win32-arm64@0.25.11': + resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.10': - resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + '@esbuild/win32-ia32@0.25.11': + resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.10': - resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} + '@esbuild/win32-x64@0.25.11': + resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -300,113 +297,113 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@rollup/rollup-android-arm-eabi@4.52.4': - resolution: {integrity: sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==} + '@rollup/rollup-android-arm-eabi@4.52.5': + resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.52.4': - resolution: {integrity: sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==} + '@rollup/rollup-android-arm64@4.52.5': + resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.52.4': - resolution: {integrity: sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==} + '@rollup/rollup-darwin-arm64@4.52.5': + resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.52.4': - resolution: {integrity: sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==} + '@rollup/rollup-darwin-x64@4.52.5': + resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.52.4': - resolution: {integrity: sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==} + '@rollup/rollup-freebsd-arm64@4.52.5': + resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.52.4': - resolution: {integrity: sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==} + '@rollup/rollup-freebsd-x64@4.52.5': + resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.52.4': - resolution: {integrity: sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.52.4': - resolution: {integrity: sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==} + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.52.4': - resolution: {integrity: sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==} + '@rollup/rollup-linux-arm64-gnu@4.52.5': + resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.52.4': - resolution: {integrity: sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==} + '@rollup/rollup-linux-arm64-musl@4.52.5': + resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.52.4': - resolution: {integrity: sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==} + '@rollup/rollup-linux-loong64-gnu@4.52.5': + resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.52.4': - resolution: {integrity: sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==} + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.52.4': - resolution: {integrity: sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==} + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.52.4': - resolution: {integrity: sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==} + '@rollup/rollup-linux-riscv64-musl@4.52.5': + resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.52.4': - resolution: {integrity: sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==} + '@rollup/rollup-linux-s390x-gnu@4.52.5': + resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.52.4': - resolution: {integrity: sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==} + '@rollup/rollup-linux-x64-gnu@4.52.5': + resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.52.4': - resolution: {integrity: sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==} + '@rollup/rollup-linux-x64-musl@4.52.5': + resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.52.4': - resolution: {integrity: sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==} + '@rollup/rollup-openharmony-arm64@4.52.5': + resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.52.4': - resolution: {integrity: sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==} + '@rollup/rollup-win32-arm64-msvc@4.52.5': + resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.52.4': - resolution: {integrity: sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==} + '@rollup/rollup-win32-ia32-msvc@4.52.5': + resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.52.4': - resolution: {integrity: sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==} + '@rollup/rollup-win32-x64-gnu@4.52.5': + resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.52.4': - resolution: {integrity: sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==} + '@rollup/rollup-win32-x64-msvc@4.52.5': + resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} cpu: [x64] os: [win32] @@ -422,15 +419,11 @@ packages: resolution: {integrity: sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==} engines: {node: '>=v14.0.0', npm: '>=7.0.0'} - '@sapphire/snowflake@3.5.5': - resolution: {integrity: sha512-xzvBr1Q1c4lCe7i6sRnrofxeO1QTP/LKQ6A6qy0iB4x5yfiSfARMEQEghojzTNALDTcv8En04qYNIco9/K9eZQ==} - engines: {node: '>=v14.0.0', npm: '>=7.0.0'} - '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/node@24.7.0': - resolution: {integrity: sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==} + '@types/node@24.8.1': + resolution: {integrity: sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q==} '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} @@ -537,18 +530,18 @@ packages: supports-color: optional: true - discord-api-types@0.38.28: - resolution: {integrity: sha512-QwgoJb+83O8Cx0bhHdI/Y9cQIHRvzy8lKXzSQOmzHEf8InuJMEWrzYk94f+OncHk3qWOqBdr9i0DjtXp4i+NHg==} + discord-api-types@0.38.30: + resolution: {integrity: sha512-KhAqlBrg+rVK+Ob7INMF5o63yW4/GUzRatG/AjyVsIO8lgcLyR8qCl2HokIVzWwmzkJYG0CEPXsKMOqau3E8NA==} - discord.js@14.22.1: - resolution: {integrity: sha512-3k+Kisd/v570Jr68A1kNs7qVhNehDwDJAPe4DZ2Syt+/zobf9zEcuYFvsfIaAOgCa0BiHMfOOKQY4eYINl0z7w==} + discord.js@14.23.2: + resolution: {integrity: sha512-tU2NFr823X3TXEc8KyR/4m296KLxPai4nirN3q9kHCpY4TKj96n9lHZnyLzRNMui8EbL07jg9hgH2PWWfKMGIg==} engines: {node: '>=18'} eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - emoji-regex@10.5.0: - resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -560,8 +553,8 @@ packages: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} - esbuild@0.25.10: - resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + esbuild@0.25.11: + resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} engines: {node: '>=18'} hasBin: true @@ -600,8 +593,8 @@ packages: resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} engines: {node: '>=18'} - get-tsconfig@4.10.1: - resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + get-tsconfig@4.12.0: + resolution: {integrity: sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==} glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} @@ -641,8 +634,8 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lint-staged@16.2.3: - resolution: {integrity: sha512-1OnJEESB9zZqsp61XHH2fvpS1es3hRCxMplF/AJUDa8Ho8VrscYDIuxGrj3m8KPXbcWZ8fT9XTMUhEQmOVKpKw==} + lint-staged@16.2.4: + resolution: {integrity: sha512-Pkyr/wd90oAyXk98i/2KwfkIhoYQUMtss769FIT9hFM5ogYZwrk+GRE46yKXSg2ZGhcJ1p38Gf5gmI5Ohjg2yg==} engines: {node: '>=20.17'} hasBin: true @@ -701,8 +694,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nano-spawn@1.0.3: - resolution: {integrity: sha512-jtpsQDetTnvS2Ts1fiRdci5rx0VYws5jGyC+4IYOTnIQ/wwdf6JdomlHBwqC3bJYOvaKu0C2GSZ1A60anrYpaA==} + nano-spawn@2.0.0: + resolution: {integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==} engines: {node: '>=20.17'} object-assign@4.1.1: @@ -790,8 +783,8 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rollup@4.52.4: - resolution: {integrity: sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==} + rollup@4.52.5: + resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -922,8 +915,8 @@ packages: resolution: {integrity: sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==} engines: {node: '>=18.17'} - web-features@3.3.0: - resolution: {integrity: sha512-hg7CKhLUTKEi4zRrFXs1sEmu0kFK+hGCZHalw+nkyBN5X+lgNzs22q7WlNqZfe2avqB+AVuEhONytMgaq/SgxA==} + web-features@3.5.0: + resolution: {integrity: sha512-8e59t2hpjCtVpO+bgdGgyrTBN7CWRYx2dt8TqRJLeMmJ3LpjT4XNSoxYykZi0Fuc5qorbKWXPgseD3PHtyQJ5w==} webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} @@ -1002,12 +995,12 @@ snapshots: '@biomejs/cli-win32-x64@2.2.4': optional: true - '@discordjs/builders@1.11.3': + '@discordjs/builders@1.12.2': dependencies: '@discordjs/formatters': 0.6.1 '@discordjs/util': 1.1.1 '@sapphire/shapeshift': 4.0.0 - discord-api-types: 0.38.28 + discord-api-types: 0.38.30 fast-deep-equal: 3.1.3 ts-mixer: 6.0.4 tslib: 2.8.1 @@ -1018,16 +1011,16 @@ snapshots: '@discordjs/formatters@0.6.1': dependencies: - discord-api-types: 0.38.28 + discord-api-types: 0.38.30 '@discordjs/rest@2.6.0': dependencies: '@discordjs/collection': 2.1.1 '@discordjs/util': 1.1.1 '@sapphire/async-queue': 1.5.5 - '@sapphire/snowflake': 3.5.5 + '@sapphire/snowflake': 3.5.3 '@vladfrangu/async_event_emitter': 2.4.7 - discord-api-types: 0.38.28 + discord-api-types: 0.38.30 magic-bytes.js: 1.12.1 tslib: 2.8.1 undici: 6.21.3 @@ -1042,89 +1035,89 @@ snapshots: '@sapphire/async-queue': 1.5.5 '@types/ws': 8.18.1 '@vladfrangu/async_event_emitter': 2.4.7 - discord-api-types: 0.38.28 + discord-api-types: 0.38.30 tslib: 2.8.1 ws: 8.18.3 transitivePeerDependencies: - bufferutil - utf-8-validate - '@esbuild/aix-ppc64@0.25.10': + '@esbuild/aix-ppc64@0.25.11': optional: true - '@esbuild/android-arm64@0.25.10': + '@esbuild/android-arm64@0.25.11': optional: true - '@esbuild/android-arm@0.25.10': + '@esbuild/android-arm@0.25.11': optional: true - '@esbuild/android-x64@0.25.10': + '@esbuild/android-x64@0.25.11': optional: true - '@esbuild/darwin-arm64@0.25.10': + '@esbuild/darwin-arm64@0.25.11': optional: true - '@esbuild/darwin-x64@0.25.10': + '@esbuild/darwin-x64@0.25.11': optional: true - '@esbuild/freebsd-arm64@0.25.10': + '@esbuild/freebsd-arm64@0.25.11': optional: true - '@esbuild/freebsd-x64@0.25.10': + '@esbuild/freebsd-x64@0.25.11': optional: true - '@esbuild/linux-arm64@0.25.10': + '@esbuild/linux-arm64@0.25.11': optional: true - '@esbuild/linux-arm@0.25.10': + '@esbuild/linux-arm@0.25.11': optional: true - '@esbuild/linux-ia32@0.25.10': + '@esbuild/linux-ia32@0.25.11': optional: true - '@esbuild/linux-loong64@0.25.10': + '@esbuild/linux-loong64@0.25.11': optional: true - '@esbuild/linux-mips64el@0.25.10': + '@esbuild/linux-mips64el@0.25.11': optional: true - '@esbuild/linux-ppc64@0.25.10': + '@esbuild/linux-ppc64@0.25.11': optional: true - '@esbuild/linux-riscv64@0.25.10': + '@esbuild/linux-riscv64@0.25.11': optional: true - '@esbuild/linux-s390x@0.25.10': + '@esbuild/linux-s390x@0.25.11': optional: true - '@esbuild/linux-x64@0.25.10': + '@esbuild/linux-x64@0.25.11': optional: true - '@esbuild/netbsd-arm64@0.25.10': + '@esbuild/netbsd-arm64@0.25.11': optional: true - '@esbuild/netbsd-x64@0.25.10': + '@esbuild/netbsd-x64@0.25.11': optional: true - '@esbuild/openbsd-arm64@0.25.10': + '@esbuild/openbsd-arm64@0.25.11': optional: true - '@esbuild/openbsd-x64@0.25.10': + '@esbuild/openbsd-x64@0.25.11': optional: true - '@esbuild/openharmony-arm64@0.25.10': + '@esbuild/openharmony-arm64@0.25.11': optional: true - '@esbuild/sunos-x64@0.25.10': + '@esbuild/sunos-x64@0.25.11': optional: true - '@esbuild/win32-arm64@0.25.10': + '@esbuild/win32-arm64@0.25.11': optional: true - '@esbuild/win32-ia32@0.25.10': + '@esbuild/win32-ia32@0.25.11': optional: true - '@esbuild/win32-x64@0.25.10': + '@esbuild/win32-x64@0.25.11': optional: true '@isaacs/cliui@8.0.2': @@ -1153,70 +1146,70 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@rollup/rollup-android-arm-eabi@4.52.4': + '@rollup/rollup-android-arm-eabi@4.52.5': optional: true - '@rollup/rollup-android-arm64@4.52.4': + '@rollup/rollup-android-arm64@4.52.5': optional: true - '@rollup/rollup-darwin-arm64@4.52.4': + '@rollup/rollup-darwin-arm64@4.52.5': optional: true - '@rollup/rollup-darwin-x64@4.52.4': + '@rollup/rollup-darwin-x64@4.52.5': optional: true - '@rollup/rollup-freebsd-arm64@4.52.4': + '@rollup/rollup-freebsd-arm64@4.52.5': optional: true - '@rollup/rollup-freebsd-x64@4.52.4': + '@rollup/rollup-freebsd-x64@4.52.5': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.52.4': + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.52.4': + '@rollup/rollup-linux-arm-musleabihf@4.52.5': optional: true - '@rollup/rollup-linux-arm64-gnu@4.52.4': + '@rollup/rollup-linux-arm64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-arm64-musl@4.52.4': + '@rollup/rollup-linux-arm64-musl@4.52.5': optional: true - '@rollup/rollup-linux-loong64-gnu@4.52.4': + '@rollup/rollup-linux-loong64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.52.4': + '@rollup/rollup-linux-ppc64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.52.4': + '@rollup/rollup-linux-riscv64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-riscv64-musl@4.52.4': + '@rollup/rollup-linux-riscv64-musl@4.52.5': optional: true - '@rollup/rollup-linux-s390x-gnu@4.52.4': + '@rollup/rollup-linux-s390x-gnu@4.52.5': optional: true - '@rollup/rollup-linux-x64-gnu@4.52.4': + '@rollup/rollup-linux-x64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-x64-musl@4.52.4': + '@rollup/rollup-linux-x64-musl@4.52.5': optional: true - '@rollup/rollup-openharmony-arm64@4.52.4': + '@rollup/rollup-openharmony-arm64@4.52.5': optional: true - '@rollup/rollup-win32-arm64-msvc@4.52.4': + '@rollup/rollup-win32-arm64-msvc@4.52.5': optional: true - '@rollup/rollup-win32-ia32-msvc@4.52.4': + '@rollup/rollup-win32-ia32-msvc@4.52.5': optional: true - '@rollup/rollup-win32-x64-gnu@4.52.4': + '@rollup/rollup-win32-x64-gnu@4.52.5': optional: true - '@rollup/rollup-win32-x64-msvc@4.52.4': + '@rollup/rollup-win32-x64-msvc@4.52.5': optional: true '@sapphire/async-queue@1.5.5': {} @@ -1228,17 +1221,15 @@ snapshots: '@sapphire/snowflake@3.5.3': {} - '@sapphire/snowflake@3.5.5': {} - '@types/estree@1.0.8': {} - '@types/node@24.7.0': + '@types/node@24.8.1': dependencies: undici-types: 7.14.0 '@types/ws@8.18.1': dependencies: - '@types/node': 24.7.0 + '@types/node': 24.8.1 '@vladfrangu/async_event_emitter@2.4.7': {} @@ -1270,9 +1261,9 @@ snapshots: dependencies: fill-range: 7.1.1 - bundle-require@5.1.0(esbuild@0.25.10): + bundle-require@5.1.0(esbuild@0.25.11): dependencies: - esbuild: 0.25.10 + esbuild: 0.25.11 load-tsconfig: 0.2.5 cac@6.7.14: {} @@ -1316,18 +1307,18 @@ snapshots: dependencies: ms: 2.1.3 - discord-api-types@0.38.28: {} + discord-api-types@0.38.30: {} - discord.js@14.22.1: + discord.js@14.23.2: dependencies: - '@discordjs/builders': 1.11.3 + '@discordjs/builders': 1.12.2 '@discordjs/collection': 1.5.3 '@discordjs/formatters': 0.6.1 '@discordjs/rest': 2.6.0 '@discordjs/util': 1.1.1 '@discordjs/ws': 1.2.3 '@sapphire/snowflake': 3.5.3 - discord-api-types: 0.38.28 + discord-api-types: 0.38.30 fast-deep-equal: 3.1.3 lodash.snakecase: 4.1.1 magic-bytes.js: 1.12.1 @@ -1339,7 +1330,7 @@ snapshots: eastasianwidth@0.2.0: {} - emoji-regex@10.5.0: {} + emoji-regex@10.6.0: {} emoji-regex@8.0.0: {} @@ -1347,34 +1338,34 @@ snapshots: environment@1.1.0: {} - esbuild@0.25.10: + esbuild@0.25.11: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.10 - '@esbuild/android-arm': 0.25.10 - '@esbuild/android-arm64': 0.25.10 - '@esbuild/android-x64': 0.25.10 - '@esbuild/darwin-arm64': 0.25.10 - '@esbuild/darwin-x64': 0.25.10 - '@esbuild/freebsd-arm64': 0.25.10 - '@esbuild/freebsd-x64': 0.25.10 - '@esbuild/linux-arm': 0.25.10 - '@esbuild/linux-arm64': 0.25.10 - '@esbuild/linux-ia32': 0.25.10 - '@esbuild/linux-loong64': 0.25.10 - '@esbuild/linux-mips64el': 0.25.10 - '@esbuild/linux-ppc64': 0.25.10 - '@esbuild/linux-riscv64': 0.25.10 - '@esbuild/linux-s390x': 0.25.10 - '@esbuild/linux-x64': 0.25.10 - '@esbuild/netbsd-arm64': 0.25.10 - '@esbuild/netbsd-x64': 0.25.10 - '@esbuild/openbsd-arm64': 0.25.10 - '@esbuild/openbsd-x64': 0.25.10 - '@esbuild/openharmony-arm64': 0.25.10 - '@esbuild/sunos-x64': 0.25.10 - '@esbuild/win32-arm64': 0.25.10 - '@esbuild/win32-ia32': 0.25.10 - '@esbuild/win32-x64': 0.25.10 + '@esbuild/aix-ppc64': 0.25.11 + '@esbuild/android-arm': 0.25.11 + '@esbuild/android-arm64': 0.25.11 + '@esbuild/android-x64': 0.25.11 + '@esbuild/darwin-arm64': 0.25.11 + '@esbuild/darwin-x64': 0.25.11 + '@esbuild/freebsd-arm64': 0.25.11 + '@esbuild/freebsd-x64': 0.25.11 + '@esbuild/linux-arm': 0.25.11 + '@esbuild/linux-arm64': 0.25.11 + '@esbuild/linux-ia32': 0.25.11 + '@esbuild/linux-loong64': 0.25.11 + '@esbuild/linux-mips64el': 0.25.11 + '@esbuild/linux-ppc64': 0.25.11 + '@esbuild/linux-riscv64': 0.25.11 + '@esbuild/linux-s390x': 0.25.11 + '@esbuild/linux-x64': 0.25.11 + '@esbuild/netbsd-arm64': 0.25.11 + '@esbuild/netbsd-x64': 0.25.11 + '@esbuild/openbsd-arm64': 0.25.11 + '@esbuild/openbsd-x64': 0.25.11 + '@esbuild/openharmony-arm64': 0.25.11 + '@esbuild/sunos-x64': 0.25.11 + '@esbuild/win32-arm64': 0.25.11 + '@esbuild/win32-ia32': 0.25.11 + '@esbuild/win32-x64': 0.25.11 eventemitter3@5.0.1: {} @@ -1392,7 +1383,7 @@ snapshots: dependencies: magic-string: 0.30.19 mlly: 1.8.0 - rollup: 4.52.4 + rollup: 4.52.5 foreground-child@3.3.1: dependencies: @@ -1404,7 +1395,7 @@ snapshots: get-east-asian-width@1.4.0: {} - get-tsconfig@4.10.1: + get-tsconfig@4.12.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -1441,12 +1432,12 @@ snapshots: lines-and-columns@1.2.4: {} - lint-staged@16.2.3: + lint-staged@16.2.4: dependencies: commander: 14.0.1 listr2: 9.0.4 micromatch: 4.0.8 - nano-spawn: 1.0.3 + nano-spawn: 2.0.0 pidtree: 0.6.0 string-argv: 0.3.2 yaml: 2.8.1 @@ -1512,7 +1503,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nano-spawn@1.0.3: {} + nano-spawn@2.0.0: {} object-assign@4.1.1: {} @@ -1569,32 +1560,32 @@ snapshots: rfdc@1.4.1: {} - rollup@4.52.4: + rollup@4.52.5: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.52.4 - '@rollup/rollup-android-arm64': 4.52.4 - '@rollup/rollup-darwin-arm64': 4.52.4 - '@rollup/rollup-darwin-x64': 4.52.4 - '@rollup/rollup-freebsd-arm64': 4.52.4 - '@rollup/rollup-freebsd-x64': 4.52.4 - '@rollup/rollup-linux-arm-gnueabihf': 4.52.4 - '@rollup/rollup-linux-arm-musleabihf': 4.52.4 - '@rollup/rollup-linux-arm64-gnu': 4.52.4 - '@rollup/rollup-linux-arm64-musl': 4.52.4 - '@rollup/rollup-linux-loong64-gnu': 4.52.4 - '@rollup/rollup-linux-ppc64-gnu': 4.52.4 - '@rollup/rollup-linux-riscv64-gnu': 4.52.4 - '@rollup/rollup-linux-riscv64-musl': 4.52.4 - '@rollup/rollup-linux-s390x-gnu': 4.52.4 - '@rollup/rollup-linux-x64-gnu': 4.52.4 - '@rollup/rollup-linux-x64-musl': 4.52.4 - '@rollup/rollup-openharmony-arm64': 4.52.4 - '@rollup/rollup-win32-arm64-msvc': 4.52.4 - '@rollup/rollup-win32-ia32-msvc': 4.52.4 - '@rollup/rollup-win32-x64-gnu': 4.52.4 - '@rollup/rollup-win32-x64-msvc': 4.52.4 + '@rollup/rollup-android-arm-eabi': 4.52.5 + '@rollup/rollup-android-arm64': 4.52.5 + '@rollup/rollup-darwin-arm64': 4.52.5 + '@rollup/rollup-darwin-x64': 4.52.5 + '@rollup/rollup-freebsd-arm64': 4.52.5 + '@rollup/rollup-freebsd-x64': 4.52.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 + '@rollup/rollup-linux-arm-musleabihf': 4.52.5 + '@rollup/rollup-linux-arm64-gnu': 4.52.5 + '@rollup/rollup-linux-arm64-musl': 4.52.5 + '@rollup/rollup-linux-loong64-gnu': 4.52.5 + '@rollup/rollup-linux-ppc64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-musl': 4.52.5 + '@rollup/rollup-linux-s390x-gnu': 4.52.5 + '@rollup/rollup-linux-x64-gnu': 4.52.5 + '@rollup/rollup-linux-x64-musl': 4.52.5 + '@rollup/rollup-openharmony-arm64': 4.52.5 + '@rollup/rollup-win32-arm64-msvc': 4.52.5 + '@rollup/rollup-win32-ia32-msvc': 4.52.5 + '@rollup/rollup-win32-x64-gnu': 4.52.5 + '@rollup/rollup-win32-x64-msvc': 4.52.5 fsevents: 2.3.3 shebang-command@2.0.0: @@ -1630,7 +1621,7 @@ snapshots: string-width@7.2.0: dependencies: - emoji-regex: 10.5.0 + emoji-regex: 10.6.0 get-east-asian-width: 1.4.0 strip-ansi: 7.1.2 @@ -1690,18 +1681,18 @@ snapshots: tsup@8.5.0(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1): dependencies: - bundle-require: 5.1.0(esbuild@0.25.10) + bundle-require: 5.1.0(esbuild@0.25.11) cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.2 debug: 4.4.3 - esbuild: 0.25.10 + esbuild: 0.25.11 fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 postcss-load-config: 6.0.1(tsx@4.20.6)(yaml@2.8.1) resolve-from: 5.0.0 - rollup: 4.52.4 + rollup: 4.52.5 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tinyexec: 0.3.2 @@ -1717,8 +1708,8 @@ snapshots: tsx@4.20.6: dependencies: - esbuild: 0.25.10 - get-tsconfig: 4.10.1 + esbuild: 0.25.11 + get-tsconfig: 4.12.0 optionalDependencies: fsevents: 2.3.3 @@ -1730,7 +1721,7 @@ snapshots: undici@6.21.3: {} - web-features@3.3.0: {} + web-features@3.5.0: {} webidl-conversions@4.0.2: {} From b04735f7e3ffab2a2a8cd1bb4d5347b68c7887ee Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sun, 19 Oct 2025 16:33:23 +0200 Subject: [PATCH 25/29] refactor: remove guildId from deployCommands function to streamline command deployment --- src/util/deploy.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/util/deploy.ts b/src/util/deploy.ts index 458a70b..6216dbe 100644 --- a/src/util/deploy.ts +++ b/src/util/deploy.ts @@ -5,11 +5,8 @@ import { config } from '../env.js'; export async function deployCommands(): Promise { const commandData = [...commands.values()].map((command) => command.data); - const guildId = config.discord.serverId; - const rest = new REST({ version: '10' }).setToken(config.discord.token); - const result = (await rest.put( Routes.applicationGuildCommands(config.discord.clientId, config.serverId), { From 0f4bdea1c332bd6212ba086e381d1fe1b6881fae Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sun, 19 Oct 2025 16:53:13 +0200 Subject: [PATCH 26/29] feat: add additional configuration variables for repel command in deployment workflow --- .github/workflows/deploy.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c79a9c2..d3f4cfe 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -44,6 +44,9 @@ jobs: CLIENT_ID=${{ secrets.CLIENT_ID }} GUIDES_CHANNEL_ID=${{ secrets.GUIDES_CHANNEL_ID }} SERVER_ID=${{ secrets.SERVER_ID }} + REPEL_LOG_CHANNEL_ID=${{ secrets.REPEL_LOG_CHANNEL_ID }} + REPEL_ROLE_ID=${{ secrets.REPEL_ROLE_ID }} + MODERATORS_ROLE_IDS=${{ secrets.MODERATORS_ROLE_IDS }} EOF # Stop any existing containers From d4d9ee8e0d510ae2db8a140208328fa56d503747 Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sun, 19 Oct 2025 17:28:01 +0200 Subject: [PATCH 27/29] fix: update activity name in client presence for improved clarity --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index af17536..69bf3eb 100644 --- a/src/index.ts +++ b/src/index.ts @@ -20,7 +20,7 @@ const client = new Client({ GatewayIntentBits.GuildMessageTyping, ], presence: { - activities: [{ type: ActivityType.Custom, name: '/help for commands' }], + activities: [{ type: ActivityType.Custom, name: 'Helping you out in the community' }], status: 'online', }, }); From 6f937f984a867e7469e62a3ca341185428b99e63 Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sun, 19 Oct 2025 17:29:52 +0200 Subject: [PATCH 28/29] chore: update deployment workflow to pull from main branch instead of ci/deploy-with-docker --- .github/workflows/deploy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index d3f4cfe..58e6a74 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -31,8 +31,8 @@ jobs: git stash push -m "Auto-deploy $(date)" 2>/dev/null || true # Pull latest changes - git checkout ci/deploy-with-docker - git pull origin ci/deploy-with-docker + git checkout main + git pull origin main # Read NODE_VERSION from .nvmrc export NODE_VERSION=$(cat .nvmrc | sed 's/v//') From 92951c6a785e07fa03f96515e603c8e81a440a65 Mon Sep 17 00:00:00 2001 From: Wiktoria Van Harneveldt Date: Sun, 19 Oct 2025 19:17:45 +0200 Subject: [PATCH 29/29] chore: remove SERVER_ID from Discord configuration in env.ts --- src/env.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/env.ts b/src/env.ts index 5efa3a9..cc90dea 100644 --- a/src/env.ts +++ b/src/env.ts @@ -19,7 +19,6 @@ export const config = { discord: { token: requireEnv('DISCORD_TOKEN'), clientId: requireEnv('CLIENT_ID'), - serverId: requireEnv('SERVER_ID'), }, repel: { repelLogChannelId: requireEnv('REPEL_LOG_CHANNEL_ID'),