diff --git a/.cspell.json b/.cspell.json index 6c41761e10..8c27cde7bf 100644 --- a/.cspell.json +++ b/.cspell.json @@ -99,6 +99,7 @@ "stringified", "disdppgloss", "awaiter", + "awaiters", "resumer", "checkered", "ramen", @@ -136,7 +137,11 @@ "NOMINMAX", "sku", "skus", - "Codecademy" + "Codecademy", + "tparam", + "khanda", + "oclock", + "moai" ], "flagWords": [ "hte" diff --git a/.github/labeler.yml b/.github/labeler.yml index 62a6ca852e..b3941c42c3 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -1,35 +1,52 @@ documentation: -- '**Doxyfile' -- '**docpages/**' -- '**/*.h' -- '**/documentation.yml' -- '**.cspell.json' -- '**README.md' -- '**SECURITY.md' -- '**CONTRIBUTING.md' -- '**CODE_OF_CONDUCT.md' +- changed-files: + - any-glob-to-any-file: + - '**Doxyfile' + - '**docpages/**' + - '**/*.h' + - '**/documentation.yml' + - '**.cspell.json' + - '**README.md' + - '**SECURITY.md' + - '**CONTRIBUTING.md' + - '**CODE_OF_CONDUCT.md' + build: -- '**buildtools/**' -- '**cmake/**' -- '**library-vcpkg/**' -- '**library/**' -- '**win32/**' -- '**CMakeLists.txt' -- '**CMakeSettings.json' -- '**settings.json' -- '**dpp.pc.in' +- changed-files: + - any-glob-to-any-file: + - '**buildtools/**' + - '**cmake/**' + - '**library-vcpkg/**' + - '**library/**' + - '**win32/**' + - '**CMakeLists.txt' + - '**CMakeSettings.json' + - '**settings.json' + - '**dpp.pc.in' + packaging: -- '**vcpkg/**' -- '**makerelease.sh' -- '**sign.sh' -- '**Dockerfile' +- changed-files: + - any-glob-to-any-file: + - '**vcpkg/**' + - '**makerelease.sh' + - '**sign.sh' + - '**Dockerfile' + submodules: -- '**.gitmodules' -- '**doxygen-awesome-css/**' # Ideally, nobody should be touching this, but it's here just in-case. +- changed-files: + - any-glob-to-any-file: + - '**.gitmodules' + - '**doxygen-awesome-css/**' # Ideally, nobody should be touching this, but it's here just in-case. + github_actions: -- '**.github/labeler.yml' -- '**.github/dependabot.yml' -- '**.github/workflows/**' +- changed-files: + - any-glob-to-any-file: + - '**.github/labeler.yml' + - '**.github/dependabot.yml' + - '**.github/workflows/**' + code: -- '**src/**' -- '**include/**' +- changed-files: + - any-glob-to-any-file: + - '**src/**' + - '**include/**' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3898391d1a..a771b91465 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,41 +27,55 @@ permissions: contents: read jobs: - linux-with-unit-test: + linux: permissions: contents: write concurrency: - group: ${{ github.workflow }}-${{ github.ref }} + group: ${{ github.workflow }}-${{ github.ref }}-${{ matrix.cfg.arch }}-(${{ matrix.cfg.cpp-version }}) cancel-in-progress: true name: Linux ${{matrix.cfg.arch}} (${{matrix.cfg.cpp-version}}) runs-on: ${{matrix.cfg.os}} strategy: fail-fast: false # Don't fail everything if one fails. We want to test each OS/Compiler individually matrix: + # GitHub hosted runners on Azure + # arm7hf is a self-hosted docker-based runner at Brainbox.cc. Raspberry Pi 4, 8gb 4-core with NEON cfg: - - { arch: 'amd64', os: ubuntu-20.04, cpp-version: g++-8 } - + - { arch: 'amd64', concurrency: 2, os: ubuntu-20.04, package: clang-10, cpp-version: clang++-10, cmake-flags: '', cpack: 'no', ctest: 'no' } + - { arch: 'amd64', concurrency: 2, os: ubuntu-22.04, package: clang-11, cpp-version: clang++-11, cmake-flags: '', cpack: 'no', ctest: 'no' } + - { arch: 'amd64', concurrency: 2, os: ubuntu-22.04, package: clang-12, cpp-version: clang++-12, cmake-flags: '', cpack: 'no', ctest: 'no' } + - { arch: 'amd64', concurrency: 2, os: ubuntu-22.04, package: clang-13, cpp-version: clang++-13, cmake-flags: '', cpack: 'no', ctest: 'no' } + - { arch: 'amd64', concurrency: 2, os: ubuntu-22.04, package: clang-14, cpp-version: clang++-14, cmake-flags: '', cpack: 'no', ctest: 'no' } + - { arch: 'amd64', concurrency: 2, os: ubuntu-22.04, package: clang-15, cpp-version: clang++-15, cmake-flags: '-DDPP_CORO=ON', cpack: 'no', ctest: 'no' } + - { arch: 'amd64', concurrency: 2, os: ubuntu-22.04, package: g++-12, cpp-version: g++-12, cmake-flags: '-DDPP_CORO=ON', cpack: 'no', ctest: 'no' } + - { arch: 'amd64', concurrency: 2, os: ubuntu-22.04, package: g++-11, cpp-version: g++-11, cmake-flags: '-DDPP_CORO=ON', cpack: 'no', ctest: 'no' } + - { arch: 'amd64', concurrency: 2, os: ubuntu-22.04, package: g++-10, cpp-version: g++-10, cmake-flags: '', cpack: 'yes', ctest: 'no' } + - { arch: 'amd64', concurrency: 2, os: ubuntu-20.04, package: g++-9, cpp-version: g++-9, cmake-flags: '', cpack: 'no', ctest: 'no' } + - { arch: 'amd64', concurrency: 2, os: ubuntu-20.04, package: g++-8, cpp-version: g++-8, cmake-flags: '', cpack: 'no', ctest: 'yes' } + - { arch: 'arm7hf', concurrency: 4, os: [self-hosted, linux, ARM], package: g++-12, cpp-version: g++-12, cmake-flags: '', cpack: 'yes', ctest: 'no' } + - { arch: 'arm64', concurrency: 4, os: [self-hosted, linux, ARM64], package: g++-12, cpp-version: g++-12, cmake-flags: '', cpack: 'yes', ctest: 'no' } steps: - name: Harden Runner - uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit - name: Checkout D++ - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: Install apt packages - run: sudo sed -i 's/azure\.//' /etc/apt/sources.list && sudo apt update && sudo apt-get install -y ${{ matrix.cfg.cpp-version }} libsodium-dev libopus-dev zlib1g-dev rpm + run: sudo sed -i 's/azure\.//' /etc/apt/sources.list && sudo apt update && sudo apt-get install -y ${{ matrix.cfg.package }} pkg-config libsodium-dev libopus-dev zlib1g-dev rpm - name: Generate CMake - run: mkdir build && cd build && cmake -DDPP_NO_VCPKG=ON -DAVX_TYPE=AVX0 -DCMAKE_BUILD_TYPE=Release .. + run: mkdir build && cd build && cmake -DDPP_NO_VCPKG=ON -DAVX_TYPE=AVX0 -DCMAKE_BUILD_TYPE=Release ${{matrix.cfg.cmake-flags}} .. env: CXX: ${{matrix.cfg.cpp-version}} - name: Build Project - run: cd build && make -j2 + run: cd build && make -j${{ matrix.cfg.concurrency }} - name: Run unit tests + if: ${{ matrix.cfg.ctest == 'yes' }} run: cd build && ctest -VV env: DPP_UNIT_TEST_TOKEN: ${{secrets.DPP_UNIT_TEST_TOKEN}} @@ -71,63 +85,20 @@ jobs: TEST_USER_ID: ${{secrets.TEST_USER_ID}} TEST_EVENT_ID: ${{secrets.TEST_EVENT_ID}} - linux-no-unit-tests: - permissions: - contents: write - name: Linux ${{matrix.cfg.arch}} (${{matrix.cfg.cpp-version}}) - runs-on: ${{matrix.cfg.os}} - strategy: - fail-fast: false # Don't fail everything if one fails. We want to test each OS/Compiler individually - matrix: - # GitHub hosted runners on Azure - # arm7hf is a self-hosted docker-based runner at Brainbox.cc. Raspberry Pi 4, 8gb 4-core with NEON - cfg: - - { arch: 'amd64', concurrency: 2, os: ubuntu-20.04, package: clang-10, cpp-version: clang++-10, cmake-flags: '', cpack: 'no' } - - { arch: 'amd64', concurrency: 2, os: ubuntu-22.04, package: clang-11, cpp-version: clang++-11, cmake-flags: '', cpack: 'no' } - - { arch: 'amd64', concurrency: 2, os: ubuntu-22.04, package: clang-12, cpp-version: clang++-12, cmake-flags: '', cpack: 'no' } - - { arch: 'amd64', concurrency: 2, os: ubuntu-22.04, package: clang-13, cpp-version: clang++-13, cmake-flags: '', cpack: 'no' } - - { arch: 'amd64', concurrency: 2, os: ubuntu-22.04, package: clang-14, cpp-version: clang++-14, cmake-flags: '', cpack: 'no' } - - { arch: 'amd64', concurrency: 2, os: ubuntu-22.04, package: clang-15, cpp-version: clang++-15, cmake-flags: '-DDPP_CORO=ON', cpack: 'no' } - - { arch: 'amd64', concurrency: 2, os: ubuntu-22.04, package: g++-12, cpp-version: g++-12, cmake-flags: '-DDPP_CORO=ON', cpack: 'no' } - - { arch: 'amd64', concurrency: 2, os: ubuntu-22.04, package: g++-11, cpp-version: g++-11, cmake-flags: '-DDPP_CORO=ON', cpack: 'no' } - - { arch: 'amd64', concurrency: 2, os: ubuntu-22.04, package: g++-10, cpp-version: g++-10, cmake-flags: '', cpack: 'yes' } - - { arch: 'amd64', concurrency: 2, os: ubuntu-20.04, package: g++-9, cpp-version: g++-9, cmake-flags: '', cpack: 'no' } - - { arch: 'arm7hf', concurrency: 4, os: [self-hosted, linux, ARM], package: g++-12, cpp-version: g++-12, cmake-flags: '', cpack: 'yes' } - - { arch: 'arm64', concurrency: 4, os: [self-hosted, linux, ARM64], package: g++-12, cpp-version: g++-12, cmake-flags: '', cpack: 'yes' } - steps: - - name: Harden Runner - uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 - with: - egress-policy: audit - - - name: Checkout D++ - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Install apt packages - run: sudo sed -i 's/azure\.//' /etc/apt/sources.list && sudo apt update && sudo apt-get install -y ${{ matrix.cfg.package }} pkg-config libsodium-dev libopus-dev zlib1g-dev rpm - - - name: Generate CMake - run: mkdir build && cd build && cmake -DDPP_NO_VCPKG=ON -DAVX_TYPE=AVX0 -DCMAKE_BUILD_TYPE=Release ${{matrix.cfg.cmake-flags}} .. - env: - CXX: ${{matrix.cfg.cpp-version}} - - - name: Build Project - run: cd build && make -j${{ matrix.cfg.concurrency }} - - name: Package distributable if: ${{ matrix.cfg.cpack == 'yes' }} run: cd build && cpack --verbose - name: Upload Binary (DEB) if: ${{ matrix.cfg.cpack == 'yes' }} - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: "libdpp - Debian Package ${{matrix.cfg.arch}}" path: '${{github.workspace}}/build/*.deb' - name: Upload Binary (RPM) if: ${{ matrix.cfg.cpack == 'yes' }} - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: "libdpp - RPM Package ${{matrix.cfg.arch}}" path: '${{github.workspace}}/build/*.rpm' @@ -140,18 +111,18 @@ jobs: strategy: fail-fast: false # Don't fail everything if one fails. We want to test each OS/Compiler individually matrix: - # arm64 is a self-hosted runner on a Mac M2 Mini, ran inside a virtual machine by Archie Jaskowicz. + # arm64 is a self-hosted runner on a Mac M2 Mini, ran inside a virtual machine by Archie Jaskowicz. NOTE: This runner no longer exists. It may come back in a few months. cfg: - - { arch: 'x64', concurrency: 3, os: macos-latest, cpp-version: clang++-14, cmake-flags: '', cpack: 'no' } - - { arch: 'arm64', concurrency: 2, os: [self-hosted, ARM64, macOS], cpp-version: clang++-15, cmake-flags: '', cpack: 'no' } + - { arch: 'x64', concurrency: 3, os: macos-latest, cpp-version: clang++-14, cmake-flags: ''} +# - { arch: 'arm64', concurrency: 2, os: [self-hosted, ARM64, macOS], cpp-version: clang++-15, cmake-flags: ''} steps: - name: Harden Runner - uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit - name: Checkout D++ - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: Install homebrew packages run: brew install cmake make libsodium opus openssl pkg-config @@ -195,17 +166,17 @@ jobs: runs-on: ${{matrix.cfg.os}} steps: - name: Harden Runner - uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit - name: Checkout D++ - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 with: path: main - name: Add MSBuild to PATH - uses: microsoft/setup-msbuild@1ff57057b5cfdc39105cd07a01d78e9b0ea0c14c # v1.3.1 + uses: microsoft/setup-msbuild@6fb02220983dee41ce7ae257b6f4d8f9bf5ed4ce # v2.0.0 - name: Install chocolatey packages ${{ matrix.cfg.arch}} uses: seanmiddleditch/gha-setup-ninja@8b297075da4cd2a5f1fd21fe011b499edf06e9d2 # master @@ -238,7 +209,7 @@ jobs: - name: Upload Binary if: ${{ matrix.cfg.upload }} - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: "libdpp - Windows ${{matrix.cfg.name}}-${{matrix.cfg.config}}-vs${{matrix.cfg.vs}}" path: '${{github.workspace}}/main/build/*.zip' @@ -260,12 +231,12 @@ jobs: runs-on: ${{matrix.cfg.os}} steps: - name: Harden Runner - uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit - name: Checkout D++ - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: Install Packages run: sudo sed -i 's/azure\.//' /etc/apt/sources.list && sudo apt update && sudo apt-get install -y cmake rpm @@ -280,13 +251,13 @@ jobs: run: cd build && sudo cpack --verbose || cat /home/runner/work/DPP/DPP/build/_CPack_Packages/Linux/DEB/PreinstallOutput.log - name: Upload Binaries (DEB) - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: "libdpp - Debian Package ${{matrix.cfg.name}}" path: "${{github.workspace}}/build/*.deb" - name: Upload Binaries (RPM) - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: "libdpp - RPM Package ${{matrix.cfg.name}}" path: "${{github.workspace}}/build/*.rpm" diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index d70dce6dda..83de763be1 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -41,16 +41,16 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit - name: Checkout repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8 + uses: github/codeql-action/init@d39d31e687223d841ef683f52467bd88e9b21c14 # v3.25.3 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -65,6 +65,6 @@ jobs: make -j2 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8 + uses: github/codeql-action/analyze@d39d31e687223d841ef683f52467bd88e9b21c14 # v3.25.3 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/construct-vcpkg-info.yml b/.github/workflows/construct-vcpkg-info.yml index 847580c838..17862fcadd 100644 --- a/.github/workflows/construct-vcpkg-info.yml +++ b/.github/workflows/construct-vcpkg-info.yml @@ -15,17 +15,17 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit - name: Setup PHP - uses: shivammathur/setup-php@e6f75134d35752277f093989e72e140eaa222f35 # v2 + uses: shivammathur/setup-php@c665c7a15b5295c2488ac8a87af9cb806cd72198 # v2 with: php-version: '8.1' - name: Checkout D++ - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 with: submodules: recursive diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index 10eb780233..bd74c3d5ec 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -17,11 +17,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit - name: 'Checkout Repository' - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: 'Dependency Review' - uses: actions/dependency-review-action@01bc87099ba56df1e897b6874784491ea6309bc4 # v3.1.4 + uses: actions/dependency-review-action@0c155c5e8556a497adf53f2c18edabf945ed8e70 # v4.3.2 diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index c476da7b33..a9c723dde0 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -22,7 +22,7 @@ jobs: cancel-in-progress: false steps: - name: Harden Runner - uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit @@ -31,23 +31,23 @@ jobs: uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 + uses: docker/setup-buildx-action@2b51285047da1547ffb1b2203d8be4c0af6b1f20 # v3.2.0 - name: Login to DockerHub - uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0 + uses: docker/login-action@e92390c5fb421da1463c202d546fed0ec5c39f20 # v3.1.0 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Login to GitHub Container Registry - uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0 + uses: docker/login-action@e92390c5fb421da1463c202d546fed0ec5c39f20 # v3.1.0 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push - uses: docker/build-push-action@4a13e500e55cf31b7a5d59a38ab2040ab0f42f56 # v5.1.0 + uses: docker/build-push-action@2cdde995de11925a030ce8070c3d77a52ffcf1c0 # v5.3.0 with: push: true tags: brainboxdotcc/dpp diff --git a/.github/workflows/documentation-check.yml b/.github/workflows/documentation-check.yml index 7b63b8e81e..cb216a5a24 100644 --- a/.github/workflows/documentation-check.yml +++ b/.github/workflows/documentation-check.yml @@ -22,12 +22,12 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit - name: Checkout D++ - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: Check docs spelling run: npx -y cspell lint --language-id=cpp --no-progress --no-summary --show-context --show-suggestions --relative --color docpages/*.md include/dpp/*.h diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index fa11037649..1351814535 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -25,17 +25,17 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit - name: Setup PHP - uses: shivammathur/setup-php@e6f75134d35752277f093989e72e140eaa222f35 # v2 + uses: shivammathur/setup-php@c665c7a15b5295c2488ac8a87af9cb806cd72198 # v2 with: php-version: '8.0' - name: Checkout D++ - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 with: submodules: recursive diff --git a/.github/workflows/gitguardian.yml b/.github/workflows/gitguardian.yml index 23dfe6d00c..5029b6c490 100644 --- a/.github/workflows/gitguardian.yml +++ b/.github/workflows/gitguardian.yml @@ -14,16 +14,16 @@ jobs: cancel-in-progress: true steps: - name: Harden Runner - uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit - name: Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 with: fetch-depth: 0 # fetch all history so multiple commits can be scanned - name: GitGuardian scan - uses: GitGuardian/ggshield-action@9074c0893e8ee86ccd6418177a0eb3e5aa02262a # master + uses: GitGuardian/ggshield-action@3af6bd67c964cffe01a0f8f5c0dd04b8cda99e6b # master env: GITHUB_PUSH_BEFORE_SHA: ${{ github.event.before }} GITHUB_PUSH_BASE_SHA: ${{ github.event.base }} diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 444ccf3c61..4479375c82 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -7,16 +7,16 @@ permissions: contents: read jobs: - triage: + labeler: permissions: pull-requests: write # Labeler needs to be able to add labels to PRs. runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit - - uses: actions/labeler@ac9175f8a1f3625fd0d4fb234536d26811351594 # v4.3.0 + - uses: actions/labeler@8558fd74291d67161a8a78ce36a881fa63b766a9 # v5.0.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 1087bb0419..bf562859e2 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -32,12 +32,12 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit - name: "Checkout code" - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 with: persist-credentials: false @@ -64,7 +64,7 @@ jobs: # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: "Upload artifact" - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: SARIF file path: results.sarif @@ -72,6 +72,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8 + uses: github/codeql-action/upload-sarif@d39d31e687223d841ef683f52467bd88e9b21c14 # v3.25.3 with: sarif_file: results.sarif diff --git a/.github/workflows/sitemap.yml b/.github/workflows/sitemap.yml index cfb51f435e..588fb1a052 100644 --- a/.github/workflows/sitemap.yml +++ b/.github/workflows/sitemap.yml @@ -19,7 +19,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index d14cf9cb4a..bd479cfb61 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -14,11 +14,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit - - uses: actions/stale@1160a2240286f5da8ec72b1c0816ce2481aabf84 # v8.0.0 + - uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9.0.0 with: stale-issue-message: 'This issue has had no activity and is being marked as stale. If you still wish to continue with this issue please comment to reopen it.' stale-pr-message: 'This pull request has had no activity and is being marked as stale. If you still wish to continue with this pull request please comment to reopen it.' diff --git a/.github/workflows/target-master.yml b/.github/workflows/target-master.yml index 02bfbbe5be..2d5ee1e1f4 100644 --- a/.github/workflows/target-master.yml +++ b/.github/workflows/target-master.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit diff --git a/.github/workflows/test-docs-examples.yml b/.github/workflows/test-docs-examples.yml index 816573316a..423defd86f 100644 --- a/.github/workflows/test-docs-examples.yml +++ b/.github/workflows/test-docs-examples.yml @@ -25,12 +25,12 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 # v2.7.1 with: egress-policy: audit - name: Checkout D++ - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 with: submodules: recursive diff --git a/.vscode/settings.json b/.vscode/settings.json index 90c8db6d31..16f12674a0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -81,6 +81,8 @@ "semaphore": "cpp", "stop_token": "cpp", "charconv": "cpp", - "any": "cpp" + "any": "cpp", + "ranges": "cpp", + "span": "cpp" } } \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index fe4f331bbb..53ab7031f3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:focal@sha256:f5c3e53367f142fab0b49908550bdcdc4fb619d2f61ec1dfa60d26e0d59ac9e7 +FROM ubuntu:focal@sha256:874aca52f79ae5f8258faff03e10ce99ae836f6e7d2df6ecd3da5c1cad3a912b ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install --no-install-recommends -y libssl-dev zlib1g-dev libsodium-dev libopus-dev cmake pkg-config g++ gcc git make && apt-get clean && rm -rf /var/lib/apt/lists/* diff --git a/README.md b/README.md index b43c633d6e..62cb25d904 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/brainboxdotcc/DPP/badge)](https://securityscorecards.dev/viewer/?uri=github.com/brainboxdotcc/DPP) [![AUR version](https://img.shields.io/aur/version/dpp)](https://aur.archlinux.org/packages/dpp) ![vcpkg version](https://img.shields.io/vcpkg/v/dpp) +[![Homebrew version](https://img.shields.io/homebrew/v/libdpp)](https://formulae.brew.sh/formula/libdpp#default) [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md) diff --git a/buildtools/classes/Generator/CoroGenerator.php b/buildtools/classes/Generator/CoroGenerator.php index 70cb5126a8..1a68809a70 100644 --- a/buildtools/classes/Generator/CoroGenerator.php +++ b/buildtools/classes/Generator/CoroGenerator.php @@ -116,7 +116,7 @@ public function getCommentArray(): array */ public function saveHeader(string $content): void { - $content .= "[[nodiscard]] async co_request(const std::string &url, http_method method, const std::string &postdata = \"\", const std::string &mimetype = \"text/plain\", const std::multimap &headers = {});\n\n"; + $content .= "[[nodiscard]] async co_request(const std::string &url, http_method method, const std::string &postdata = \"\", const std::string &mimetype = \"text/plain\", const std::multimap &headers = {}, const std::string &protocol = \"1.1\");\n\n"; file_put_contents('include/dpp/cluster_coro_calls.h', $content); } @@ -125,7 +125,7 @@ public function saveHeader(string $content): void */ public function saveCpp(string $cppcontent): void { - $cppcontent .= "dpp::async dpp::cluster::co_request(const std::string &url, http_method method, const std::string &postdata, const std::string &mimetype, const std::multimap &headers) {\n\treturn async{ [&, this] (C &&cc) { return this->request(url, method, std::forward(cc), postdata, mimetype, headers); }};\n} + $cppcontent .= "dpp::async dpp::cluster::co_request(const std::string &url, http_method method, const std::string &postdata, const std::string &mimetype, const std::multimap &headers, const std::string &protocol) {\n\treturn async{ [&, this] (C &&cc) { return this->request(url, method, std::forward(cc), postdata, mimetype, headers, protocol); }};\n} #endif "; diff --git a/buildtools/make_struct.php b/buildtools/make_struct.php index 3f43a1e105..32a052b202 100644 --- a/buildtools/make_struct.php +++ b/buildtools/make_struct.php @@ -40,6 +40,8 @@ 'channel_typing' => 'confirmation', 'message_get_reactions' => 'emoji_map', 'thread_create_in_forum' => 'thread', + 'threads_get_private_archived' => 'thread_map', + 'threads_get_public_archived' => 'thread_map', 'threads_get_active' => 'active_threads', 'user_get_cached' => 'user_identified', 'application_role_connection_get' => 'application_role_connection', diff --git a/docpages/03_installing.md b/docpages/03_installing.md index 2457879148..2ce66f39ee 100644 --- a/docpages/03_installing.md +++ b/docpages/03_installing.md @@ -7,7 +7,6 @@ There are many ways to install D++, either from a package manager, or from sourc * \subpage install-vcpkg * \subpage install-arch-aur * \subpage install-windows-vs-zip -* \subpage install-windows-clion-vcpkg * \subpage install-xmake * \subpage install-brew * \subpage install-conan diff --git a/docpages/04_building_a_bot.md b/docpages/04_building_a_bot.md index ba55d6e50a..41cfe43247 100644 --- a/docpages/04_building_a_bot.md +++ b/docpages/04_building_a_bot.md @@ -7,6 +7,7 @@ Click on a link below for a guide specifically for your system: * \subpage creating-a-bot-application * \subpage build-a-discord-bot-windows-visual-studio * \subpage build-a-discord-bot-windows-wsl +* \subpage install-windows-clion-vcpkg * \subpage build-a-discord-bot-linux-clion * \subpage buildcmake * \subpage buildmeson diff --git a/docpages/example_code/autocomplete.cpp b/docpages/example_code/autocomplete.cpp index da29127e30..380cb45785 100644 --- a/docpages/example_code/autocomplete.cpp +++ b/docpages/example_code/autocomplete.cpp @@ -50,10 +50,10 @@ int main() */ std::string uservalue = std::get(opt.value); bot.interaction_response_create(event.command.id, event.command.token, dpp::interaction_response(dpp::ir_autocomplete_reply) - .add_autocomplete_choice(dpp::command_option_choice("squids", "lots of squids")) - .add_autocomplete_choice(dpp::command_option_choice("cats", "a few cats")) - .add_autocomplete_choice(dpp::command_option_choice("dogs", "bucket of dogs")) - .add_autocomplete_choice(dpp::command_option_choice("elephants", "bottle of elephants")) + .add_autocomplete_choice(dpp::command_option_choice("squids", std::string("lots of squids"))) + .add_autocomplete_choice(dpp::command_option_choice("cats", std::string("a few cats"))) + .add_autocomplete_choice(dpp::command_option_choice("dogs", std::string("bucket of dogs"))) + .add_autocomplete_choice(dpp::command_option_choice("elephants", std::string("bottle of elephants"))) ); bot.log(dpp::ll_debug, "Autocomplete " + opt.name + " with value '" + uservalue + "' in field " + event.name); break; diff --git a/docpages/example_code/editing_messages.cpp b/docpages/example_code/editing_messages1.cpp similarity index 57% rename from docpages/example_code/editing_messages.cpp rename to docpages/example_code/editing_messages1.cpp index b1c5bd9e50..04e7640ba7 100644 --- a/docpages/example_code/editing_messages.cpp +++ b/docpages/example_code/editing_messages1.cpp @@ -1,8 +1,8 @@ #include int main() { - dpp::cluster bot("token", dpp::i_default_intents | dpp::i_message_content); /* the second argument is a bitmask of intents - i_message_content is needed to get messages */ + dpp::cluster bot("Token", dpp::i_default_intents | dpp::i_message_content); bot.on_log(dpp::utility::cout_logger()); @@ -13,9 +13,8 @@ int main() { } else if (event.command.get_command_name() == "msg-edit") { const auto content = std::get(event.get_parameter("content")); - /* get message to edit it after */ + /* get the message to edit it after. here string will automatically be converted to snowflake */ const dpp::snowflake msg_id = std::get(event.get_parameter("msg-id")); - /* here string will automatically be converted to snowflake */ bot.message_get(msg_id, event.command.channel_id, [&bot, content, event](const dpp::confirmation_callback_t& callback) { if (callback.is_error()) { @@ -27,51 +26,24 @@ int main() { /* change the message content and edit the message itself */ message.set_content(content); bot.message_edit(message); - event.reply("Message content is now `" + content + "`."); }); - } else if (event.command.get_command_name() == "channel-edit") { - const auto name = std::get(event.get_parameter("name")); - - /* get the channel to edit it after */ - const auto channel_id = std::get(event.get_parameter("channel")); - - bot.channel_get(channel_id, [&bot, name, event](const dpp::confirmation_callback_t& callback) { - if (callback.is_error()) { - event.reply("error"); - return; - } - auto channel = callback.get(); - - /* change the channel name and edit the channel itself */ - channel.set_name(name); - bot.channel_edit(channel); - - event.reply("Channel name is now `" + name + "`."); - }); } }); bot.on_ready([&bot](const dpp::ready_t& event) { - if (dpp::run_once ()) { dpp::slashcommand msg_edit("msg-edit", "Edit a message sent by the bot", bot.me.id); msg_edit.add_option(dpp::command_option(dpp::co_string, "msg-id", "ID of the message to edit", true)); /* true for required option */ msg_edit.add_option(dpp::command_option(dpp::co_string, "content", "New content for the message", true)); /* same here */ - dpp::slashcommand channel_edit("channel-edit", "Edit the name of channel specified", bot.me.id); - - channel_edit.add_option(dpp::command_option(dpp::co_channel, "channel", "Channel to edit", true)); - channel_edit.add_option(dpp::command_option(dpp::co_string, "name", "New name for the channel", true)); - dpp::slashcommand msg_send("msg-send", "Send my message", bot.me.id); - bot.global_bulk_command_create({ msg_edit, channel_edit, msg_send }); + bot.global_bulk_command_create({ msg_edit, msg_send }); } }); bot.start(dpp::st_wait); - return 0; } diff --git a/docpages/example_code/editing_messages2.cpp b/docpages/example_code/editing_messages2.cpp new file mode 100644 index 0000000000..a3595d8e81 --- /dev/null +++ b/docpages/example_code/editing_messages2.cpp @@ -0,0 +1,45 @@ +#include + +int main() { + /* the second argument is a bitmask of intents - i_message_content is needed to get messages */ + dpp::cluster bot("Token", dpp::i_default_intents | dpp::i_message_content); + + bot.on_log(dpp::utility::cout_logger()); + + /* The event is fired when someone issues your commands */ + bot.on_slashcommand([&bot](const dpp::slashcommand_t& event) { + if (event.command.get_command_name() == "channel-edit") { + const auto name = std::get(event.get_parameter("name")); + + /* get the channel to edit it after */ + const auto channel_id = std::get(event.get_parameter("channel")); + bot.channel_get(channel_id, [&bot, name, event](const dpp::confirmation_callback_t& callback) { + if (callback.is_error()) { + event.reply("error"); + return; + } + auto channel = callback.get(); + + /* change the channel name and edit the channel itself */ + channel.set_name(name); + bot.channel_edit(channel); + event.reply("Channel name is now `" + name + "`."); + }); + } + }); + + bot.on_ready([&bot](const dpp::ready_t& event) { + + if (dpp::run_once ()) { + dpp::slashcommand channel_edit("channel-edit", "Edit the name of channel specified", bot.me.id); + + channel_edit.add_option(dpp::command_option(dpp::co_channel, "channel", "Channel to edit", true)); + channel_edit.add_option(dpp::command_option(dpp::co_string, "name", "New name for the channel", true)); + + bot.global_command_create(channel_edit); + } + }); + + bot.start(dpp::st_wait); + return 0; +} diff --git a/docpages/example_code/editing_messages3.cpp b/docpages/example_code/editing_messages3.cpp new file mode 100644 index 0000000000..5d598dfbe8 --- /dev/null +++ b/docpages/example_code/editing_messages3.cpp @@ -0,0 +1,59 @@ +#include + +int main() { + /* the second argument is a bitmask of intents - i_message_content is needed to get messages */ + dpp::cluster bot("Token", dpp::i_default_intents | dpp::i_message_content); + + bot.on_log(dpp::utility::cout_logger()); + + /* The event is fired when someone issues your commands */ + bot.on_slashcommand([&bot](const dpp::slashcommand_t& event) { + if (event.command.get_command_name() == "embed-send") { + dpp::embed embed = dpp::embed() + .set_color(dpp::colors::sti_blue) + .set_title("like and subscribe") + .set_url("https://dpp.dev/") + .set_author("Some author", "https://dpp.dev/", "https://dpp.dev/DPP-Logo.png") + .set_description("Creator is "); + event.reply(embed); + } else if (event.command.get_command_name() == "embed-edit") { + const auto description = std::get(event.get_parameter("desc")); + + /* get the message to edit its embed after. here string will automatically be converted to snowflake */ + const dpp::snowflake msg_id = std::get(event.get_parameter("msg-id")); + + bot.message_get(msg_id, event.command.channel_id, [&bot, description, event](const dpp::confirmation_callback_t& callback) { + if (callback.is_error()) { + event.reply("error"); + return; + } + auto message = callback.get(); + auto& embeds = message.embeds; + + /* change the embed description and edit the message itself. + * since we're using a reference, what changes in embeds changes in message.embeds + */ + embeds[0].set_description(description); + + bot.message_edit(message); + event.reply("Embed description is now `" + description + "`."); + }); + } + }); + + bot.on_ready([&bot](const dpp::ready_t& event) { + if (dpp::run_once ()) { + dpp::slashcommand embed_send("embed-send", "Send my embed", bot.me.id); + + dpp::slashcommand embed_edit("embed-edit", "Edit an embed sent by the bot", bot.me.id); + + embed_edit.add_option(dpp::command_option(dpp::co_string, "msg-id", "ID of the embed to edit", true)); /* true for required option */ + embed_edit.add_option(dpp::command_option(dpp::co_string, "desc", "New description for the embed", true)); /* same here */ + + bot.global_bulk_command_create({ embed_send, embed_edit }); + } + }); + + bot.start(dpp::st_wait); + return 0; +} diff --git a/docpages/example_code/thinking.cpp b/docpages/example_code/thinking.cpp new file mode 100644 index 0000000000..dce146e619 --- /dev/null +++ b/docpages/example_code/thinking.cpp @@ -0,0 +1,36 @@ +#include + +int main() { + dpp::cluster bot("token"); + + bot.on_log(dpp::utility::cout_logger()); + + /* The event is fired when someone issues your commands */ + bot.on_slashcommand([&bot](const dpp::slashcommand_t& event) { + /* Check which command they ran */ + if (event.command.get_command_name() == "thinking") { + /* + * true for Ephemeral. + * You can set this to false if you want everyone to see the thinking response. + */ + event.thinking(true, [event](const dpp::confirmation_callback_t& callback) { + event.edit_original_response(dpp::message("thonk")); + }); + + } + }); + + bot.on_ready([&bot](const dpp::ready_t& event) { + if (dpp::run_once()) { + /* Create a new global command on ready event */ + dpp::slashcommand newcommand("thinking", "Thinking example...", bot.me.id); + + /* Register the command */ + bot.global_command_create(newcommand); + } + }); + + bot.start(dpp::st_wait); + + return 0; +} diff --git a/docpages/example_code/timers_example1.cpp b/docpages/example_code/timers_example1.cpp new file mode 100644 index 0000000000..b3777f11cc --- /dev/null +++ b/docpages/example_code/timers_example1.cpp @@ -0,0 +1,21 @@ +#include + +int main() { + /* Create the bot */ + dpp::cluster bot("token"); + + bot.on_log(dpp::utility::cout_logger()); + + bot.on_ready([&bot](const dpp::ready_t& event) { + /* Create a timer when the bot starts. */ + bot.start_timer([&bot](const dpp::timer& timer){ + /* Create a timer when the bot starts. */ + bot.request("https://dpp.dev/DPP-Logo.png", dpp::m_get, [&bot](const dpp::http_request_completion_t& callback) { + /* Create a message to our desired channel, with the D++ logo. */ + bot.message_create(dpp::message(1140010849432522843, "").add_file("image.png", callback.body)); + }); + }, 10); /* Do it every 10 seconds. Timers also start with this delay. */ + }); + + bot.start(dpp::st_wait); +} diff --git a/docpages/example_code/timers_example2.cpp b/docpages/example_code/timers_example2.cpp new file mode 100644 index 0000000000..07b02ed267 --- /dev/null +++ b/docpages/example_code/timers_example2.cpp @@ -0,0 +1,23 @@ +#include + +int main() { + /* Create the bot */ + dpp::cluster bot("token"); + + bot.on_log(dpp::utility::cout_logger()); + + bot.on_ready([&bot](const dpp::ready_t& event) { + /* Create a timer when the bot starts. */ + bot.start_timer([&bot](const dpp::timer& timer) { + /* Create a timer when the bot starts. */ + bot.request("https://dpp.dev/DPP-Logo.png", dpp::m_get, [&bot, timer](const dpp::http_request_completion_t& callback) { + /* Create a message to our desired channel, with the D++ logo. */ + bot.message_create(dpp::message(1140010849432522843, "").add_file("image.png", callback.body)); + /* Stop the timer by passing the timer handle in. */ + bot.stop_timer(timer); + }); + }, 10); /* Do it every 10 seconds. Timers also start with this delay. */ + }); + + bot.start(dpp::st_wait); +} diff --git a/docpages/example_code/timers_example3.cpp b/docpages/example_code/timers_example3.cpp new file mode 100644 index 0000000000..dd8f98abdb --- /dev/null +++ b/docpages/example_code/timers_example3.cpp @@ -0,0 +1,69 @@ +#include + +std::map user_timers{}; + +int main() { + /* Create the bot */ + dpp::cluster bot("token"); + + bot.on_log(dpp::utility::cout_logger()); + + /* The event is fired when someone issues your commands */ + bot.on_slashcommand([&bot](const dpp::slashcommand_t& event) { + /* Check which command they ran */ + if (event.command.get_command_name() == "start_timer") { + /* Does user_timers contain the user id? */ + if (user_timers.find(event.command.usr.id) != user_timers.end()) { + event.reply("You've already got an in-progress timer!"); + return; + } + + /* Create a copy of the channel_id to copy in to the timer lambda. */ + dpp::snowflake channel_id = event.command.channel_id; + + /* Start the timer and save it to a local variable. */ + dpp::timer timer = bot.start_timer([&bot, channel_id](const dpp::timer& timer) { + bot.message_create(dpp::message(channel_id, "This is a timed message! Use /stop_timer to stop this!")); + }, 10); + + /* + * Add the timer to user_timers. + * As dpp::timer is just size_t (essentially the timer's ID), it's perfectly safe to copy it in. + */ + user_timers.emplace(event.command.usr.id, timer); + + event.reply("Started a timer every 10 seconds!"); + } + + if(event.command.get_command_name() == "stop_timer") { + /* Is user_timers empty? */ + if (user_timers.empty()) { + event.reply("There are no timers currently in-progress!"); + return; + } else if (user_timers.find(event.command.usr.id) == user_timers.end()) { /* Does user_timers not contain the user id? */ + event.reply("You've don't currently have a timer in-progress!"); + return; + } + + /* Stop the timer. */ + bot.stop_timer(user_timers[event.command.usr.id]); + /* Remove the timer from user_timers. */ + user_timers.erase(event.command.usr.id); + + event.reply("Stopped your timer!"); + } + }); + + bot.on_ready([&bot](const dpp::ready_t& event) { + if (dpp::run_once()) { + /* Create a new global command on ready event. */ + dpp::slashcommand start_timer("start_timer", "Start a 10 second timer!", bot.me.id); + dpp::slashcommand stop_timer("stop_timer", "Stop your 10 second timer!", bot.me.id); + + /* Register the commands. */ + bot.global_bulk_command_create({ start_timer, stop_timer }); + } + }); + + bot.start(dpp::st_wait); +} diff --git a/docpages/example_programs/interactions_and_components.md b/docpages/example_programs/interactions_and_components.md index 0112f192bb..44f2ce7e7b 100644 --- a/docpages/example_programs/interactions_and_components.md +++ b/docpages/example_programs/interactions_and_components.md @@ -8,3 +8,4 @@ Interactions are a unified way provided by Discord to handle \ref slashcommands * \subpage components-menu * \subpage modal-dialog-interactions * \subpage context-menu +* \subpage thinking diff --git a/docpages/example_programs/interactions_and_components/thinking.md b/docpages/example_programs/interactions_and_components/thinking.md new file mode 100644 index 0000000000..87bb2a09aa --- /dev/null +++ b/docpages/example_programs/interactions_and_components/thinking.md @@ -0,0 +1,9 @@ +\page thinking Thinking + +A common mistake people do is use `event.thinking` with `event.reply`, however, they always run into the `Interaction has already been acknowledged.` error! The reason for this is because `event.thinking` is a response to the interaction, meaning you have acknowledged it! You should use dpp::interaction_create_t::edit_original_response instead. + +Below is an example, showing how you should properly use the thinking method. + +\include{cpp} thinking.cpp + +This will make the bot think briefly, then change the response to "thonk"! diff --git a/docpages/example_programs/misc.md b/docpages/example_programs/misc.md index 9e1151fd46..f8a1cc3578 100644 --- a/docpages/example_programs/misc.md +++ b/docpages/example_programs/misc.md @@ -12,3 +12,4 @@ This section lists examples that do not fit neatly into any of the categories ab * \subpage checking-member-permissions * \subpage setting_status * \subpage using-emojis +* \subpage using_timers diff --git a/docpages/example_programs/misc/setting_status.md b/docpages/example_programs/misc/setting_status.md index 088d7a1dfc..16796887b5 100644 --- a/docpages/example_programs/misc/setting_status.md +++ b/docpages/example_programs/misc/setting_status.md @@ -17,6 +17,8 @@ You can also play around with dpp::at_game, changing it to something like dpp::a Now, let's cover setting the bot status to say `Playing with x guilds!` every two minutes. +\note This example uses timers to update the status every 2 minutes. If you aren't familiar with D++'s own timers, please read \ref using_timers "this page on timers" before you continue. + \include{cpp} setting_status2.cpp If you followed that well, your bot should now say this on members list! diff --git a/docpages/example_programs/misc/using_timers.md b/docpages/example_programs/misc/using_timers.md new file mode 100644 index 0000000000..f561347a97 --- /dev/null +++ b/docpages/example_programs/misc/using_timers.md @@ -0,0 +1,27 @@ +\page using_timers Using Timers + +Timers are a great way to run something every x seconds, from setting the bot's status, to maybe even doing a http request! Luckily, D++ makes this incredibly easy by providing an easy-to-use timer system! This tutorial will show you a couple examples on how to use timers! + +First, we'll cover sending the D++ logo every 10 seconds! + +\include{cpp} timers_example1.cpp + +If all went well, you should get the D++ logo sent every 10 seconds to your desired channel! + +\image html timers_example1.png + +Now, let's make the same timer a one-shot timer, meaning it will only run once! + +\include{cpp} timers_example2.cpp + +Great! Now we've learnt the basics of timers and how to stop them! + +To finish off, let's make a timer that you can start and stop with commands. This example will store the timer in a map where the user is the owner of the timer! + +\include{cpp} timers_example3.cpp + +If that went well, it should work something like below! + +\image html timers_example3.png + +Great, now you've learnt how to store timers to manage at a later point! \ No newline at end of file diff --git a/docpages/example_programs/the_basics/editing-channels-and-messages.md b/docpages/example_programs/the_basics/editing-channels-and-messages.md index a94ab7ccd8..af4b733d1e 100644 --- a/docpages/example_programs/the_basics/editing-channels-and-messages.md +++ b/docpages/example_programs/the_basics/editing-channels-and-messages.md @@ -1,15 +1,46 @@ -\page editing-channels-and-messages Editing Channels and Messages - -Sometimes we need to update an object, such as message or channel. At first, it might seem confusing, but it's actually really simple! You just need to use an object with identical properties you don't need to update. NOTE: your bot can't edit messages sent by others. - -\note This example uses callback functions. To see more information about them, visit \ref callback-functions. - -\include{cpp} editing_messages.cpp - -Before editing: - -\image html stuff_edit1.png - -After editing: - -\image html stuff_edit2.png \ No newline at end of file +\page editing-channels-and-messages Editing Channels and Messages + +Sometimes we need to update an object, such as a message (whether it's plain text or an embed) or a channel. At first, it might seem confusing, but it's actually really simple! You need an object with all the properties being identical to the existing one. Say you're editing a message. You need to have an object with its ID the same as the one in Discord. Then you replace what you need, such as its content. + +\note This example uses callback functions and embeds. To see more information about them, visit \ref callback-functions and + +## Editing messages +Here we send a message and edit it after. To do so, we first reply to the command `msg-send` with some text, "This is a message" in our case. As described above, on the next step the message object is taken and the text is replaced with whatever the user desires. + +\include{cpp} editing_messages1.cpp + +\note Your bot can't edit messages sent by others!\ref embed-message. + +Before editing the message: + +\image html stuff_edit1.png + +After editing the message: + +\image html stuff_edit2.png + +## Editing channels +Now we'll want to edit an existing channel - its name in this case. This works similarly to how messages are edited. + +\include{cpp} editing_messages2.cpp + +Before editing the channel: + +\image html stuff_edit3.png + +After editing the channel: + +\image html stuff_edit4.png + +## Editing embeds +Now let's send an embed and edit it. If a message has one `content` field, it can have a few `embed` fields, up to 10 to be precise. So we first get the embed we want and edit and change its description. + +\include{cpp} editing_messages3.cpp + +Before editing the embed: + +\image html stuff_edit5.png + +Finally, after editing the embed: + +\image html stuff_edit6.png diff --git a/docpages/images/clionvstoolchain.png b/docpages/images/clionvstoolchain.png new file mode 100644 index 0000000000..bd55db95ba Binary files /dev/null and b/docpages/images/clionvstoolchain.png differ diff --git a/docpages/images/clionvstoolchain2.png b/docpages/images/clionvstoolchain2.png new file mode 100644 index 0000000000..d159f11665 Binary files /dev/null and b/docpages/images/clionvstoolchain2.png differ diff --git a/docpages/images/stuff_edit1.png b/docpages/images/stuff_edit1.png index bf64878610..745891a037 100644 Binary files a/docpages/images/stuff_edit1.png and b/docpages/images/stuff_edit1.png differ diff --git a/docpages/images/stuff_edit2.png b/docpages/images/stuff_edit2.png index cf77dd5fd8..4571433f58 100644 Binary files a/docpages/images/stuff_edit2.png and b/docpages/images/stuff_edit2.png differ diff --git a/docpages/images/stuff_edit3.png b/docpages/images/stuff_edit3.png new file mode 100644 index 0000000000..7ce5dd68eb Binary files /dev/null and b/docpages/images/stuff_edit3.png differ diff --git a/docpages/images/stuff_edit4.png b/docpages/images/stuff_edit4.png new file mode 100644 index 0000000000..a4166a18ad Binary files /dev/null and b/docpages/images/stuff_edit4.png differ diff --git a/docpages/images/stuff_edit5.png b/docpages/images/stuff_edit5.png new file mode 100644 index 0000000000..48579eed9d Binary files /dev/null and b/docpages/images/stuff_edit5.png differ diff --git a/docpages/images/stuff_edit6.png b/docpages/images/stuff_edit6.png new file mode 100644 index 0000000000..a61be95c25 Binary files /dev/null and b/docpages/images/stuff_edit6.png differ diff --git a/docpages/images/timers_example1.png b/docpages/images/timers_example1.png new file mode 100644 index 0000000000..644303ceab Binary files /dev/null and b/docpages/images/timers_example1.png differ diff --git a/docpages/images/timers_example3.png b/docpages/images/timers_example3.png new file mode 100644 index 0000000000..0d7089dce3 Binary files /dev/null and b/docpages/images/timers_example3.png differ diff --git a/docpages/install/install-vcpkg.md b/docpages/install/install-vcpkg.md index 80717d578e..d672253c19 100644 --- a/docpages/install/install-vcpkg.md +++ b/docpages/install/install-vcpkg.md @@ -14,12 +14,12 @@ To install D++ on a system with VCPKG: ```cmd c:\vcpkg>vcpkg list dpp -dpp:x64-windows 10.0.24 D++ Extremely Lightweight C++ Discord Library. +dpp:x64-windows 10.0.29 D++ Extremely Lightweight C++ Discord Library. ``` -- You may now use the library within a `CMake` based project by adding instructions such as these to your `CMakeLists.txt`: +- You may now use the library within a `CMake` based project by adding the following instructions to your `CMakeLists.txt`: ```cmake find_package(dpp CONFIG REQUIRED) -target_link_libraries(your_target_name PRIVATE dpp::dpp) +target_link_libraries(${PROJECT_NAME} PRIVATE dpp::dpp) ``` diff --git a/docpages/install/install-windows-clion-vcpkg.md b/docpages/install/install-windows-clion-vcpkg.md deleted file mode 100644 index 1a1ea9a94f..0000000000 --- a/docpages/install/install-windows-clion-vcpkg.md +++ /dev/null @@ -1,38 +0,0 @@ -\page install-windows-clion-vcpkg Installing D++ for CLion via VCPKG (Windows) - -\warning This page is for **Windows only**. If you want to use CLion on Linux, look to use \ref build-a-discord-bot-linux-clion "this page". Like always with windows, we highly recommends you use the [pre-made Visual Studio template](https://github.com/brainboxdotcc/windows-bot-template/) - -To add D++ to a CLion project, you need obtain the library through VCPKG and then configure your CLion project and `CMakeLists.txt`. - -1. Build [VCPKG](https://vcpkg.io/) on your system (skip if you already have it). -2. Run `vcpkg install dpp:x64-windows`. -3. VCPKG will install the library along with the dependencies for you. -4. Now check if dpp has been installed using `vcpkg list dpp`. -```cmd -C:/vcpkg>vcpkg list dpp -dpp:x64-windows 10.0.23 D++ Extremely Lightweight C++ Discord Library. -``` - -5. To use vcpkg in CLion, add the following line to your CMake options in the settings (Located under Settings > Build, Execution, Deployment > CMake) -```cmd --DCMAKE_TOOLCHAIN_FILE=path_to_vcpkg_root_folder/scripts/buildsystems/vcpkg.cmake -``` - For example, if your root folder is `C:/vcpkg/` then the CMake option will be: -```cmd --DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -``` - -6. Now proceed to add the following lines to your `CMakeLists.txt`: -```cmake -find_package(dpp CONFIG REQUIRED) -target_link_libraries(main PRIVATE dpp::dpp) -target_include_directories(main PRIVATE path_to_vcpkg_root_folder/installed/architecture-os/include) -``` - For example, if your VCPKG root is `C:/vcpkg/`, then your `CMakeLists.txt` should look like this: -```cmake -find_package(dpp CONFIG REQUIRED) -target_link_libraries(main PRIVATE dpp::dpp) -target_include_directories(main PRIVATE C:/vcpkg/installed/x64-windows/include) -``` - -7. Congratulations! Now try to build a test program to see if the installation succeeded. If you get stuck somewhere, feel free to ask us on the D++ [discord server](https://discord.gg/dpp). \ No newline at end of file diff --git a/docpages/install/install-windows-vs-zip.md b/docpages/install/install-windows-vs-zip.md index e55254bca6..19d7fc3917 100644 --- a/docpages/install/install-windows-vs-zip.md +++ b/docpages/install/install-windows-vs-zip.md @@ -2,7 +2,7 @@ To add D++ to a Visual Studio project, using **Visual Studio 2019** or **Visual Studio 2022**, follow the steps below. The steps below assume an empty project, if you are adding to an existing project simply skip steps 1 through 4, and step 13. -\note It is possible to skip this entire tutorial, and obtain a [pre-made Visual Studio template containing the latest D++ build (for 32 and 64 bit, release and debug profiles) by clicking here](https://github.com/brainboxdotcc/windows-bot-template/). +\note It is possible to skip this entire tutorial, and obtain a \ref build-a-discord-bot-windows-visual-studio "pre-made Visual Studio template containing the latest D++ build (for 32 and 64 bit, release and debug profiles) by clicking here". 1. Make sure you have Visual Studio 2019 or 2022. Community, Professional or Enterprise work fine. These instructions are not for Visual Studio Code. You can [download the correct version here](https://visualstudio.microsoft.com/downloads/). Note that older versions of Visual Studio will not work as they do not support enough of the C++17 standard. @@ -50,8 +50,11 @@ To add D++ to a Visual Studio project, using **Visual Studio 2019** or **Visual ## Troubleshooting +\note A much easier way of getting a bot running is available \ref build-a-discord-bot-windows-visual-studio "here"! We recommend using that one if this process seems too complex or you run into too many issues. + - If you get an error that a DLL is missing (e.g. `dpp.dll` or `opus.dll`) when starting your bot, then simply copy all DLLs from the **bin** directory of where you extracted the D++ zip file to, into the same directory where your bot's executable is. You only need to do this once. There should be several of these DLL files: `dpp.dll`, `zlib.dll`, `openssl.dll` and `libcrypto.dll` (or similarly named SSL related files), `libsodium.dll` and `opus.dll`. - Please note that if you change the architecture (step 13) you must reconfigure all of steps 7 through 12 again as these configurations are specific to each architecture. This is to allow for different sets of precompiled libs, e.g. for `x86`, `x64`, etc. +- If you get an error that says "Debug/Release mismatch", **you are using the wrong configuration of the D++ dll**. Your bot's executable and the dpp.dll file should both be built in either Release or Debug, you get this error if they are different. We recommend using \ref build-a-discord-bot-windows-visual-studio "the bot template", it has all those things already set up. - You should run your bot from a command prompt. If you do not, and it exits, you will not be able to see any output as the window will immediately close. - If you need to update the `opus.dll` or `zlib.dll` (or any other prebuilt dll) these can be obtained by requesting them to be installed via `vcpkg` then copying the dlls, libraries and headers from the vcpkg `install` folder. - Stuck? You can find us on the [official discord server](https://discord.gg/dpp) - ask away! We don't bite! diff --git a/docpages/make_a_bot/clion_windows.md b/docpages/make_a_bot/clion_windows.md new file mode 100644 index 0000000000..051f3dfb8e --- /dev/null +++ b/docpages/make_a_bot/clion_windows.md @@ -0,0 +1,42 @@ +\page install-windows-clion-vcpkg Building a Discord Bot using CLion & VCPKG (Windows) + +\warning This page is for **Windows only**. If you want to use CLion on Linux, look to use \ref build-a-discord-bot-linux-clion "this page". Like always with windows, we highly recommends you use the [pre-made Visual Studio template](https://github.com/brainboxdotcc/windows-bot-template/). This tutorial also assumes you have installed D++ via VCPKG already. If you haven't, look at \ref install-vcpkg "this page". + +### Changing Toolchains + +\note If you have already configured your toolchain to use anything **but** MinGW64, then you can skip to the next section. Otherwise, it is **critical** that you follow along with this section. It should also be noted that you **need** Visual Studio for this. + +Head on over to `File > Settings` (Ctrl+Alt+S), then navigate to `Build, Execution, Deployment > Toolchains`. + +If there is a Visual Studio toolchain there, drag it to the top of the list. This will make the Visual Studio toolchain the default toolchain. + +\image html clionvstoolchain.png + +If you don't have the Visual Studio toolchain, you can hit the plus symbol above the list of toolchains and add a toolchain. This is also how you can add WSL as a toolchain! + +\image html clionvstoolchain2.png + +From there, you need to drag it to the top (if it didn't already add at the top) to ensure it's the default toolchain. + +### Using VCPKG with CLion + +To use vcpkg in CLion, add the following line to your CMake options in the settings (Located under `Settings > Build, Execution, Deployment > CMake`) +```cmd +-DCMAKE_TOOLCHAIN_FILE=path_to_vcpkg_root_folder/scripts/buildsystems/vcpkg.cmake +``` +For example, if your root folder is `C:/vcpkg/` then the CMake option will be: +```cmd +-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake +``` + +### Making a test application. + +Open your `main.cpp` file and then copy and paste the following \ref firstbot "example program" in. Then, set your bot token (see \ref creating-a-bot-application). Here's how your `main.cpp` file should look: + +\include{cpp} firstbot.cpp + +If everything went well, you should now have a functioning bot! If not, feel free to ask us on the D++ [discord server](https://discord.gg/dpp). + +### Troubleshooting + +If you see a message like `Detecting C compiler ABI info - failed` or something along the lines of `"cl.exe" is not able to compile a simple test program`, then try to reinstall `Windows Build Tools` along with the `Windows SDK` from the Visual Studio Installer. diff --git a/docpages/make_a_bot/windows_vs.md b/docpages/make_a_bot/windows_vs.md index 6726ab7cec..9755efde9b 100644 --- a/docpages/make_a_bot/windows_vs.md +++ b/docpages/make_a_bot/windows_vs.md @@ -22,10 +22,19 @@ If you prefer a video tutorial, you can watch the video below! Otherwise, scroll \image html vsproj_2.png 5. Click "Local Windows debugger" to compile and run your bot! \image html vsproj_3.png -6. Observe the build output. There may be warnings, but so long as the build output ends with "1 succeeded" then the process has worked. You may now run your bot! +6. Observe the build output, so long as the build output ends with "1 succeeded" then the process has worked. You may now run your bot! \image html vsproj_14.png ## Troubleshooting +- If you get an error that looks like this: \code{.unparsed} 1>MyBot.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: class dpp::async +__cdecl dpp::interaction_create_t::co_reply(class std::basic_string,class std::allocator > const &)const +" (__imp_?co_reply@interaction_create_t@dpp@@QEBA?AV?$async@Uconfirmation_callback_t@dpp@@@2@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) +referenced in function "public: class dpp::task __cdecl `int __cdecl main(void)'::`2'::$_ResumeCoro$1::operator()(struct dpp::slashcommand_t const &)const " +(??R$_ResumeCoro$1@?1??main@@YAHXZ@QEBA?AV?$task@X@dpp@@AEBUslashcommand_t@3@@Z) +1>...\windows-bot-template-main\x64\Debug\MyBot.exe : fatal error LNK1120: 1 unresolved externals +1>Done building project "MyBot.vcxproj" -- FAILED. +\endcode Make sure your don't have another version of the library installed through vcpkg. The template uses a slightly different version of D++ that has coroutines, while the vcpkg version does not, and the latter overwrites it! Uninstalling the library through vcpkg should fix this issue. - If you get an error that a DLL is missing (e.g. `dpp.dll` or `opus.dll`) when starting your bot, then simply copy all DLLs from the **bin** directory of where you cloned the D++ repository to, into the same directory where your bot's executable is. You only need to do this once. There should be several of these DLL files: `dpp.dll`, `zlib.dll`, `openssl.dll` and `libcrypto.dll` (or similarly named SSL related files), `libsodium.dll` and `opus.dll`. Note the template project does this for you, so you should never encounter this issue. +- If you get an error that says "Debug/Release mismatch", **you are using the wrong configuration of the D++ dll**. Your bot's executable and the dpp.dll file should both be built in the same configuration (Release or Debug), you get this error if they are different. **This also means you altered the template in a significant way,** we recommend you undo your modifications or reinstall the template. - Stuck? You can find us on the [official Discord server](https://discord.gg/dpp) - ask away! We don't bite! diff --git a/docpages/make_a_bot/xcode.md b/docpages/make_a_bot/xcode.md index 7247e38b8d..519d2a07d5 100644 --- a/docpages/make_a_bot/xcode.md +++ b/docpages/make_a_bot/xcode.md @@ -4,8 +4,6 @@ To create a bot with Xcode, follow the steps below to create a *working skeleton project you can build upon*. -\note Since the brew package for D++ only supports C++17, you can't use coro with this project. If you wish to use coro, you need to \ref buildosx "build from source". If you do build from source, look to replace the include and library paths in this project to `/usr/local/include` and `/usr/local/lib`. - 1. Make sure you have Xcode downloaded, along with the developer command tools (for AppleClang). 2. Clone the [template project](https://github.com/Jaskowicz1/mac-bot-template/). **Make sure you download the entire project and not just the .cpp file.** 3. Open Xcode, hit "Open Existing Project" or "File"->"Open", navigate to the template folder and open the .xcodeproj file. You can also double click the file in Finder. diff --git a/doxygen-awesome-css b/doxygen-awesome-css index df88fe4fdd..5b27b3a747 160000 --- a/doxygen-awesome-css +++ b/doxygen-awesome-css @@ -1 +1 @@ -Subproject commit df88fe4fdd97714fadfd3ef17de0b4401f804052 +Subproject commit 5b27b3a747ca1e559fa54149762cca0bad6036fb diff --git a/include/dpp/cache.h b/include/dpp/cache.h index c43242b444..cdfa3788f8 100644 --- a/include/dpp/cache.h +++ b/include/dpp/cache.h @@ -250,7 +250,7 @@ template class cache { */ size_t bytes() { std::shared_lock l(cache_mutex); - return sizeof(this) + (cache_map->bucket_count() * sizeof(size_t)); + return sizeof(*this) + (cache_map->bucket_count() * sizeof(size_t)); } }; diff --git a/include/dpp/cluster.h b/include/dpp/cluster.h index a3a632e95e..ec4044964b 100644 --- a/include/dpp/cluster.h +++ b/include/dpp/cluster.h @@ -325,7 +325,7 @@ class DPP_EXPORT cluster { * * @return cluster& Reference to self for chaining. */ - cluster& set_default_gateway(std::string& default_gateway); + cluster& set_default_gateway(const std::string& default_gateway); /** * @brief Log a message to whatever log the user is using. @@ -992,6 +992,24 @@ class DPP_EXPORT cluster { */ event_router_t on_message_create; + /** + * @brief Called when a vote is added to a message poll. + * + * @see https://discord.com/developers/docs/topics/gateway-events#message-poll-vote-add + * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. + * The function signature for this event takes a single `const` reference of type message_poll_vote_add_t&, and returns void. + */ + event_router_t on_message_poll_vote_add; + + /** + * @brief Called when a vote is removed from a message poll. + * + * @see https://discord.com/developers/docs/topics/gateway-events#message-poll-vote-remove + * @note Use operator() to attach a lambda to this event, and the detach method to detach the listener using the returned ID. + * The function signature for this event takes a single `const` reference of type message_poll_vote_remove_t&, and returns void. + */ + event_router_t on_message_poll_vote_remove; + /** * @brief Called when a guild audit log entry is created. * @@ -1427,7 +1445,7 @@ class DPP_EXPORT cluster { * @param callback Function to call when the API call completes. * On success the callback will contain a dpp::confirmation object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). */ - void interaction_followup_create(const std::string &token, const message &m, command_completion_event_t callback); + void interaction_followup_create(const std::string &token, const message &m, command_completion_event_t callback = utility::log_error()); /** * @brief Edit original followup message to a slash command @@ -1769,6 +1787,15 @@ class DPP_EXPORT cluster { */ void message_edit(const struct message &m, command_completion_event_t callback = utility::log_error()); + /** + * @brief Edit the flags of a message on a channel. The callback function is called when the message has been edited + * + * @param m Message to edit the flags of + * @param callback Function to call when the API call completes. + * On success the callback will contain a dpp::message object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). + */ + void message_edit_flags(const struct message &m, command_completion_event_t callback = utility::log_error()); + /** * @brief Add a reaction to a message. The reaction string must be either an `emojiname:id` or a unicode character. * @@ -1939,6 +1966,54 @@ class DPP_EXPORT cluster { */ void message_delete_bulk(const std::vector &message_ids, snowflake channel_id, command_completion_event_t callback = utility::log_error()); + /** + * @brief Get a list of users that voted for this specific answer. + * + * @param m Message that contains the poll to retrieve the answers from + * @param answer_id ID of the answer to retrieve votes from (see poll_answer::answer_id) + * @param after Users after this ID should be retrieved if this is set to non-zero + * @param limit This number of users maximum should be returned, up to 100 + * @param callback Function to call when the API call completes. + * @see https://discord.com/developers/docs/resources/poll#get-answer-voters + * On success the callback will contain a dpp::user_map object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). + */ + void poll_get_answer_voters(const message& m, uint32_t answer_id, snowflake after, uint64_t limit, command_completion_event_t callback = utility::log_error()); + + /** + * @brief Get a list of users that voted for this specific answer. + * + * @param message_id ID of the message with the poll to retrieve the answers from + * @param channel_id ID of the channel with the poll to retrieve the answers from + * @param answer_id ID of the answer to retrieve votes from (see poll_answer::answer_id) + * @param after Users after this ID should be retrieved if this is set to non-zero + * @param limit This number of users maximum should be returned, up to 100 + * @param callback Function to call when the API call completes. + * @see https://discord.com/developers/docs/resources/poll#get-answer-voters + * On success the callback will contain a dpp::user_map object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). + */ + void poll_get_answer_voters(snowflake message_id, snowflake channel_id, uint32_t answer_id, snowflake after, uint64_t limit, command_completion_event_t callback = utility::log_error()); + + /** + * @brief Immediately end a poll. + * + * @param m Message that contains the poll + * @param callback Function to call when the API call completes. + * @see https://discord.com/developers/docs/resources/poll#end-poll + * On success the callback will contain a dpp::message object representing the message containing the poll in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). + */ + void poll_end(const message &m, command_completion_event_t callback = utility::log_error()); + + /** + * @brief Immediately end a poll. + * + * @param message_id ID of the message with the poll to end + * @param channel_id ID of the channel with the poll to end + * @param callback Function to call when the API call completes. + * @see https://discord.com/developers/docs/resources/poll#end-poll + * On success the callback will contain a dpp::message object representing the message containing the poll in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). + */ + void poll_end(snowflake message_id, snowflake channel_id, command_completion_event_t callback = utility::log_error()); + /** * @brief Get a channel * @@ -2389,6 +2464,19 @@ class DPP_EXPORT cluster { */ void guild_member_timeout(snowflake guild_id, snowflake user_id, time_t communication_disabled_until, command_completion_event_t callback = utility::log_error()); + /** + * @brief Remove the timeout of a guild member. + * A shortcut for guild_member_timeout(guild_id, user_id, 0, callback) + * Fires a `Guild Member Update` Gateway event. + * @see https://discord.com/developers/docs/resources/guild#modify-guild-member + * @note This method supports audit log reasons set by the cluster::set_audit_reason() method. + * @param guild_id Guild ID to remove the member timeout from + * @param user_id User ID to remove the timeout for + * @param callback Function to call when the API call completes. + * On success the callback will contain a dpp::confirmation object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). + */ + void guild_member_timeout_remove(snowflake guild_id, snowflake user_id, command_completion_event_t callback = utility::log_error()); + /** * @brief Add guild ban * @@ -2485,7 +2573,7 @@ class DPP_EXPORT cluster { * @param callback Function to call when the API call completes. * On success the callback will contain a dpp::dtemplate object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). */ - void guild_template_create(snowflake guild_id, const std::string &name, const std::string &description, command_completion_event_t callback); + void guild_template_create(snowflake guild_id, const std::string &name, const std::string &description, command_completion_event_t callback = utility::log_error()); /** * @brief Syncs the template to the guild's current state. @@ -2782,7 +2870,7 @@ class DPP_EXPORT cluster { * @brief Get the guild's onboarding configuration * * @see https://discord.com/developers/docs/resources/guild#get-guild-onboarding - * @param o The onboarding object + * @param guild_id The guild to pull the onboarding configuration from. * @param callback Function to call when the API call completes. * On success the callback will contain a dpp::onboarding object in confirmation_callback_t::value filled to match the vanity url. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). */ @@ -3703,6 +3791,17 @@ class DPP_EXPORT cluster { */ void skus_get(command_completion_event_t callback = utility::log_error()); + /** + * @brief Set the status of a voice channel. + * + * @see https://github.com/discord/discord-api-docs/pull/6400 (please replace soon). + * @param channel_id The channel to update. + * @param status The new status for the channel. + * @param callback Function to call when the API call completes. + * On success the callback will contain a dpp::confirmation object in confirmation_callback_t::value. On failure, the value is undefined and confirmation_callback_t::is_error() method will return true. You can obtain full error details with confirmation_callback_t::get_error(). + */ + void channel_set_voice_status(snowflake channel_id, const std::string& status, command_completion_event_t callback = utility::log_error()); + #include #ifdef DPP_CORO #include diff --git a/include/dpp/cluster_coro_calls.h b/include/dpp/cluster_coro_calls.h index 22cdcef0c4..1e4af10fe5 100644 --- a/include/dpp/cluster_coro_calls.h +++ b/include/dpp/cluster_coro_calls.h @@ -576,6 +576,18 @@ */ [[nodiscard]] async co_channels_get(snowflake guild_id); +/** + * @brief Set the status of a voice channel. + * + * @see dpp::cluster::channel_set_voice_status + * @see https://github.com/discord/discord-api-docs/pull/6400 (please replace soon). + * @param channel_id The channel to update. + * @param status The new status for the channel. + * @return confirmation returned object on completion + * \memberof dpp::cluster + */ +[[nodiscard]] async co_channel_set_voice_status(snowflake channel_id, const std::string& status); + /** * @brief Create a dm channel * @see dpp::cluster::create_dm_channel @@ -1051,7 +1063,7 @@ * * @see dpp::cluster::guild_get_onboarding * @see https://discord.com/developers/docs/resources/guild#get-guild-onboarding - * @param o The onboarding object + * @param guild_id The guild to pull the onboarding configuration from. * @return onboarding returned object on completion * \memberof dpp::cluster */ @@ -1224,6 +1236,20 @@ */ [[nodiscard]] async co_guild_member_timeout(snowflake guild_id, snowflake user_id, time_t communication_disabled_until); +/** + * @brief Remove the timeout of a guild member. + * A shortcut for guild_member_timeout(guild_id, user_id, 0, callback) + * Fires a `Guild Member Update` Gateway event. + * @see dpp::cluster::guild_member_timeout_remove + * @see https://discord.com/developers/docs/resources/guild#modify-guild-member + * @note This method supports audit log reasons set by the cluster::set_audit_reason() method. + * @param guild_id Guild ID to remove the member timeout from + * @param user_id User ID to remove the timeout for + * @return confirmation returned object on completion + * \memberof dpp::cluster + */ +[[nodiscard]] async co_guild_member_timeout_remove(snowflake guild_id, snowflake user_id); + /** * @brief Remove role from guild member * @@ -1502,6 +1528,15 @@ */ [[nodiscard]] async co_message_edit(const struct message &m); +/** + * @brief Edit the flags of a message on a channel. The callback function is called when the message has been edited + * + * @param m Message to edit the flags of + * @return message returned object on completion + * \memberof dpp::cluster + */ +[[nodiscard]] async co_message_edit_flags(const struct message &m); + /** * @brief Get a message * @@ -1586,6 +1621,58 @@ */ [[nodiscard]] async co_message_unpin(snowflake channel_id, snowflake message_id); +/** + * @brief Get a list of users that voted for this specific answer. + * + * @param m Message that contains the poll to retrieve the answers from + * @param answer_id ID of the answer to retrieve votes from (see poll_answer::answer_id) + * @param after Users after this ID should be retrieved if this is set to non-zero + * @param limit This number of users maximum should be returned, up to 100 + * @return user_map returned object on completion + * @see dpp::cluster::poll_get_answer_voters + * @see https://discord.com/developers/docs/resources/poll#get-answer-voters + * \memberof dpp::cluster + */ +[[nodiscard]] async co_poll_get_answer_voters(const message& m, uint32_t answer_id, snowflake after, uint64_t limit); + +/** + * @brief Get a list of users that voted for this specific answer. + * + * @param message_id ID of the message with the poll to retrieve the answers from + * @param channel_id ID of the channel with the poll to retrieve the answers from + * @param answer_id ID of the answer to retrieve votes from (see poll_answer::answer_id) + * @param after Users after this ID should be retrieved if this is set to non-zero + * @param limit This number of users maximum should be returned, up to 100 + * @return user_map returned object on completion + * @see dpp::cluster::poll_get_answer_voters + * @see https://discord.com/developers/docs/resources/poll#get-answer-voters + * \memberof dpp::cluster + */ +[[nodiscard]] async co_poll_get_answer_voters(snowflake message_id, snowflake channel_id, uint32_t answer_id, snowflake after, uint64_t limit); + +/** + * @brief Immediately end a poll. + * + * @param m Message that contains the poll + * @return message returned object on completion + * @see dpp::cluster::poll_end + * @see https://discord.com/developers/docs/resources/poll#end-poll + * \memberof dpp::cluster + */ +[[nodiscard]] async co_poll_end(const message &m); + +/** + * @brief Immediately end a poll. + * + * @param message_id ID of the message with the poll to end + * @param channel_id ID of the channel with the poll to end + * @return message returned object on completion + * @see dpp::cluster::poll_end + * @see https://discord.com/developers/docs/resources/poll#end-poll + * \memberof dpp::cluster + */ +[[nodiscard]] async co_poll_end(snowflake message_id, snowflake channel_id); + /** * @brief Get a channel's pins * @see dpp::cluster::channel_pins_get @@ -2468,5 +2555,5 @@ /* End of auto-generated definitions */ -[[nodiscard]] async co_request(const std::string &url, http_method method, const std::string &postdata = "", const std::string &mimetype = "text/plain", const std::multimap &headers = {}); +[[nodiscard]] async co_request(const std::string &url, http_method method, const std::string &postdata = "", const std::string &mimetype = "text/plain", const std::multimap &headers = {}, const std::string &protocol = "1.1"); diff --git a/include/dpp/cluster_sync_calls.h b/include/dpp/cluster_sync_calls.h index 26e81f111a..e2844018e0 100644 --- a/include/dpp/cluster_sync_calls.h +++ b/include/dpp/cluster_sync_calls.h @@ -714,6 +714,21 @@ confirmation channel_typing_sync(snowflake cid); */ channel_map channels_get_sync(snowflake guild_id); +/** + * @brief Set the status of a voice channel. + * + * @see dpp::cluster::channel_set_voice_status + * @see https://github.com/discord/discord-api-docs/pull/6400 (please replace soon). + * @param channel_id The channel to update. + * @param status The new status for the channel. + * @return confirmation returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +confirmation channel_set_voice_status_sync(snowflake channel_id, const std::string& status); + /** * @brief Create a dm channel * @see dpp::cluster::create_dm_channel @@ -1288,7 +1303,7 @@ confirmation guild_sync_integration_sync(snowflake guild_id, snowflake integrati * * @see dpp::cluster::guild_get_onboarding * @see https://discord.com/developers/docs/resources/guild#get-guild-onboarding - * @param o The onboarding object + * @param guild_id The guild to pull the onboarding configuration from. * @return onboarding returned object on completion * \memberof dpp::cluster * @throw dpp::rest_exception upon failure to execute REST function @@ -1497,6 +1512,23 @@ confirmation guild_member_kick_sync(snowflake guild_id, snowflake user_id); */ confirmation guild_member_timeout_sync(snowflake guild_id, snowflake user_id, time_t communication_disabled_until); +/** + * @brief Remove the timeout of a guild member. + * A shortcut for guild_member_timeout(guild_id, user_id, 0, callback) + * Fires a `Guild Member Update` Gateway event. + * @see dpp::cluster::guild_member_timeout_remove + * @see https://discord.com/developers/docs/resources/guild#modify-guild-member + * @note This method supports audit log reasons set by the cluster::set_audit_reason() method. + * @param guild_id Guild ID to remove the member timeout from + * @param user_id User ID to remove the timeout for + * @return confirmation returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +confirmation guild_member_timeout_remove_sync(snowflake guild_id, snowflake user_id); + /** * @brief Remove role from guild member * @@ -1838,6 +1870,18 @@ confirmation message_delete_reaction_emoji_sync(snowflake message_id, snowflake */ message message_edit_sync(const struct message &m); +/** + * @brief Edit the flags of a message on a channel. The callback function is called when the message has been edited + * + * @param m Message to edit the flags of + * @return message returned object on completion + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +message message_edit_flags_sync(const struct message &m); + /** * @brief Get a message * @@ -1940,6 +1984,70 @@ message_map messages_get_sync(snowflake channel_id, snowflake around, snowflake */ confirmation message_unpin_sync(snowflake channel_id, snowflake message_id); +/** + * @brief Get a list of users that voted for this specific answer. + * + * @param m Message that contains the poll to retrieve the answers from + * @param answer_id ID of the answer to retrieve votes from (see poll_answer::answer_id) + * @param after Users after this ID should be retrieved if this is set to non-zero + * @param limit This number of users maximum should be returned, up to 100 + * @return user_map returned object on completion + * @see dpp::cluster::poll_get_answer_voters + * @see https://discord.com/developers/docs/resources/poll#get-answer-voters + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +user_map poll_get_answer_voters_sync(const message& m, uint32_t answer_id, snowflake after, uint64_t limit); + +/** + * @brief Get a list of users that voted for this specific answer. + * + * @param message_id ID of the message with the poll to retrieve the answers from + * @param channel_id ID of the channel with the poll to retrieve the answers from + * @param answer_id ID of the answer to retrieve votes from (see poll_answer::answer_id) + * @param after Users after this ID should be retrieved if this is set to non-zero + * @param limit This number of users maximum should be returned, up to 100 + * @return user_map returned object on completion + * @see dpp::cluster::poll_get_answer_voters + * @see https://discord.com/developers/docs/resources/poll#get-answer-voters + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +user_map poll_get_answer_voters_sync(snowflake message_id, snowflake channel_id, uint32_t answer_id, snowflake after, uint64_t limit); + +/** + * @brief Immediately end a poll. + * + * @param m Message that contains the poll + * @return message returned object on completion + * @see dpp::cluster::poll_end + * @see https://discord.com/developers/docs/resources/poll#end-poll + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +message poll_end_sync(const message &m); + +/** + * @brief Immediately end a poll. + * + * @param message_id ID of the message with the poll to end + * @param channel_id ID of the channel with the poll to end + * @return message returned object on completion + * @see dpp::cluster::poll_end + * @see https://discord.com/developers/docs/resources/poll#end-poll + * \memberof dpp::cluster + * @throw dpp::rest_exception upon failure to execute REST function + * @warning This function is a blocking (synchronous) call and should only be used from within a separate thread. + * Avoid direct use of this function inside an event handler. + */ +message poll_end_sync(snowflake message_id, snowflake channel_id); + /** * @brief Get a channel's pins * @see dpp::cluster::channel_pins_get diff --git a/include/dpp/coro/coroutine.h b/include/dpp/coro/coroutine.h index a03d670b41..869882c2c8 100644 --- a/include/dpp/coro/coroutine.h +++ b/include/dpp/coro/coroutine.h @@ -58,7 +58,7 @@ using handle_t = std_coroutine::coroutine_handle>; /** * @brief Base class of dpp::coroutine. * - * @warn This class should not be used directly by a user, use dpp::coroutine instead. + * @warning This class should not be used directly by a user, use dpp::coroutine instead. * @note This class contains all the functions used internally by co_await. It is intentionally opaque and a private base of dpp::coroutine so a user cannot call await_suspend and await_resume directly. */ template diff --git a/include/dpp/discordevents.h b/include/dpp/discordevents.h index c29d686bfc..184294818b 100644 --- a/include/dpp/discordevents.h +++ b/include/dpp/discordevents.h @@ -55,7 +55,7 @@ void DPP_EXPORT set_snowflake_array_not_null(const nlohmann::json* j, const char /** * @brief Applies a function to each element of a json array. - * @param j nlohmann::json instance to retrieve value from + * @param parent nlohmann::json instance to retrieve value from * @param key key name to check for the values * @param fn function to apply to each element */ @@ -65,7 +65,7 @@ void DPP_EXPORT for_each_json(nlohmann::json* parent, std::string_view key, cons * @brief Sets an array of objects from a json field value, if defined, else does nothing * @tparam T The class of which the array consists of. Must be derived from dpp::json_interface * @param j nlohmann::json instance to retrieve value from - * @param keyname key name to check for the values + * @param key key name to check for the values * @param v Value to change */ template void set_object_array_not_null(nlohmann::json* j, std::string_view key, std::vector& v) { diff --git a/include/dpp/discordvoiceclient.h b/include/dpp/discordvoiceclient.h index e71f221e1b..07e4364483 100644 --- a/include/dpp/discordvoiceclient.h +++ b/include/dpp/discordvoiceclient.h @@ -862,7 +862,7 @@ class DPP_EXPORT discord_voice_client : public websocket_client /** * @brief Change the iteration interval time. * - * @param time The time (in milliseconds) between each interval when parsing audio. + * @param interval The time (in milliseconds) between each interval when parsing audio. * * @return Reference to self. */ diff --git a/include/dpp/dispatcher.h b/include/dpp/dispatcher.h index fef838fba7..6310aef3d4 100644 --- a/include/dpp/dispatcher.h +++ b/include/dpp/dispatcher.h @@ -1687,6 +1687,72 @@ struct DPP_EXPORT message_create_t : public event_dispatch_t { void reply(message&& msg, bool mention_replied_user = false, command_completion_event_t callback = utility::log_error()) const; }; +/** + * @brief Message poll vote add + */ +struct DPP_EXPORT message_poll_vote_add_t : public event_dispatch_t { + using event_dispatch_t::event_dispatch_t; + using event_dispatch_t::operator=; + + /** + * @brief ID of the user who added the vote + */ + snowflake user_id; + + /** + * @brief ID of the channel containing the vote + */ + snowflake channel_id; + + /** + * @brief ID of the message containing the vote + */ + snowflake message_id; + + /** + * @brief ID of the guild containing the vote or 0 for DMs + */ + snowflake guild_id; + + /** + * @brief ID of the answer in the message poll object + */ + uint32_t answer_id; +}; + +/** + * @brief Message poll vote remove + */ +struct DPP_EXPORT message_poll_vote_remove_t : public event_dispatch_t { + using event_dispatch_t::event_dispatch_t; + using event_dispatch_t::operator=; + + /** + * @brief ID of the user who added the vote + */ + snowflake user_id; + + /** + * @brief ID of the channel containing the vote + */ + snowflake channel_id; + + /** + * @brief ID of the message containing the vote + */ + snowflake message_id; + + /** + * @brief ID of the guild containing the vote or 0 for DMs + */ + snowflake guild_id; + + /** + * @brief ID of the answer in the message poll object + */ + uint32_t answer_id; +}; + /** * @brief Guild audit log entry create */ diff --git a/include/dpp/emoji.h b/include/dpp/emoji.h index 7e0549bd2a..6249b4c9eb 100644 --- a/include/dpp/emoji.h +++ b/include/dpp/emoji.h @@ -208,7 +208,8 @@ class DPP_EXPORT emoji : public managed, public json_interface { /** * @brief Load an image into the object * - * @param image_blob Image binary data + * @param data Image binary data + * @param size Size of the image. * @param type Type of image. It can be one of `i_gif`, `i_jpg` or `i_png`. * @return emoji& Reference to self * @throw dpp::length_exception Image content exceeds discord maximum of 256 kilobytes diff --git a/include/dpp/event.h b/include/dpp/event.h index fe6df9bb45..6921586755 100644 --- a/include/dpp/event.h +++ b/include/dpp/event.h @@ -100,6 +100,8 @@ event_decl(message_create,MESSAGE_CREATE); event_decl(message_update,MESSAGE_UPDATE); event_decl(message_delete,MESSAGE_DELETE); event_decl(message_delete_bulk,MESSAGE_DELETE_BULK); +event_decl(message_poll_vote_add,MESSAGE_POLL_VOTE_ADD); +event_decl(message_poll_vote_remove,MESSAGE_POLL_VOTE_REMOVE); /* Presence/typing */ event_decl(presence_update,PRESENCE_UPDATE); diff --git a/include/dpp/event_router.h b/include/dpp/event_router.h index 33793144f1..1657fbd592 100644 --- a/include/dpp/event_router.h +++ b/include/dpp/event_router.h @@ -690,7 +690,7 @@ template class event_router_t { * @brief Attach a callable to the event, adding a listener. * The callable should be of the form `void(const T&)` * where T is the event type for this event router. - * + *f * @warning You cannot call this within an event handler. * * @param fun Callable to attach to event diff --git a/include/dpp/guild.h b/include/dpp/guild.h index cbb394ce15..28c9bf720a 100644 --- a/include/dpp/guild.h +++ b/include/dpp/guild.h @@ -520,6 +520,14 @@ class DPP_EXPORT guild_member : public json_interface { */ bool has_rejoined() const; + /** + * @brief Is this user also the guild member? + * @return true if the user is the guild owner. + * @return false if the user is not the guild owner or the guild is not in the cache. + * @note If the guild cache is disabled, this function will always return false. + */ + bool is_guild_owner() const; + /** * @brief Returns true if the user has completed onboarding * @@ -1990,7 +1998,7 @@ struct DPP_EXPORT onboarding : public json_interface { /** * @brief Set guild_id of this onboarding object * - * @param guild_id Guild ID to set + * @param id Guild ID to set * @return Reference to self, so these method calls may be chained */ onboarding& set_guild_id(const snowflake id); diff --git a/include/dpp/httpsclient.h b/include/dpp/httpsclient.h index f043d533f7..7884baab39 100644 --- a/include/dpp/httpsclient.h +++ b/include/dpp/httpsclient.h @@ -249,7 +249,7 @@ class DPP_EXPORT https_client : public ssl_client { * @param extra_headers Additional request headers, e.g. user-agent, authorization, etc * @param plaintext_connection Set to true to make the connection plaintext (turns off SSL) * @param request_timeout How many seconds before the connection is considered failed if not finished - * @param http_protocol Request HTTP protocol + * @param protocol Request HTTP protocol (default: 1.1) */ https_client(const std::string &hostname, uint16_t port = 443, const std::string &urlpath = "/", const std::string &verb = "GET", const std::string &req_body = "", const http_headers& extra_headers = {}, bool plaintext_connection = false, uint16_t request_timeout = 5, const std::string &protocol = "1.1"); diff --git a/include/dpp/json_interface.h b/include/dpp/json_interface.h index 08d1d0db50..0fd209ed00 100644 --- a/include/dpp/json_interface.h +++ b/include/dpp/json_interface.h @@ -21,7 +21,7 @@ #pragma once #include -#include +#include namespace dpp { @@ -66,7 +66,7 @@ struct json_interface { */ template ().to_json_impl(bool{}))> std::string build_json(bool with_id = false) const { - return to_json(with_id).dump(); + return to_json(with_id).dump(-1, ' ', false, nlohmann::detail::error_handler_t::replace); } }; diff --git a/include/dpp/message.h b/include/dpp/message.h index f2b1d1b7e6..d64b481e82 100644 --- a/include/dpp/message.h +++ b/include/dpp/message.h @@ -79,14 +79,14 @@ enum component_type : uint8_t { }; /** - * @brief An emoji for a component (select menus included). + * @brief An emoji reference for a component (select menus included) or a poll. * - * To set an emoji on your button, you must set one of either the name or id fields. - * The easiest way is to use the dpp::component::set_emoji method. + * To set an emoji on your button or poll answer, you must set one of either the name or id fields. + * The easiest way for buttons is to use the dpp::component::set_emoji method. * * @note This is a **very** scaled down version of dpp::emoji, we advise that you refrain from using this. */ -struct component_emoji { +struct partial_emoji { /** * @brief The name of the emoji. * @@ -94,7 +94,7 @@ struct component_emoji { * actual unicode value of the emoji e.g. "😄" * and not for example ":smile:" */ - std::string name{""}; + std::string name{}; /** * @brief The emoji ID value for emojis that are custom @@ -115,6 +115,13 @@ struct component_emoji { bool animated{false}; }; +/** + * @brief An emoji for a component. Alias to partial_emoji, for backwards compatibility. + * + * @see partial_emoji + */ +using component_emoji = partial_emoji; + /** * @brief The data for a file attached to a message. * @@ -247,7 +254,7 @@ struct DPP_EXPORT select_option : public json_interface { /** * @brief The emoji for the select option. */ - component_emoji emoji; + partial_emoji emoji; /** * @brief Construct a new select option object @@ -449,7 +456,7 @@ class DPP_EXPORT component : public json_interface { /** * @brief The emoji for this component. */ - component_emoji emoji; + partial_emoji emoji; /** * @brief Constructor @@ -1172,6 +1179,20 @@ struct DPP_EXPORT attachment { * @return true if remixed */ bool is_remix() const; + + /** + * @brief Returns expiration timestamp for attachment's URL + * + * @return timestamp of URL expiration + */ + time_t get_expire_time() const; + + /** + * @brief Returns creation timestamp for attachment's URL + * + * @return timestamp of URL creation + */ + time_t get_issued_time() const; }; /** @@ -1351,39 +1372,267 @@ struct DPP_EXPORT sticker_pack : public managed, public json_interface stickers; + std::map stickers{}; /** * @brief Name of the sticker pack. */ - std::string name; + std::string name{}; /** * @brief ID of the pack's SKU. */ - snowflake sku_id; + snowflake sku_id{0}; /** * @brief Optional: ID of a sticker in the pack which is shown as the pack's icon. */ - snowflake cover_sticker_id; + snowflake cover_sticker_id{0}; /** * @brief Description of the sticker pack. */ - std::string description; + std::string description{}; /** * @brief ID of the sticker pack's banner image. */ - snowflake banner_asset_id; + snowflake banner_asset_id{}; +}; + +/** + * @brief Poll layout types + * + * @note At the time of writing Discord only has 1, "The, uhm, default layout type." + * @see https://discord.com/developers/docs/resources/poll#layout-type + */ +enum poll_layout_type { + /** + * @brief According to Discord, quote, "The, uhm, default layout type." + */ + pl_default = 1 +}; + +/** + * @brief Structure representing a poll media, for example the poll question or a possible poll answer. + * + * @see https://discord.com/developers/docs/resources/poll#poll-media-object-poll-media-object-structure + */ +struct poll_media { + /** + * @brief Text of the media + */ + std::string text{}; + + /** + * @brief Emoji of the media. + */ + partial_emoji emoji{}; +}; + +/** + * @brief Represents an answer in a poll. + * + * @see https://discord.com/developers/docs/resources/poll#poll-answer-object-poll-answer-object-structure + */ +struct poll_answer { + /** + * @brief ID of the answer. Only sent by the Discord API, this is a dead field when creating a poll. + * + * @warn At the time of writing the Discord API warns users not to rely on anything regarding sequence or "first value" of this field. + */ + uint32_t id{0}; + + /** + * @brief Data of the answer. + * + * @see poll_media + */ + poll_media media{}; +}; +/** + * @brief Represents the results of a poll + * + * @see https://discord.com/developers/docs/resources/poll#poll-results-object-poll-results-object-structure + */ +struct poll_results { /** - * @brief Construct a new sticker pack object + * @brief Represents a reference to an answer and its count of votes + * + * @see https://discord.com/developers/docs/resources/poll#poll-results-object-poll-answer-count-object-structure */ - sticker_pack(); + struct answer_count { + /** + * @brief ID of the answer. Relates to an answer in the answers field + * + * @see poll_answer::answer_id + */ + uint32_t answer_id{0}; - virtual ~sticker_pack() = default; + /** + * @brief Number of votes for this answer + */ + uint32_t count{0}; + + /** + * @brief Whether the current user voted + */ + bool me_voted{false}; + }; + + /** + * @brief Whether the poll has finalized, and the answers are precisely counted + * + * @note Discord states that due to the way they count and cache answers, + * while a poll is running the count of answers might not be accurate. + */ + bool is_finalized{false}; + + /** + * @brief Count of votes for each answer. If an answer is not present in this list, + * then its vote count is 0 + */ + std::map answer_counts; +}; + +/** + * @brief Represents a poll. + * + * @see https://discord.com/developers/docs/resources/poll + */ +struct DPP_EXPORT poll { + /** + * @brief Poll question. At the time of writing only the text field is supported by Discord + * + * @see media + */ + poll_media question{}; + + /** + * @brief List of answers of the poll. + * + * @note At the time of writing this can contain up to 10 answers + * @see answer + */ + std::map answers{}; + + /** + * @brief When retriving a poll from the API, this is the timestamp at which the poll will expire. + * When creating a poll, this is the number of hours the poll should be up for, up to 7 days (168 hours), and this field will be rounded. + */ + double expiry{24.0}; + + /** + * @brief Whether a user can select multiple answers + */ + bool allow_multiselect{false}; + + /** + * @brief Layout type of the poll. Defaults to, well, pl_default + * + * @see poll_layout_type + */ + poll_layout_type layout_type{pl_default}; + + /** + * @brief The (optional) results of the poll. This field may or may not be present, and its absence means "unknown results", not "no results". + * + * @note Quote from Discord: "The results field may be not present in certain responses where, as an implementation detail, + * we do not fetch the poll results in our backend. This should be treated as "unknown results", + * as opposed to "no results". You can keep using the results if you have previously received them through other means." + * + * @see https://discord.com/developers/docs/resources/poll#poll-results-object + */ + std::optional results{std::nullopt}; + + /** + * @brief Set the question for this poll + * + * @param text Text for the question + * @return self for method chaining + */ + poll& set_question(const std::string& text); + + /** + * @brief Set the duration of the poll in hours + * + * @param hours Duration of the poll in hours, max 7 days (168 hours) at the time of writing + * @return self for method chaining + */ + poll& set_duration(uint32_t hours) noexcept; + + /** + * @brief Set the duration of the poll in hours + * + * @param hours Duration of the poll in hours + * @return self for method chaining + */ + poll& set_allow_multiselect(bool allow) noexcept; + + /** + * @brief Add an answer to this poll + * + * @note At the time of writing this, a poll can have up to 10 answers + * @param media Data of the answer + * @return self for method chaining + */ + poll& add_answer(const poll_media& media); + + /** + * @brief Add an answer to this poll + * + * @note At the time of writing this, a poll can have up to 10 answers + * @param text Text for the answer + * @param emoji_id Optional emoji + * @param is_animated Whether the emoji is animated + * @return self for method chaining + */ + poll& add_answer(const std::string& text, snowflake emoji_id = 0, bool is_animated = false); + + /** + * @brief Add an answer to this poll + * + * @note At the time of writing this, a poll can have up to 10 answers + * @param text Text for the answer + * @param emoji Optional emoji + * @return self for method chaining + */ + poll& add_answer(const std::string& text, const std::string& emoji); + + /** + * @brief Add an answer to this poll + * + * @note At the time of writing this, a poll can have up to 10 answers + * @param text Text for the answer + * @param e Optional emoji + * @return self for method chaining + */ + poll& add_answer(const std::string& text, const emoji& e); + + /** + * @brief Helper to get the question text + * + * @return question.text + */ + [[nodiscard]] const std::string& get_question_text() const noexcept; + + /** + * @brief Helper to find an answer by ID + * + * @param id ID to find + * @return Pointer to the answer with the matching ID, or nullptr if not found + */ + [[nodiscard]] const poll_media* find_answer(uint32_t id) const noexcept; + + /** + * @brief Helper to find the vote count in the results + * + * @param answer_id ID of the answer to find + * @return std::optional Optional count of votes. An empty optional means Discord did not send the results, it does not mean 0. It can also mean the poll does not have an answer with this ID + * @see https://discord.com/developers/docs/resources/poll#poll-results-object + */ + [[nodiscard]] std::optional get_vote_count(uint32_t answer_id) const noexcept; }; /** @@ -1848,7 +2097,7 @@ struct DPP_EXPORT message : public managed, json_interface { snowflake webhook_id; /** - * @brief Stickers. + * @brief Partial stickers. Only id, name and format_type are filled */ std::vector stickers; @@ -1975,6 +2224,11 @@ struct DPP_EXPORT message : public managed, json_interface { */ bool mention_everyone; + /** + * @brief Optional poll attached to this message + */ + std::optional attached_poll; + /** * @brief Construct a new message object */ @@ -2009,13 +2263,20 @@ struct DPP_EXPORT message : public managed, json_interface { */ message(snowflake channel_id, const std::string &content, message_type type = mt_default); + /** + * @brief Construct a new message object with content + * + * @param _embed An embed to send + */ + message(const embed& _embed); + /** * @brief Construct a new message object with a channel and content * * @param channel_id The channel to send the message to * @param _embed An embed to send */ - message(snowflake channel_id, const embed & _embed); + message(snowflake channel_id, const embed& _embed); /** * @brief Construct a new message object with content @@ -2060,15 +2321,15 @@ struct DPP_EXPORT message : public managed, json_interface { /** * @brief Set the allowed mentions object for pings on the message * - * @param _parse_users whether or not to parse users in the message content or embeds - * @param _parse_roles whether or not to parse roles in the message content or embeds - * @param _parse_everyone whether or not to parse everyone/here in the message content or embeds - * @param _replied_user if set to true and this is a reply, then ping the user we reply to - * @param users list of user ids to allow pings for - * @param roles list of role ids to allow pings for + * @param _parse_users whether or not to parse users in the message content or embeds, default false + * @param _parse_roles whether or not to parse roles in the message content or embeds, default false + * @param _parse_everyone whether or not to parse everyone/here in the message content or embeds, default false + * @param _replied_user if set to true and this is a reply, then ping the user we reply to, default false + * @param users list of user ids to allow pings for, default an empty vector + * @param roles list of role ids to allow pings for, default an empty vector * @return message& reference to self */ - message& set_allowed_mentions(bool _parse_users, bool _parse_roles, bool _parse_everyone, bool _replied_user, const std::vector &users, const std::vector &roles); + message& set_allowed_mentions(bool _parse_users = false, bool _parse_roles = false, bool _parse_everyone = false, bool _replied_user = false, const std::vector &users = {}, const std::vector &roles = {}); using json_interface::fill_from_json; using json_interface::to_json; @@ -2109,6 +2370,14 @@ struct DPP_EXPORT message : public managed, json_interface { */ bool suppress_embeds() const; + /** + * @brief Set whether embeds should be suppressed + * + * @param suppress whether embeds should be suppressed + * @return message& reference to self + */ + message& suppress_embeds(bool suppress); + /** * @brief True if source message was deleted * @@ -2181,6 +2450,24 @@ struct DPP_EXPORT message : public managed, json_interface { */ message& add_embed(const embed& e); + /** + * @brief Add a sticker to this message + * + * As of writing this, a message can only contain up to 3 stickers + * @param s sticker to add + * @return message& reference to self + */ + message& add_sticker(const sticker& s); + + /** + * @brief Add a sticker to this message + * + * As of writing this, a message can only contain up to 3 stickers + * @param id id of the sticker to add + * @return message& reference to self + */ + message& add_sticker(const snowflake& id); + /** * @brief Set the flags * @@ -2269,6 +2556,28 @@ struct DPP_EXPORT message : public managed, json_interface { * @return string of URL to message */ std::string get_url() const; + + /** + * @brief Convenience method to set the poll + * + * @return message& Self reference for method chaining + */ + message& set_poll(const poll& p); + + /** + * @brief Convenience method to get the poll attached to this message + * + * @throw std::bad_optional_access if has_poll() == false + * @return const poll& Poll attached to this object + */ + [[nodiscard]] const poll& get_poll() const; + + /** + * @brief Method to check if the message has a poll + * + * @return bool Whether the message has a poll + */ + [[nodiscard]] bool has_poll() const noexcept; }; /** diff --git a/include/dpp/nlohmann/json.hpp b/include/dpp/nlohmann/json.hpp index 4d1a37ad7c..6f018a033b 100644 --- a/include/dpp/nlohmann/json.hpp +++ b/include/dpp/nlohmann/json.hpp @@ -24300,7 +24300,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec NLOHMANN_BASIC_JSON_TPL_DECLARATION std::string to_string(const NLOHMANN_BASIC_JSON_TPL& j) { - return j.dump(); + return j.dump(-1, ' ', false, json::error_handler_t::ignore); } inline namespace literals diff --git a/include/dpp/prune.h b/include/dpp/prune.h index 9952b841f2..36e6275f6d 100644 --- a/include/dpp/prune.h +++ b/include/dpp/prune.h @@ -71,7 +71,7 @@ struct DPP_EXPORT prune : public json_interface { /** * @brief Build JSON from this object. * - * @param with_prune_count True if the prune count boolean is to be set in the built JSON + * @param with_id True if the prune count boolean is to be set in the built JSON * @return The JSON of the prune object */ json to_json(bool with_id = false) const; // Intentional shadow of json_interface, mostly present for documentation diff --git a/include/dpp/queues.h b/include/dpp/queues.h index b3e9b8ec97..3097d5bcb6 100644 --- a/include/dpp/queues.h +++ b/include/dpp/queues.h @@ -434,9 +434,9 @@ class DPP_EXPORT in_thread { std::map buckets; /** - * @brief Queue of requests to be made. + * @brief Queue of requests to be made. Sorted by http_request::endpoint. */ - std::map> requests_in; + std::vector> requests_in; /** * @brief Inbound queue thread loop. @@ -465,7 +465,7 @@ class DPP_EXPORT in_thread { * @param req http_request to post. The pointer will be freed when it has * been executed. */ - void post_request(http_request* req); + void post_request(std::unique_ptr req); }; /** @@ -516,10 +516,25 @@ class DPP_EXPORT request_queue { */ std::condition_variable out_ready; + /** + * @brief A completed request. Contains both the request and the response + */ + struct completed_request { + /** + * @brief Request sent + */ + std::unique_ptr request; + + /** + * @brief Response to the request + */ + std::unique_ptr response; + }; + /** * @brief Completed requests queue */ - std::queue> responses_out; + std::queue responses_out; /** * @brief A vector of inbound request threads forming a pool. @@ -533,9 +548,38 @@ class DPP_EXPORT request_queue { std::vector requests_in; /** - * @brief Completed requests to delete + * @brief A request queued for deletion in the queue. + */ + struct queued_deleting_request { + /** + * @brief Time to delete the request + */ + time_t time_to_delete; + + /** + * @brief The request to delete + */ + completed_request request; + + /** + * @brief Comparator for sorting purposes + * @param other Other queued request to compare the deletion time with + * @return bool Whether this request comes before another in strict ordering + */ + bool operator<(const queued_deleting_request& other) const noexcept; + + /** + * @brief Comparator for sorting purposes + * @param time Time to compare with + * @return bool Whether this request's deletion time is lower than the time given, for strict ordering + */ + bool operator<(time_t time) const noexcept; + }; + + /** + * @brief Completed requests to delete. Sorted by deletion time */ - std::multimap> responses_to_delete; + std::vector responses_to_delete; /** * @brief Set to true if the threads should terminate @@ -597,14 +641,13 @@ class DPP_EXPORT request_queue { ~request_queue(); /** - * @brief Put a http_request into the request queue. You should ALWAYS "new" an object - * to pass to here -- don't submit an object that's on the stack! + * @brief Put a http_request into the request queue. * @note Will use a simple hash function to determine which of the 'in queues' to place * this request onto. * @param req request to add * @return reference to self */ - request_queue& post_request(http_request *req); + request_queue& post_request(std::unique_ptr req); /** * @brief Returns true if the bot is currently globally rate limited diff --git a/include/dpp/restrequest.h b/include/dpp/restrequest.h index e948713b17..93fdd27071 100644 --- a/include/dpp/restrequest.h +++ b/include/dpp/restrequest.h @@ -144,6 +144,7 @@ template<> inline void rest_request_list(dpp::cluster* c, const char* ba } }); } + /** * @brief Templated REST request helper to save on typing (for returned lists, specialised for voiceregions) * @@ -172,6 +173,7 @@ template<> inline void rest_request_list(dpp::cluster* c, const cha } }); } + /** * @brief Templated REST request helper to save on typing (for returned lists, specialised for bans) * @@ -201,6 +203,7 @@ template<> inline void rest_request_list(dpp::cluster* c, const char* basep } }); } + /** * @brief Templated REST request helper to save on typing (for returned lists, specialised for sticker packs) * @@ -232,6 +235,36 @@ template<> inline void rest_request_list(dpp::cluster* c, const ch }); } +/** + * @brief Templated REST request helper to save on typing (for returned lists) + * + * @tparam T singular type to return in lambda callback + * @tparam T map type to return in lambda callback + * @param c calling cluster + * @param basepath base path for API call + * @param major major API function + * @param minor minor API function + * @param method HTTP method + * @param postdata Post data or empty string + * @param key Key name of elements in the json list + * @param root Root element to look for + * @param callback Callback lambda + */ +template inline void rest_request_list(dpp::cluster* c, const char* basepath, const std::string &major, const std::string &minor, http_method method, const std::string& postdata, command_completion_event_t callback, const std::string& key, const std::string& root) { + c->post_rest(basepath, major, minor, method, postdata, [c, root, key, callback](json &j, const http_request_completion_t& http) { + std::unordered_map list; + confirmation_callback_t e(c, confirmation(), http); + if (!e.is_error()) { + for (auto & curr_item : j[root]) { + list[snowflake_not_null(&curr_item, key.c_str())] = T().fill_from_json(&curr_item); + } + } + if (callback) { + callback(confirmation_callback_t(c, list, http)); + } + }); +} + /** * @brief Templated REST request helper to save on typing (for returned lists, specialised for objects which doesn't have ids) * diff --git a/include/dpp/restresults.h b/include/dpp/restresults.h index ec52ca1b71..3dd0ebb69c 100644 --- a/include/dpp/restresults.h +++ b/include/dpp/restresults.h @@ -220,7 +220,7 @@ struct DPP_EXPORT error_detail { /** * @brief Object field index */ - int index = 0; + DPP_DEPRECATED("index is unused and will be removed in a future version") int index = 0; }; /** diff --git a/include/dpp/role.h b/include/dpp/role.h index 44ca4a597e..a3da13f367 100644 --- a/include/dpp/role.h +++ b/include/dpp/role.h @@ -307,7 +307,8 @@ class DPP_EXPORT role : public managed, public json_interface { /** * @brief Load a role icon. * - * @param image_blob Image binary data + * @param data Image binary data + * @param size Size of the image. * @param type Type of image. It can be one of `i_gif`, `i_jpg` or `i_png`. * @return emoji& Reference to self */ diff --git a/include/dpp/scheduled_event.h b/include/dpp/scheduled_event.h index b0617719e1..52d5c559ac 100644 --- a/include/dpp/scheduled_event.h +++ b/include/dpp/scheduled_event.h @@ -317,7 +317,8 @@ struct DPP_EXPORT scheduled_event : public managed, public json_interface { /** * @brief Construct a new SKU object with all data required. * - * @param id SKU id. + * @param id ID of the SKU. + * @param type Type of SKU (sku_type). + * @param application_id ID of the parent application. + * @param name Customer-facing name of your premium offering. + * @param slug System-generated URL slug based on the SKU's name. + * @param flags Flags bitmap from dpp::sku_flags. + * */ sku(const snowflake id, const sku_type type, const snowflake application_id, const std::string name, const std::string slug, const uint16_t flags); diff --git a/include/dpp/sslclient.h b/include/dpp/sslclient.h index b1e674efc4..f43e3a575d 100644 --- a/include/dpp/sslclient.h +++ b/include/dpp/sslclient.h @@ -58,6 +58,7 @@ bool close_socket(dpp::socket sfd); * @brief Set a socket to blocking or non-blocking IO * * @param sockfd socket to act upon + * @param non_blocking should socket be non-blocking? * @return false on error, true on success */ bool set_nonblocking(dpp::socket sockfd, bool non_blocking); diff --git a/include/dpp/stringops.h b/include/dpp/stringops.h index 279d84c6c9..9383fa4d06 100644 --- a/include/dpp/stringops.h +++ b/include/dpp/stringops.h @@ -139,6 +139,9 @@ template T from_string(const std::string &s, std::ios_base & (*f)(s */ template T from_string(const std::string &s) { + if (s.empty()) { + return static_cast(0); + } T t; std::istringstream iss(s); iss >> t; diff --git a/include/dpp/thread.h b/include/dpp/thread.h index 2dee940be0..893ef04a28 100644 --- a/include/dpp/thread.h +++ b/include/dpp/thread.h @@ -165,6 +165,12 @@ class DPP_EXPORT thread : public channel, public json_interface { */ uint8_t member_count = 0; + /** + * @brief Was this thread newly created? + * @note This will only show in dpp::cluster::on_thread_create if the thread was just made. + */ + bool newly_created{false}; + /** * @brief Returns true if the thread is within an announcement channel * diff --git a/include/dpp/unicode_emoji.h b/include/dpp/unicode_emoji.h index 2a0e556706..ea832b9537 100644 --- a/include/dpp/unicode_emoji.h +++ b/include/dpp/unicode_emoji.h @@ -17,6 +17,7 @@ namespace unicode_emoji { inline constexpr const char _100[] = "💯"; inline constexpr const char _1234[] = "🔢"; inline constexpr const char soccer[] = "⚽"; + inline constexpr const char soccer_ball[] = "⚽"; inline constexpr const char basketball[] = "🏀"; inline constexpr const char football[] = "🏈"; inline constexpr const char baseball[] = "⚾"; @@ -31,6 +32,7 @@ namespace unicode_emoji { inline constexpr const char table_tennis[] = "🏓"; inline constexpr const char badminton[] = "🏸"; inline constexpr const char hockey[] = "🏒"; + inline constexpr const char ice_hockey[] = "🏒"; inline constexpr const char field_hockey[] = "🏑"; inline constexpr const char lacrosse[] = "🥍"; inline constexpr const char cricket_game[] = "🏏"; @@ -39,23 +41,27 @@ namespace unicode_emoji { inline constexpr const char goal[] = "🥅"; inline constexpr const char goal_net[] = "🥅"; inline constexpr const char golf[] = "⛳"; + inline constexpr const char flag_in_hole[] = "⛳"; inline constexpr const char kite[] = "🪁"; inline constexpr const char playground_slide[] = "🛝"; inline constexpr const char bow_and_arrow[] = "🏹"; inline constexpr const char archery[] = "🏹"; inline constexpr const char fishing_pole_and_fish[] = "🎣"; + inline constexpr const char fishing_pole[] = "🎣"; inline constexpr const char diving_mask[] = "🤿"; inline constexpr const char boxing_glove[] = "🥊"; inline constexpr const char boxing_gloves[] = "🥊"; inline constexpr const char martial_arts_uniform[] = "🥋"; inline constexpr const char karate_uniform[] = "🥋"; inline constexpr const char running_shirt_with_sash[] = "🎽"; + inline constexpr const char running_shirt[] = "🎽"; inline constexpr const char skateboard[] = "🛹"; inline constexpr const char roller_skate[] = "🛼"; inline constexpr const char sled[] = "🛷"; inline constexpr const char ice_skate[] = "⛸️"; inline constexpr const char curling_stone[] = "🥌"; inline constexpr const char ski[] = "🎿"; + inline constexpr const char skis[] = "🎿"; inline constexpr const char skier[] = "⛷️"; inline constexpr const char snowboarder[] = "🏂"; inline constexpr const char snowboarder_tone1[] = "🏂🏻"; @@ -595,10 +601,13 @@ namespace unicode_emoji { inline constexpr const char ballet_shoes[] = "🩰"; inline constexpr const char art[] = "🎨"; inline constexpr const char clapper[] = "🎬"; + inline constexpr const char clapper_board[] = "🎬"; inline constexpr const char microphone[] = "🎤"; inline constexpr const char headphones[] = "🎧"; + inline constexpr const char headphone[] = "🎧"; inline constexpr const char musical_score[] = "🎼"; inline constexpr const char musical_keyboard[] = "🎹"; + inline constexpr const char maracas[] = "🪇"; inline constexpr const char drum[] = "🥁"; inline constexpr const char drum_with_drumsticks[] = "🥁"; inline constexpr const char long_drum[] = "🪘"; @@ -608,21 +617,25 @@ namespace unicode_emoji { inline constexpr const char guitar[] = "🎸"; inline constexpr const char banjo[] = "🪕"; inline constexpr const char violin[] = "🎻"; + inline constexpr const char flute[] = "🪈"; inline constexpr const char game_die[] = "🎲"; inline constexpr const char chess_pawn[] = "♟️"; inline constexpr const char dart[] = "🎯"; + inline constexpr const char direct_hit[] = "🎯"; inline constexpr const char bowling[] = "🎳"; inline constexpr const char video_game[] = "🎮"; inline constexpr const char slot_machine[] = "🎰"; inline constexpr const char jigsaw[] = "🧩"; + inline constexpr const char puzzle_piece[] = "🧩"; inline constexpr const char flag_white[] = "🏳️"; inline constexpr const char flag_black[] = "🏴"; + inline constexpr const char pirate_flag[] = "🏴‍☠️"; inline constexpr const char checkered_flag[] = "🏁"; inline constexpr const char triangular_flag_on_post[] = "🚩"; inline constexpr const char rainbow_flag[] = "🏳️‍🌈"; inline constexpr const char gay_pride_flag[] = "🏳️‍🌈"; inline constexpr const char transgender_flag[] = "🏳️‍⚧️"; - inline constexpr const char pirate_flag[] = "🏴‍☠️"; + inline constexpr const char united_nations[] = "🇺🇳"; inline constexpr const char flag_af[] = "🇦🇫"; inline constexpr const char flag_ax[] = "🇦🇽"; inline constexpr const char flag_al[] = "🇦🇱"; @@ -884,17 +897,17 @@ namespace unicode_emoji { inline constexpr const char flag_sj[] = "🇸🇯"; inline constexpr const char flag_ta[] = "🇹🇦"; inline constexpr const char flag_um[] = "🇺🇲"; - inline constexpr const char united_nations[] = "🇺🇳"; inline constexpr const char green_apple[] = "🍏"; inline constexpr const char apple[] = "🍎"; + inline constexpr const char red_apple[] = "🍎"; inline constexpr const char pear[] = "🍐"; inline constexpr const char tangerine[] = "🍊"; inline constexpr const char lemon[] = "🍋"; inline constexpr const char banana[] = "🍌"; inline constexpr const char watermelon[] = "🍉"; inline constexpr const char grapes[] = "🍇"; - inline constexpr const char blueberries[] = "🫐"; inline constexpr const char strawberry[] = "🍓"; + inline constexpr const char blueberries[] = "🫐"; inline constexpr const char melon[] = "🍈"; inline constexpr const char cherries[] = "🍒"; inline constexpr const char peach[] = "🍑"; @@ -903,27 +916,30 @@ namespace unicode_emoji { inline constexpr const char coconut[] = "🥥"; inline constexpr const char kiwi[] = "🥝"; inline constexpr const char kiwifruit[] = "🥝"; + inline constexpr const char kiwi_fruit[] = "🥝"; inline constexpr const char tomato[] = "🍅"; inline constexpr const char eggplant[] = "🍆"; inline constexpr const char avocado[] = "🥑"; - inline constexpr const char olive[] = "🫒"; + inline constexpr const char pea_pod[] = "🫛"; inline constexpr const char broccoli[] = "🥦"; inline constexpr const char leafy_green[] = "🥬"; - inline constexpr const char bell_pepper[] = "🫑"; inline constexpr const char cucumber[] = "🥒"; inline constexpr const char hot_pepper[] = "🌶️"; + inline constexpr const char bell_pepper[] = "🫑"; inline constexpr const char corn[] = "🌽"; + inline constexpr const char ear_of_corn[] = "🌽"; inline constexpr const char carrot[] = "🥕"; + inline constexpr const char olive[] = "🫒"; inline constexpr const char garlic[] = "🧄"; inline constexpr const char onion[] = "🧅"; inline constexpr const char potato[] = "🥔"; inline constexpr const char sweet_potato[] = "🍠"; + inline constexpr const char ginger_root[] = "🫚"; inline constexpr const char croissant[] = "🥐"; inline constexpr const char bagel[] = "🥯"; inline constexpr const char bread[] = "🍞"; inline constexpr const char french_bread[] = "🥖"; inline constexpr const char baguette_bread[] = "🥖"; - inline constexpr const char flatbread[] = "🫓"; inline constexpr const char pretzel[] = "🥨"; inline constexpr const char cheese[] = "🧀"; inline constexpr const char cheese_wedge[] = "🧀"; @@ -941,7 +957,9 @@ namespace unicode_emoji { inline constexpr const char hot_dog[] = "🌭"; inline constexpr const char hamburger[] = "🍔"; inline constexpr const char fries[] = "🍟"; + inline constexpr const char french_fries[] = "🍟"; inline constexpr const char pizza[] = "🍕"; + inline constexpr const char flatbread[] = "🫓"; inline constexpr const char sandwich[] = "🥪"; inline constexpr const char stuffed_flatbread[] = "🥙"; inline constexpr const char stuffed_pita[] = "🥙"; @@ -958,15 +976,20 @@ namespace unicode_emoji { inline constexpr const char jar[] = "🫙"; inline constexpr const char spaghetti[] = "🍝"; inline constexpr const char ramen[] = "🍜"; + inline constexpr const char steaming_bowl[] = "🍜"; inline constexpr const char stew[] = "🍲"; + inline constexpr const char pot_of_food[] = "🍲"; inline constexpr const char curry[] = "🍛"; + inline constexpr const char curry_rice[] = "🍛"; inline constexpr const char sushi[] = "🍣"; inline constexpr const char bento[] = "🍱"; + inline constexpr const char bento_box[] = "🍱"; inline constexpr const char dumpling[] = "🥟"; inline constexpr const char oyster[] = "🦪"; inline constexpr const char fried_shrimp[] = "🍤"; inline constexpr const char rice_ball[] = "🍙"; inline constexpr const char rice[] = "🍚"; + inline constexpr const char cooked_rice[] = "🍚"; inline constexpr const char rice_cracker[] = "🍘"; inline constexpr const char fish_cake[] = "🍥"; inline constexpr const char fortune_cookie[] = "🥠"; @@ -979,7 +1002,9 @@ namespace unicode_emoji { inline constexpr const char pie[] = "🥧"; inline constexpr const char cupcake[] = "🧁"; inline constexpr const char cake[] = "🍰"; + inline constexpr const char shortcake[] = "🍰"; inline constexpr const char birthday[] = "🎂"; + inline constexpr const char birthday_cake[] = "🎂"; inline constexpr const char custard[] = "🍮"; inline constexpr const char pudding[] = "🍮"; inline constexpr const char flan[] = "🍮"; @@ -1000,6 +1025,7 @@ namespace unicode_emoji { inline constexpr const char baby_bottle[] = "🍼"; inline constexpr const char teapot[] = "🫖"; inline constexpr const char coffee[] = "☕"; + inline constexpr const char hot_beverage[] = "☕"; inline constexpr const char tea[] = "🍵"; inline constexpr const char mate[] = "🧉"; inline constexpr const char beverage_box[] = "🧃"; @@ -1007,6 +1033,7 @@ namespace unicode_emoji { inline constexpr const char bubble_tea[] = "🧋"; inline constexpr const char sake[] = "🍶"; inline constexpr const char beer[] = "🍺"; + inline constexpr const char beer_mug[] = "🍺"; inline constexpr const char beers[] = "🍻"; inline constexpr const char champagne_glass[] = "🥂"; inline constexpr const char clinking_glass[] = "🥂"; @@ -1027,21 +1054,29 @@ namespace unicode_emoji { inline constexpr const char chopsticks[] = "🥢"; inline constexpr const char salt[] = "🧂"; inline constexpr const char dog[] = "🐶"; + inline constexpr const char dog_face[] = "🐶"; inline constexpr const char cat[] = "🐱"; + inline constexpr const char cat_face[] = "🐱"; inline constexpr const char mouse[] = "🐭"; + inline constexpr const char mouse_face[] = "🐭"; inline constexpr const char hamster[] = "🐹"; inline constexpr const char rabbit[] = "🐰"; + inline constexpr const char rabbit_face[] = "🐰"; inline constexpr const char fox[] = "🦊"; inline constexpr const char fox_face[] = "🦊"; inline constexpr const char bear[] = "🐻"; inline constexpr const char panda_face[] = "🐼"; + inline constexpr const char panda[] = "🐼"; inline constexpr const char polar_bear[] = "🐻‍❄️"; inline constexpr const char koala[] = "🐨"; inline constexpr const char tiger[] = "🐯"; + inline constexpr const char tiger_face[] = "🐯"; inline constexpr const char lion_face[] = "🦁"; inline constexpr const char lion[] = "🦁"; inline constexpr const char cow[] = "🐮"; + inline constexpr const char cow_face[] = "🐮"; inline constexpr const char pig[] = "🐷"; + inline constexpr const char pig_face[] = "🐷"; inline constexpr const char pig_nose[] = "🐽"; inline constexpr const char frog[] = "🐸"; inline constexpr const char monkey_face[] = "🐵"; @@ -1055,26 +1090,31 @@ namespace unicode_emoji { inline constexpr const char baby_chick[] = "🐤"; inline constexpr const char hatching_chick[] = "🐣"; inline constexpr const char hatched_chick[] = "🐥"; + inline constexpr const char goose[] = "🪿"; inline constexpr const char duck[] = "🦆"; + inline constexpr const char black_bird[] = "🐦‍⬛"; inline constexpr const char eagle[] = "🦅"; inline constexpr const char owl[] = "🦉"; inline constexpr const char bat[] = "🦇"; inline constexpr const char wolf[] = "🐺"; inline constexpr const char boar[] = "🐗"; inline constexpr const char horse[] = "🐴"; + inline constexpr const char horse_face[] = "🐴"; inline constexpr const char unicorn[] = "🦄"; inline constexpr const char unicorn_face[] = "🦄"; + inline constexpr const char moose[] = "🫎"; inline constexpr const char bee[] = "🐝"; + inline constexpr const char honeybee[] = "🐝"; + inline constexpr const char worm[] = "🪱"; inline constexpr const char bug[] = "🐛"; inline constexpr const char butterfly[] = "🦋"; inline constexpr const char snail[] = "🐌"; - inline constexpr const char worm[] = "🪱"; inline constexpr const char lady_beetle[] = "🐞"; inline constexpr const char ant[] = "🐜"; inline constexpr const char fly[] = "🪰"; - inline constexpr const char mosquito[] = "🦟"; - inline constexpr const char cockroach[] = "🪳"; inline constexpr const char beetle[] = "🪲"; + inline constexpr const char cockroach[] = "🪳"; + inline constexpr const char mosquito[] = "🦟"; inline constexpr const char cricket[] = "🦗"; inline constexpr const char spider[] = "🕷️"; inline constexpr const char spider_web[] = "🕸️"; @@ -1086,26 +1126,26 @@ namespace unicode_emoji { inline constexpr const char sauropod[] = "🦕"; inline constexpr const char octopus[] = "🐙"; inline constexpr const char squid[] = "🦑"; + inline constexpr const char jellyfish[] = "🪼"; inline constexpr const char shrimp[] = "🦐"; inline constexpr const char lobster[] = "🦞"; inline constexpr const char crab[] = "🦀"; inline constexpr const char blowfish[] = "🐡"; inline constexpr const char tropical_fish[] = "🐠"; inline constexpr const char fish[] = "🐟"; - inline constexpr const char seal[] = "🦭"; inline constexpr const char dolphin[] = "🐬"; inline constexpr const char whale[] = "🐳"; inline constexpr const char whale2[] = "🐋"; inline constexpr const char shark[] = "🦈"; + inline constexpr const char seal[] = "🦭"; inline constexpr const char crocodile[] = "🐊"; inline constexpr const char tiger2[] = "🐅"; inline constexpr const char leopard[] = "🐆"; inline constexpr const char zebra[] = "🦓"; inline constexpr const char gorilla[] = "🦍"; inline constexpr const char orangutan[] = "🦧"; - inline constexpr const char elephant[] = "🐘"; inline constexpr const char mammoth[] = "🦣"; - inline constexpr const char bison[] = "🦬"; + inline constexpr const char elephant[] = "🐘"; inline constexpr const char hippopotamus[] = "🦛"; inline constexpr const char rhino[] = "🦏"; inline constexpr const char rhinoceros[] = "🦏"; @@ -1113,13 +1153,16 @@ namespace unicode_emoji { inline constexpr const char camel[] = "🐫"; inline constexpr const char giraffe[] = "🦒"; inline constexpr const char kangaroo[] = "🦘"; + inline constexpr const char bison[] = "🦬"; inline constexpr const char water_buffalo[] = "🐃"; inline constexpr const char ox[] = "🐂"; inline constexpr const char cow2[] = "🐄"; + inline constexpr const char donkey[] = "🫏"; inline constexpr const char racehorse[] = "🐎"; inline constexpr const char pig2[] = "🐖"; inline constexpr const char ram[] = "🐏"; inline constexpr const char sheep[] = "🐑"; + inline constexpr const char ewe[] = "🐑"; inline constexpr const char llama[] = "🦙"; inline constexpr const char goat[] = "🐐"; inline constexpr const char deer[] = "🦌"; @@ -1130,6 +1173,7 @@ namespace unicode_emoji { inline constexpr const char cat2[] = "🐈"; inline constexpr const char black_cat[] = "🐈‍⬛"; inline constexpr const char feather[] = "🪶"; + inline constexpr const char wing[] = "🪽"; inline constexpr const char rooster[] = "🐓"; inline constexpr const char turkey[] = "🦃"; inline constexpr const char dodo[] = "🦤"; @@ -1159,29 +1203,32 @@ namespace unicode_emoji { inline constexpr const char evergreen_tree[] = "🌲"; inline constexpr const char deciduous_tree[] = "🌳"; inline constexpr const char palm_tree[] = "🌴"; + inline constexpr const char wood[] = "🪵"; inline constexpr const char seedling[] = "🌱"; inline constexpr const char herb[] = "🌿"; inline constexpr const char shamrock[] = "☘️"; inline constexpr const char four_leaf_clover[] = "🍀"; inline constexpr const char bamboo[] = "🎍"; + inline constexpr const char potted_plant[] = "🪴"; inline constexpr const char tanabata_tree[] = "🎋"; inline constexpr const char leaves[] = "🍃"; inline constexpr const char fallen_leaf[] = "🍂"; inline constexpr const char maple_leaf[] = "🍁"; - inline constexpr const char empty_nest[] = "🪹"; inline constexpr const char nest_with_eggs[] = "🪺"; + inline constexpr const char empty_nest[] = "🪹"; inline constexpr const char mushroom[] = "🍄"; inline constexpr const char shell[] = "🐚"; + inline constexpr const char spiral_shell[] = "🐚"; inline constexpr const char coral[] = "🪸"; inline constexpr const char rock[] = "🪨"; - inline constexpr const char wood[] = "🪵"; inline constexpr const char ear_of_rice[] = "🌾"; - inline constexpr const char potted_plant[] = "🪴"; + inline constexpr const char sheaf_of_rice[] = "🌾"; inline constexpr const char bouquet[] = "💐"; inline constexpr const char tulip[] = "🌷"; inline constexpr const char rose[] = "🌹"; inline constexpr const char wilted_rose[] = "🥀"; inline constexpr const char wilted_flower[] = "🥀"; + inline constexpr const char hyacinth[] = "🪻"; inline constexpr const char lotus[] = "🪷"; inline constexpr const char hibiscus[] = "🌺"; inline constexpr const char cherry_blossom[] = "🌸"; @@ -1192,6 +1239,7 @@ namespace unicode_emoji { inline constexpr const char first_quarter_moon_with_face[] = "🌛"; inline constexpr const char last_quarter_moon_with_face[] = "🌜"; inline constexpr const char new_moon_with_face[] = "🌚"; + inline constexpr const char new_moon_face[] = "🌚"; inline constexpr const char full_moon[] = "🌕"; inline constexpr const char waning_gibbous_moon[] = "🌖"; inline constexpr const char last_quarter_moon[] = "🌗"; @@ -1208,16 +1256,21 @@ namespace unicode_emoji { inline constexpr const char dizzy[] = "💫"; inline constexpr const char star[] = "⭐"; inline constexpr const char star2[] = "🌟"; + inline constexpr const char glowing_star[] = "🌟"; inline constexpr const char sparkles[] = "✨"; inline constexpr const char zap[] = "⚡"; + inline constexpr const char high_voltage[] = "⚡"; inline constexpr const char comet[] = "☄️"; inline constexpr const char boom[] = "💥"; + inline constexpr const char collision[] = "💥"; inline constexpr const char fire[] = "🔥"; inline constexpr const char flame[] = "🔥"; inline constexpr const char cloud_tornado[] = "🌪️"; inline constexpr const char cloud_with_tornado[] = "🌪️"; + inline constexpr const char tornado[] = "🌪️"; inline constexpr const char rainbow[] = "🌈"; inline constexpr const char sunny[] = "☀️"; + inline constexpr const char sun[] = "☀️"; inline constexpr const char white_sun_small_cloud[] = "🌤️"; inline constexpr const char white_sun_with_small_cloud[] = "🌤️"; inline constexpr const char partly_sunny[] = "⛅"; @@ -1238,13 +1291,16 @@ namespace unicode_emoji { inline constexpr const char snowman2[] = "☃️"; inline constexpr const char snowman[] = "⛄"; inline constexpr const char wind_blowing_face[] = "🌬️"; + inline constexpr const char wind_face[] = "🌬️"; inline constexpr const char dash[] = "💨"; + inline constexpr const char dashing_away[] = "💨"; inline constexpr const char droplet[] = "💧"; inline constexpr const char sweat_drops[] = "💦"; inline constexpr const char bubbles[] = "🫧"; inline constexpr const char umbrella[] = "☔"; inline constexpr const char umbrella2[] = "☂️"; inline constexpr const char ocean[] = "🌊"; + inline constexpr const char water_wave[] = "🌊"; inline constexpr const char fog[] = "🌫️"; inline constexpr const char watch[] = "⌚"; inline constexpr const char mobile_phone[] = "📱"; @@ -1260,11 +1316,15 @@ namespace unicode_emoji { inline constexpr const char trackball[] = "🖲️"; inline constexpr const char joystick[] = "🕹️"; inline constexpr const char compression[] = "🗜️"; + inline constexpr const char clamp[] = "🗜️"; inline constexpr const char minidisc[] = "💽"; + inline constexpr const char computer_disk[] = "💽"; inline constexpr const char floppy_disk[] = "💾"; inline constexpr const char cd[] = "💿"; + inline constexpr const char optical_disk[] = "💿"; inline constexpr const char dvd[] = "📀"; inline constexpr const char vhs[] = "📼"; + inline constexpr const char videocassette[] = "📼"; inline constexpr const char camera[] = "📷"; inline constexpr const char camera_with_flash[] = "📸"; inline constexpr const char video_camera[] = "📹"; @@ -1276,7 +1336,9 @@ namespace unicode_emoji { inline constexpr const char telephone[] = "☎️"; inline constexpr const char pager[] = "📟"; inline constexpr const char fax[] = "📠"; + inline constexpr const char fax_machine[] = "📠"; inline constexpr const char tv[] = "📺"; + inline constexpr const char television[] = "📺"; inline constexpr const char radio[] = "📻"; inline constexpr const char microphone2[] = "🎙️"; inline constexpr const char studio_microphone[] = "🎙️"; @@ -1296,6 +1358,7 @@ namespace unicode_emoji { inline constexpr const char low_battery[] = "🪫"; inline constexpr const char electric_plug[] = "🔌"; inline constexpr const char bulb[] = "💡"; + inline constexpr const char light_bulb[] = "💡"; inline constexpr const char flashlight[] = "🔦"; inline constexpr const char candle[] = "🕯️"; inline constexpr const char diya_lamp[] = "🪔"; @@ -1305,14 +1368,19 @@ namespace unicode_emoji { inline constexpr const char money_with_wings[] = "💸"; inline constexpr const char dollar[] = "💵"; inline constexpr const char yen[] = "💴"; + inline constexpr const char yen_banknote[] = "💴"; inline constexpr const char euro[] = "💶"; + inline constexpr const char euro_banknote[] = "💶"; inline constexpr const char pound[] = "💷"; inline constexpr const char coin[] = "🪙"; inline constexpr const char moneybag[] = "💰"; + inline constexpr const char money_bag[] = "💰"; inline constexpr const char credit_card[] = "💳"; inline constexpr const char identification_card[] = "🪪"; inline constexpr const char gem[] = "💎"; + inline constexpr const char gem_stone[] = "💎"; inline constexpr const char scales[] = "⚖️"; + inline constexpr const char balance_scale[] = "⚖️"; inline constexpr const char ladder[] = "🪜"; inline constexpr const char toolbox[] = "🧰"; inline constexpr const char screwdriver[] = "🪛"; @@ -1328,18 +1396,22 @@ namespace unicode_emoji { inline constexpr const char gear[] = "⚙️"; inline constexpr const char mouse_trap[] = "🪤"; inline constexpr const char bricks[] = "🧱"; + inline constexpr const char brick[] = "🧱"; inline constexpr const char chains[] = "⛓️"; inline constexpr const char magnet[] = "🧲"; inline constexpr const char gun[] = "🔫"; + inline constexpr const char pistol[] = "🔫"; inline constexpr const char bomb[] = "💣"; inline constexpr const char firecracker[] = "🧨"; inline constexpr const char axe[] = "🪓"; inline constexpr const char knife[] = "🔪"; + inline constexpr const char kitchen_knife[] = "🔪"; inline constexpr const char dagger[] = "🗡️"; inline constexpr const char dagger_knife[] = "🗡️"; inline constexpr const char crossed_swords[] = "⚔️"; inline constexpr const char shield[] = "🛡️"; inline constexpr const char smoking[] = "🚬"; + inline constexpr const char cigarette[] = "🚬"; inline constexpr const char coffin[] = "⚰️"; inline constexpr const char headstone[] = "🪦"; inline constexpr const char urn[] = "⚱️"; @@ -1350,6 +1422,7 @@ namespace unicode_emoji { inline constexpr const char nazar_amulet[] = "🧿"; inline constexpr const char hamsa[] = "🪬"; inline constexpr const char barber[] = "💈"; + inline constexpr const char barber_pole[] = "💈"; inline constexpr const char alembic[] = "⚗️"; inline constexpr const char telescope[] = "🔭"; inline constexpr const char microscope[] = "🔬"; @@ -1382,9 +1455,11 @@ namespace unicode_emoji { inline constexpr const char soap[] = "🧼"; inline constexpr const char toothbrush[] = "🪥"; inline constexpr const char razor[] = "🪒"; + inline constexpr const char hair_pick[] = "🪮"; inline constexpr const char sponge[] = "🧽"; inline constexpr const char bucket[] = "🪣"; inline constexpr const char squeeze_bottle[] = "🧴"; + inline constexpr const char lotion_bottle[] = "🧴"; inline constexpr const char bellhop[] = "🛎️"; inline constexpr const char bellhop_bell[] = "🛎️"; inline constexpr const char key[] = "🔑"; @@ -1396,6 +1471,7 @@ namespace unicode_emoji { inline constexpr const char couch_and_lamp[] = "🛋️"; inline constexpr const char bed[] = "🛏️"; inline constexpr const char sleeping_accommodation[] = "🛌"; + inline constexpr const char person_in_bed[] = "🛌"; inline constexpr const char person_in_bed_tone1[] = "🛌🏻"; inline constexpr const char person_in_bed_light_skin_tone[] = "🛌🏻"; inline constexpr const char person_in_bed_tone2[] = "🛌🏼"; @@ -1416,14 +1492,18 @@ namespace unicode_emoji { inline constexpr const char shopping_cart[] = "🛒"; inline constexpr const char shopping_trolley[] = "🛒"; inline constexpr const char gift[] = "🎁"; + inline constexpr const char wrapped_gift[] = "🎁"; inline constexpr const char balloon[] = "🎈"; inline constexpr const char flags[] = "🎏"; + inline constexpr const char carp_streamer[] = "🎏"; inline constexpr const char ribbon[] = "🎀"; inline constexpr const char magic_wand[] = "🪄"; inline constexpr const char pinata[] = "🪅"; inline constexpr const char confetti_ball[] = "🎊"; inline constexpr const char tada[] = "🎉"; + inline constexpr const char party_popper[] = "🎉"; inline constexpr const char dolls[] = "🎎"; + inline constexpr const char folding_hand_fan[] = "🪭"; inline constexpr const char izakaya_lantern[] = "🏮"; inline constexpr const char wind_chime[] = "🎐"; inline constexpr const char mirror_ball[] = "🪩"; @@ -1483,6 +1563,7 @@ namespace unicode_emoji { inline constexpr const char orange_book[] = "📙"; inline constexpr const char books[] = "📚"; inline constexpr const char book[] = "📖"; + inline constexpr const char open_book[] = "📖"; inline constexpr const char bookmark[] = "🔖"; inline constexpr const char safety_pin[] = "🧷"; inline constexpr const char link[] = "🔗"; @@ -1497,8 +1578,10 @@ namespace unicode_emoji { inline constexpr const char scissors[] = "✂️"; inline constexpr const char pen_ballpoint[] = "🖊️"; inline constexpr const char lower_left_ballpoint_pen[] = "🖊️"; + inline constexpr const char pen[] = "🖊️"; inline constexpr const char pen_fountain[] = "🖋️"; inline constexpr const char lower_left_fountain_pen[] = "🖋️"; + inline constexpr const char fountain_pen[] = "🖋️"; inline constexpr const char black_nib[] = "✒️"; inline constexpr const char paintbrush[] = "🖌️"; inline constexpr const char lower_left_paintbrush[] = "🖌️"; @@ -1512,8 +1595,11 @@ namespace unicode_emoji { inline constexpr const char lock_with_ink_pen[] = "🔏"; inline constexpr const char closed_lock_with_key[] = "🔐"; inline constexpr const char lock[] = "🔒"; + inline constexpr const char locked[] = "🔒"; inline constexpr const char unlock[] = "🔓"; + inline constexpr const char unlocked[] = "🔓"; inline constexpr const char grinning[] = "😀"; + inline constexpr const char grinning_face[] = "😀"; inline constexpr const char smiley[] = "😃"; inline constexpr const char smile[] = "😄"; inline constexpr const char grin[] = "😁"; @@ -1526,6 +1612,7 @@ namespace unicode_emoji { inline constexpr const char rolling_on_the_floor_laughing[] = "🤣"; inline constexpr const char smiling_face_with_tear[] = "🥲"; inline constexpr const char relaxed[] = "☺️"; + inline constexpr const char smiling_face[] = "☺️"; inline constexpr const char blush[] = "😊"; inline constexpr const char innocent[] = "😇"; inline constexpr const char slight_smile[] = "🙂"; @@ -1533,11 +1620,14 @@ namespace unicode_emoji { inline constexpr const char upside_down[] = "🙃"; inline constexpr const char upside_down_face[] = "🙃"; inline constexpr const char wink[] = "😉"; + inline constexpr const char winking_face[] = "😉"; inline constexpr const char relieved[] = "😌"; + inline constexpr const char relieved_face[] = "😌"; inline constexpr const char heart_eyes[] = "😍"; inline constexpr const char smiling_face_with_3_hearts[] = "🥰"; inline constexpr const char kissing_heart[] = "😘"; inline constexpr const char kissing[] = "😗"; + inline constexpr const char kissing_face[] = "😗"; inline constexpr const char kissing_smiling_eyes[] = "😙"; inline constexpr const char kissing_closed_eyes[] = "😚"; inline constexpr const char yum[] = "😋"; @@ -1554,33 +1644,45 @@ namespace unicode_emoji { inline constexpr const char star_struck[] = "🤩"; inline constexpr const char partying_face[] = "🥳"; inline constexpr const char smirk[] = "😏"; + inline constexpr const char smirking_face[] = "😏"; inline constexpr const char unamused[] = "😒"; + inline constexpr const char unamused_face[] = "😒"; inline constexpr const char disappointed[] = "😞"; inline constexpr const char pensive[] = "😔"; + inline constexpr const char pensive_face[] = "😔"; inline constexpr const char worried[] = "😟"; + inline constexpr const char worried_face[] = "😟"; inline constexpr const char confused[] = "😕"; + inline constexpr const char confused_face[] = "😕"; inline constexpr const char slight_frown[] = "🙁"; inline constexpr const char slightly_frowning_face[] = "🙁"; inline constexpr const char frowning2[] = "☹️"; inline constexpr const char white_frowning_face[] = "☹️"; + inline constexpr const char frowning_face[] = "☹️"; inline constexpr const char persevere[] = "😣"; inline constexpr const char confounded[] = "😖"; inline constexpr const char tired_face[] = "😫"; inline constexpr const char weary[] = "😩"; + inline constexpr const char weary_face[] = "😩"; inline constexpr const char pleading_face[] = "🥺"; inline constexpr const char cry[] = "😢"; + inline constexpr const char crying_face[] = "😢"; inline constexpr const char sob[] = "😭"; inline constexpr const char triumph[] = "😤"; inline constexpr const char angry[] = "😠"; + inline constexpr const char angry_face[] = "😠"; inline constexpr const char rage[] = "😡"; + inline constexpr const char pouting_face[] = "😡"; inline constexpr const char face_with_symbols_over_mouth[] = "🤬"; inline constexpr const char exploding_head[] = "🤯"; inline constexpr const char flushed[] = "😳"; + inline constexpr const char flushed_face[] = "😳"; inline constexpr const char hot_face[] = "🥵"; inline constexpr const char cold_face[] = "🥶"; inline constexpr const char face_in_clouds[] = "😶‍🌫️"; inline constexpr const char scream[] = "😱"; inline constexpr const char fearful[] = "😨"; + inline constexpr const char fearful_face[] = "😨"; inline constexpr const char cold_sweat[] = "😰"; inline constexpr const char disappointed_relieved[] = "😥"; inline constexpr const char sweat[] = "😓"; @@ -1601,19 +1703,23 @@ namespace unicode_emoji { inline constexpr const char neutral_face[] = "😐"; inline constexpr const char face_with_diagonal_mouth[] = "🫤"; inline constexpr const char expressionless[] = "😑"; + inline constexpr const char shaking_face[] = "🫨"; inline constexpr const char grimacing[] = "😬"; inline constexpr const char rolling_eyes[] = "🙄"; inline constexpr const char face_with_rolling_eyes[] = "🙄"; inline constexpr const char hushed[] = "😯"; + inline constexpr const char hushed_face[] = "😯"; inline constexpr const char frowning[] = "😦"; inline constexpr const char anguished[] = "😧"; inline constexpr const char open_mouth[] = "😮"; inline constexpr const char astonished[] = "😲"; inline constexpr const char yawning_face[] = "🥱"; inline constexpr const char sleeping[] = "😴"; + inline constexpr const char sleeping_face[] = "😴"; inline constexpr const char drooling_face[] = "🤤"; inline constexpr const char drool[] = "🤤"; inline constexpr const char sleepy[] = "😪"; + inline constexpr const char sleepy_face[] = "😪"; inline constexpr const char face_exhaling[] = "😮‍💨"; inline constexpr const char dizzy_face[] = "😵"; inline constexpr const char face_with_spiral_eyes[] = "😵‍💫"; @@ -1637,13 +1743,16 @@ namespace unicode_emoji { inline constexpr const char smiling_imp[] = "😈"; inline constexpr const char imp[] = "👿"; inline constexpr const char japanese_ogre[] = "👹"; + inline constexpr const char ogre[] = "👹"; inline constexpr const char japanese_goblin[] = "👺"; + inline constexpr const char goblin[] = "👺"; inline constexpr const char clown[] = "🤡"; inline constexpr const char clown_face[] = "🤡"; inline constexpr const char poop[] = "💩"; inline constexpr const char shit[] = "💩"; inline constexpr const char hankey[] = "💩"; inline constexpr const char poo[] = "💩"; + inline constexpr const char pile_of_poo[] = "💩"; inline constexpr const char ghost[] = "👻"; inline constexpr const char skull[] = "💀"; inline constexpr const char skeleton[] = "💀"; @@ -1651,17 +1760,21 @@ namespace unicode_emoji { inline constexpr const char skull_and_crossbones[] = "☠️"; inline constexpr const char alien[] = "👽"; inline constexpr const char space_invader[] = "👾"; + inline constexpr const char alien_monster[] = "👾"; inline constexpr const char robot[] = "🤖"; inline constexpr const char robot_face[] = "🤖"; inline constexpr const char jack_o_lantern[] = "🎃"; inline constexpr const char smiley_cat[] = "😺"; + inline constexpr const char grinning_cat[] = "😺"; inline constexpr const char smile_cat[] = "😸"; inline constexpr const char joy_cat[] = "😹"; inline constexpr const char heart_eyes_cat[] = "😻"; inline constexpr const char smirk_cat[] = "😼"; inline constexpr const char kissing_cat[] = "😽"; inline constexpr const char scream_cat[] = "🙀"; + inline constexpr const char weary_cat[] = "🙀"; inline constexpr const char crying_cat_face[] = "😿"; + inline constexpr const char crying_cat[] = "😿"; inline constexpr const char pouting_cat[] = "😾"; inline constexpr const char heart_hands[] = "🫶"; inline constexpr const char heart_hands_tone1[] = "🫶🏻"; @@ -1692,6 +1805,7 @@ namespace unicode_emoji { inline constexpr const char open_hands_tone4[] = "👐🏾"; inline constexpr const char open_hands_tone5[] = "👐🏿"; inline constexpr const char raised_hands[] = "🙌"; + inline constexpr const char raising_hands[] = "🙌"; inline constexpr const char raised_hands_tone1[] = "🙌🏻"; inline constexpr const char raised_hands_tone2[] = "🙌🏼"; inline constexpr const char raised_hands_tone3[] = "🙌🏽"; @@ -1705,6 +1819,7 @@ namespace unicode_emoji { inline constexpr const char clap_tone5[] = "👏🏿"; inline constexpr const char handshake[] = "🤝"; inline constexpr const char shaking_hands[] = "🤝"; + inline constexpr const char handshake_tone1[] = "🤝🏻"; inline constexpr const char handshake_light_skin_tone[] = "🤝🏻"; inline constexpr const char handshake_tone1_tone2[] = "🫱🏻‍🫲🏼"; inline constexpr const char handshake_light_skin_tone_medium_light_skin_tone[] = "🫱🏻‍🫲🏼"; @@ -1716,6 +1831,7 @@ namespace unicode_emoji { inline constexpr const char handshake_light_skin_tone_dark_skin_tone[] = "🫱🏻‍🫲🏿"; inline constexpr const char handshake_tone2_tone1[] = "🫱🏼‍🫲🏻"; inline constexpr const char handshake_medium_light_skin_tone_light_skin_tone[] = "🫱🏼‍🫲🏻"; + inline constexpr const char handshake_tone2[] = "🤝🏼"; inline constexpr const char handshake_medium_light_skin_tone[] = "🤝🏼"; inline constexpr const char handshake_tone2_tone3[] = "🫱🏼‍🫲🏽"; inline constexpr const char handshake_medium_light_skin_tone_medium_skin_tone[] = "🫱🏼‍🫲🏽"; @@ -1727,6 +1843,7 @@ namespace unicode_emoji { inline constexpr const char handshake_medium_skin_tone_light_skin_tone[] = "🫱🏽‍🫲🏻"; inline constexpr const char handshake_tone3_tone2[] = "🫱🏽‍🫲🏼"; inline constexpr const char handshake_medium_skin_tone_medium_light_skin_tone[] = "🫱🏽‍🫲🏼"; + inline constexpr const char handshake_tone3[] = "🤝🏽"; inline constexpr const char handshake_medium_skin_tone[] = "🤝🏽"; inline constexpr const char handshake_tone3_tone4[] = "🫱🏽‍🫲🏾"; inline constexpr const char handshake_medium_skin_tone_medium_dark_skin_tone[] = "🫱🏽‍🫲🏾"; @@ -1738,6 +1855,7 @@ namespace unicode_emoji { inline constexpr const char handshake_medium_dark_skin_tone_medium_light_skin_tone[] = "🫱🏾‍🫲🏼"; inline constexpr const char handshake_tone4_tone3[] = "🫱🏾‍🫲🏽"; inline constexpr const char handshake_medium_dark_skin_tone_medium_skin_tone[] = "🫱🏾‍🫲🏽"; + inline constexpr const char handshake_tone4[] = "🤝🏾"; inline constexpr const char handshake_medium_dark_skin_tone[] = "🤝🏾"; inline constexpr const char handshake_tone4_tone5[] = "🫱🏾‍🫲🏿"; inline constexpr const char handshake_medium_dark_skin_tone_dark_skin_tone[] = "🫱🏾‍🫲🏿"; @@ -1749,10 +1867,12 @@ namespace unicode_emoji { inline constexpr const char handshake_dark_skin_tone_medium_skin_tone[] = "🫱🏿‍🫲🏽"; inline constexpr const char handshake_tone5_tone4[] = "🫱🏿‍🫲🏾"; inline constexpr const char handshake_dark_skin_tone_medium_dark_skin_tone[] = "🫱🏿‍🫲🏾"; + inline constexpr const char handshake_tone5[] = "🤝🏿"; inline constexpr const char handshake_dark_skin_tone[] = "🤝🏿"; inline constexpr const char thumbsup[] = "👍"; inline constexpr const char plus1[] = "👍"; inline constexpr const char thumbup[] = "👍"; + inline constexpr const char thumbs_up[] = "👍"; inline constexpr const char thumbsup_tone1[] = "👍🏻"; inline constexpr const char plus1_tone1[] = "👍🏻"; inline constexpr const char thumbup_tone1[] = "👍🏻"; @@ -1771,6 +1891,7 @@ namespace unicode_emoji { inline constexpr const char thumbsdown[] = "👎"; inline constexpr const char minus1[] = "👎"; inline constexpr const char thumbdown[] = "👎"; + inline constexpr const char thumbs_down[] = "👎"; inline constexpr const char thumbsdown_tone1[] = "👎🏻"; inline constexpr const char _1_tone1[] = "👎🏻"; inline constexpr const char thumbdown_tone1[] = "👎🏻"; @@ -1787,12 +1908,14 @@ namespace unicode_emoji { inline constexpr const char _1_tone5[] = "👎🏿"; inline constexpr const char thumbdown_tone5[] = "👎🏿"; inline constexpr const char punch[] = "👊"; + inline constexpr const char oncoming_fist[] = "👊"; inline constexpr const char punch_tone1[] = "👊🏻"; inline constexpr const char punch_tone2[] = "👊🏼"; inline constexpr const char punch_tone3[] = "👊🏽"; inline constexpr const char punch_tone4[] = "👊🏾"; inline constexpr const char punch_tone5[] = "👊🏿"; inline constexpr const char fist[] = "✊"; + inline constexpr const char raised_fist[] = "✊"; inline constexpr const char fist_tone1[] = "✊🏻"; inline constexpr const char fist_tone2[] = "✊🏼"; inline constexpr const char fist_tone3[] = "✊🏽"; @@ -1822,6 +1945,28 @@ namespace unicode_emoji { inline constexpr const char right_fist_tone4[] = "🤜🏾"; inline constexpr const char right_facing_fist_tone5[] = "🤜🏿"; inline constexpr const char right_fist_tone5[] = "🤜🏿"; + inline constexpr const char leftwards_pushing_hand[] = "🫷"; + inline constexpr const char leftwards_pushing_hand_tone1[] = "🫷🏻"; + inline constexpr const char leftwards_pushing_hand_light_skin_tone[] = "🫷🏻"; + inline constexpr const char leftwards_pushing_hand_tone2[] = "🫷🏼"; + inline constexpr const char leftwards_pushing_hand_medium_light_skin_tone[] = "🫷🏼"; + inline constexpr const char leftwards_pushing_hand_tone3[] = "🫷🏽"; + inline constexpr const char leftwards_pushing_hand_medium_skin_tone[] = "🫷🏽"; + inline constexpr const char leftwards_pushing_hand_tone4[] = "🫷🏾"; + inline constexpr const char leftwards_pushing_hand_medium_dark_skin_tone[] = "🫷🏾"; + inline constexpr const char leftwards_pushing_hand_tone5[] = "🫷🏿"; + inline constexpr const char leftwards_pushing_hand_dark_skin_tone[] = "🫷🏿"; + inline constexpr const char rightwards_pushing_hand[] = "🫸"; + inline constexpr const char rightwards_pushing_hand_tone1[] = "🫸🏻"; + inline constexpr const char rightwards_pushing_hand_light_skin_tone[] = "🫸🏻"; + inline constexpr const char rightwards_pushing_hand_tone2[] = "🫸🏼"; + inline constexpr const char rightwards_pushing_hand_medium_light_skin_tone[] = "🫸🏼"; + inline constexpr const char rightwards_pushing_hand_tone3[] = "🫸🏽"; + inline constexpr const char rightwards_pushing_hand_medium_skin_tone[] = "🫸🏽"; + inline constexpr const char rightwards_pushing_hand_tone4[] = "🫸🏾"; + inline constexpr const char rightwards_pushing_hand_medium_dark_skin_tone[] = "🫸🏾"; + inline constexpr const char rightwards_pushing_hand_tone5[] = "🫸🏿"; + inline constexpr const char rightwards_pushing_hand_dark_skin_tone[] = "🫸🏿"; inline constexpr const char fingers_crossed[] = "🤞"; inline constexpr const char hand_with_index_and_middle_finger_crossed[] = "🤞"; inline constexpr const char fingers_crossed_tone1[] = "🤞🏻"; @@ -1835,6 +1980,7 @@ namespace unicode_emoji { inline constexpr const char fingers_crossed_tone5[] = "🤞🏿"; inline constexpr const char hand_with_index_and_middle_fingers_crossed_tone5[] = "🤞🏿"; inline constexpr const char v[] = "✌️"; + inline constexpr const char victory_hand[] = "✌️"; inline constexpr const char v_tone1[] = "✌🏻"; inline constexpr const char v_tone2[] = "✌🏼"; inline constexpr const char v_tone3[] = "✌🏽"; @@ -1986,6 +2132,7 @@ namespace unicode_emoji { inline constexpr const char raised_hand_with_fingers_splayed_tone5[] = "🖐🏿"; inline constexpr const char vulcan[] = "🖖"; inline constexpr const char raised_hand_with_part_between_middle_and_ring_fingers[] = "🖖"; + inline constexpr const char vulcan_salute[] = "🖖"; inline constexpr const char vulcan_tone1[] = "🖖🏻"; inline constexpr const char raised_hand_with_part_between_middle_and_ring_fingers_tone1[] = "🖖🏻"; inline constexpr const char vulcan_tone2[] = "🖖🏼"; @@ -1997,6 +2144,7 @@ namespace unicode_emoji { inline constexpr const char vulcan_tone5[] = "🖖🏿"; inline constexpr const char raised_hand_with_part_between_middle_and_ring_fingers_tone5[] = "🖖🏿"; inline constexpr const char wave[] = "👋"; + inline constexpr const char waving_hand[] = "👋"; inline constexpr const char wave_tone1[] = "👋🏻"; inline constexpr const char wave_tone2[] = "👋🏼"; inline constexpr const char wave_tone3[] = "👋🏽"; @@ -2037,6 +2185,7 @@ namespace unicode_emoji { inline constexpr const char rightwards_hand_tone5[] = "🫱🏿"; inline constexpr const char rightwards_hand_dark_skin_tone[] = "🫱🏿"; inline constexpr const char muscle[] = "💪"; + inline constexpr const char flexed_biceps[] = "💪"; inline constexpr const char muscle_tone1[] = "💪🏻"; inline constexpr const char muscle_tone2[] = "💪🏼"; inline constexpr const char muscle_tone3[] = "💪🏽"; @@ -2062,6 +2211,7 @@ namespace unicode_emoji { inline constexpr const char writing_hand_tone4[] = "✍🏾"; inline constexpr const char writing_hand_tone5[] = "✍🏿"; inline constexpr const char pray[] = "🙏"; + inline constexpr const char folded_hands[] = "🙏"; inline constexpr const char pray_tone1[] = "🙏🏻"; inline constexpr const char pray_tone2[] = "🙏🏼"; inline constexpr const char pray_tone3[] = "🙏🏽"; @@ -2103,7 +2253,9 @@ namespace unicode_emoji { inline constexpr const char mechanical_leg[] = "🦿"; inline constexpr const char lipstick[] = "💄"; inline constexpr const char kiss[] = "💋"; + inline constexpr const char kiss_mark[] = "💋"; inline constexpr const char lips[] = "👄"; + inline constexpr const char mouth[] = "👄"; inline constexpr const char biting_lip[] = "🫦"; inline constexpr const char tooth[] = "🦷"; inline constexpr const char tongue[] = "👅"; @@ -2171,6 +2323,7 @@ namespace unicode_emoji { inline constexpr const char boy_tone4[] = "👦🏾"; inline constexpr const char boy_tone5[] = "👦🏿"; inline constexpr const char adult[] = "🧑"; + inline constexpr const char person[] = "🧑"; inline constexpr const char adult_tone1[] = "🧑🏻"; inline constexpr const char adult_light_skin_tone[] = "🧑🏻"; inline constexpr const char adult_tone2[] = "🧑🏼"; @@ -2249,6 +2402,7 @@ namespace unicode_emoji { inline constexpr const char woman_red_haired_tone5[] = "👩🏿‍🦰"; inline constexpr const char woman_red_haired_dark_skin_tone[] = "👩🏿‍🦰"; inline constexpr const char man_red_haired[] = "👨‍🦰"; + inline constexpr const char man_red_hair[] = "👨‍🦰"; inline constexpr const char man_red_haired_tone1[] = "👨🏻‍🦰"; inline constexpr const char man_red_haired_light_skin_tone[] = "👨🏻‍🦰"; inline constexpr const char man_red_haired_tone2[] = "👨🏼‍🦰"; @@ -2360,6 +2514,7 @@ namespace unicode_emoji { inline constexpr const char man_bald_tone5[] = "👨🏿‍🦲"; inline constexpr const char man_bald_dark_skin_tone[] = "👨🏿‍🦲"; inline constexpr const char bearded_person[] = "🧔"; + inline constexpr const char person_beard[] = "🧔"; inline constexpr const char bearded_person_tone1[] = "🧔🏻"; inline constexpr const char bearded_person_light_skin_tone[] = "🧔🏻"; inline constexpr const char bearded_person_tone2[] = "🧔🏼"; @@ -2393,6 +2548,7 @@ namespace unicode_emoji { inline constexpr const char man_tone5_beard[] = "🧔🏿‍♂️"; inline constexpr const char man_dark_skin_tone_beard[] = "🧔🏿‍♂️"; inline constexpr const char older_adult[] = "🧓"; + inline constexpr const char older_person[] = "🧓"; inline constexpr const char older_adult_tone1[] = "🧓🏻"; inline constexpr const char older_adult_light_skin_tone[] = "🧓🏻"; inline constexpr const char older_adult_tone2[] = "🧓🏼"; @@ -2405,6 +2561,7 @@ namespace unicode_emoji { inline constexpr const char older_adult_dark_skin_tone[] = "🧓🏿"; inline constexpr const char older_woman[] = "👵"; inline constexpr const char grandma[] = "👵"; + inline constexpr const char old_woman[] = "👵"; inline constexpr const char older_woman_tone1[] = "👵🏻"; inline constexpr const char grandma_tone1[] = "👵🏻"; inline constexpr const char older_woman_tone2[] = "👵🏼"; @@ -2416,6 +2573,7 @@ namespace unicode_emoji { inline constexpr const char older_woman_tone5[] = "👵🏿"; inline constexpr const char grandma_tone5[] = "👵🏿"; inline constexpr const char older_man[] = "👴"; + inline constexpr const char old_man[] = "👴"; inline constexpr const char older_man_tone1[] = "👴🏻"; inline constexpr const char older_man_tone2[] = "👴🏼"; inline constexpr const char older_man_tone3[] = "👴🏽"; @@ -3328,6 +3486,7 @@ namespace unicode_emoji { inline constexpr const char mrs_claus_tone5[] = "🤶🏿"; inline constexpr const char mother_christmas_tone5[] = "🤶🏿"; inline constexpr const char santa[] = "🎅"; + inline constexpr const char santa_claus[] = "🎅"; inline constexpr const char santa_tone1[] = "🎅🏻"; inline constexpr const char santa_tone2[] = "🎅🏼"; inline constexpr const char santa_tone3[] = "🎅🏽"; @@ -3506,6 +3665,7 @@ namespace unicode_emoji { inline constexpr const char man_fairy_tone5[] = "🧚🏿‍♂️"; inline constexpr const char man_fairy_dark_skin_tone[] = "🧚🏿‍♂️"; inline constexpr const char angel[] = "👼"; + inline constexpr const char baby_angel[] = "👼"; inline constexpr const char angel_tone1[] = "👼🏻"; inline constexpr const char angel_tone2[] = "👼🏼"; inline constexpr const char angel_tone3[] = "👼🏽"; @@ -4024,6 +4184,7 @@ namespace unicode_emoji { inline constexpr const char man_in_steamy_room_tone5[] = "🧖🏿‍♂️"; inline constexpr const char man_in_steamy_room_dark_skin_tone[] = "🧖🏿‍♂️"; inline constexpr const char nail_care[] = "💅"; + inline constexpr const char nail_polish[] = "💅"; inline constexpr const char nail_care_tone1[] = "💅🏻"; inline constexpr const char nail_care_tone2[] = "💅🏼"; inline constexpr const char nail_care_tone3[] = "💅🏽"; @@ -4036,6 +4197,7 @@ namespace unicode_emoji { inline constexpr const char selfie_tone4[] = "🤳🏾"; inline constexpr const char selfie_tone5[] = "🤳🏿"; inline constexpr const char dancer[] = "💃"; + inline constexpr const char woman_dancing[] = "💃"; inline constexpr const char dancer_tone1[] = "💃🏻"; inline constexpr const char dancer_tone2[] = "💃🏼"; inline constexpr const char dancer_tone3[] = "💃🏽"; @@ -4873,6 +5035,7 @@ namespace unicode_emoji { inline constexpr const char kiss_woman_woman_dark_skin_tone[] = "👩🏿‍❤️‍💋‍👩🏿"; inline constexpr const char kiss_mm[] = "👨‍❤️‍💋‍👨"; inline constexpr const char couplekiss_mm[] = "👨‍❤️‍💋‍👨"; + inline constexpr const char kiss_man_man[] = "👨‍❤️‍💋‍👨"; inline constexpr const char kiss_man_man_tone1[] = "👨🏻‍❤️‍💋‍👨🏻"; inline constexpr const char kiss_man_man_light_skin_tone[] = "👨🏻‍❤️‍💋‍👨🏻"; inline constexpr const char kiss_man_man_tone1_tone2[] = "👨🏻‍❤️‍💋‍👨🏼"; @@ -4958,6 +5121,7 @@ namespace unicode_emoji { inline constexpr const char safety_vest[] = "🦺"; inline constexpr const char womans_clothes[] = "👚"; inline constexpr const char shirt[] = "👕"; + inline constexpr const char t_shirt[] = "👕"; inline constexpr const char jeans[] = "👖"; inline constexpr const char briefs[] = "🩲"; inline constexpr const char shorts[] = "🩳"; @@ -4969,16 +5133,21 @@ namespace unicode_emoji { inline constexpr const char sari[] = "🥻"; inline constexpr const char thong_sandal[] = "🩴"; inline constexpr const char womans_flat_shoe[] = "🥿"; + inline constexpr const char flat_shoe[] = "🥿"; inline constexpr const char high_heel[] = "👠"; inline constexpr const char sandal[] = "👡"; + inline constexpr const char womans_sandal[] = "👡"; inline constexpr const char boot[] = "👢"; + inline constexpr const char womans_boot[] = "👢"; inline constexpr const char mans_shoe[] = "👞"; inline constexpr const char athletic_shoe[] = "👟"; + inline constexpr const char running_shoe[] = "👟"; inline constexpr const char hiking_boot[] = "🥾"; inline constexpr const char socks[] = "🧦"; inline constexpr const char gloves[] = "🧤"; inline constexpr const char scarf[] = "🧣"; inline constexpr const char tophat[] = "🎩"; + inline constexpr const char top_hat[] = "🎩"; inline constexpr const char billed_cap[] = "🧢"; inline constexpr const char womans_hat[] = "👒"; inline constexpr const char mortar_board[] = "🎓"; @@ -4988,31 +5157,40 @@ namespace unicode_emoji { inline constexpr const char crown[] = "👑"; inline constexpr const char ring[] = "💍"; inline constexpr const char pouch[] = "👝"; + inline constexpr const char clutch_bag[] = "👝"; inline constexpr const char purse[] = "👛"; inline constexpr const char handbag[] = "👜"; inline constexpr const char briefcase[] = "💼"; inline constexpr const char school_satchel[] = "🎒"; + inline constexpr const char backpack[] = "🎒"; inline constexpr const char luggage[] = "🧳"; inline constexpr const char eyeglasses[] = "👓"; + inline constexpr const char glasses[] = "👓"; inline constexpr const char dark_sunglasses[] = "🕶️"; inline constexpr const char goggles[] = "🥽"; inline constexpr const char closed_umbrella[] = "🌂"; + inline constexpr const char pink_heart[] = "🩷"; inline constexpr const char heart[] = "❤️"; + inline constexpr const char red_heart[] = "❤️"; inline constexpr const char orange_heart[] = "🧡"; inline constexpr const char yellow_heart[] = "💛"; inline constexpr const char green_heart[] = "💚"; + inline constexpr const char light_blue_heart[] = "🩵"; inline constexpr const char blue_heart[] = "💙"; inline constexpr const char purple_heart[] = "💜"; inline constexpr const char black_heart[] = "🖤"; - inline constexpr const char brown_heart[] = "🤎"; + inline constexpr const char grey_heart[] = "🩶"; inline constexpr const char white_heart[] = "🤍"; + inline constexpr const char brown_heart[] = "🤎"; inline constexpr const char broken_heart[] = "💔"; inline constexpr const char heart_exclamation[] = "❣️"; inline constexpr const char heavy_heart_exclamation_mark_ornament[] = "❣️"; inline constexpr const char two_hearts[] = "💕"; inline constexpr const char revolving_hearts[] = "💞"; inline constexpr const char heartbeat[] = "💓"; + inline constexpr const char beating_heart[] = "💓"; inline constexpr const char heartpulse[] = "💗"; + inline constexpr const char growing_heart[] = "💗"; inline constexpr const char sparkling_heart[] = "💖"; inline constexpr const char cupid[] = "💘"; inline constexpr const char gift_heart[] = "💝"; @@ -5026,6 +5204,7 @@ namespace unicode_emoji { inline constexpr const char star_and_crescent[] = "☪️"; inline constexpr const char om_symbol[] = "🕉️"; inline constexpr const char wheel_of_dharma[] = "☸️"; + inline constexpr const char khanda[] = "🪯"; inline constexpr const char star_of_david[] = "✡️"; inline constexpr const char six_pointed_star[] = "🔯"; inline constexpr const char menorah[] = "🕎"; @@ -5042,6 +5221,7 @@ namespace unicode_emoji { inline constexpr const char virgo[] = "♍"; inline constexpr const char libra[] = "♎"; inline constexpr const char scorpius[] = "♏"; + inline constexpr const char scorpio[] = "♏"; inline constexpr const char sagittarius[] = "♐"; inline constexpr const char capricorn[] = "♑"; inline constexpr const char aquarius[] = "♒"; @@ -5078,16 +5258,20 @@ namespace unicode_emoji { inline constexpr const char o2[] = "🅾️"; inline constexpr const char sos[] = "🆘"; inline constexpr const char x[] = "❌"; + inline constexpr const char cross_mark[] = "❌"; inline constexpr const char o[] = "⭕"; inline constexpr const char octagonal_sign[] = "🛑"; inline constexpr const char stop_sign[] = "🛑"; inline constexpr const char no_entry[] = "⛔"; inline constexpr const char name_badge[] = "📛"; inline constexpr const char no_entry_sign[] = "🚫"; + inline constexpr const char prohibited[] = "🚫"; inline constexpr const char anger[] = "💢"; inline constexpr const char hotsprings[] = "♨️"; + inline constexpr const char hot_springs[] = "♨️"; inline constexpr const char no_pedestrians[] = "🚷"; inline constexpr const char do_not_litter[] = "🚯"; + inline constexpr const char no_littering[] = "🚯"; inline constexpr const char no_bicycles[] = "🚳"; inline constexpr const char non_potable_water[] = "🚱"; inline constexpr const char underage[] = "🔞"; @@ -5096,6 +5280,7 @@ namespace unicode_emoji { inline constexpr const char exclamation[] = "❗"; inline constexpr const char grey_exclamation[] = "❕"; inline constexpr const char question[] = "❓"; + inline constexpr const char question_mark[] = "❓"; inline constexpr const char grey_question[] = "❔"; inline constexpr const char bangbang[] = "‼️"; inline constexpr const char interrobang[] = "⁉️"; @@ -5117,29 +5302,37 @@ namespace unicode_emoji { inline constexpr const char globe_with_meridians[] = "🌐"; inline constexpr const char diamond_shape_with_a_dot_inside[] = "💠"; inline constexpr const char m[] = "Ⓜ️"; + inline constexpr const char circled_m[] = "Ⓜ️"; inline constexpr const char cyclone[] = "🌀"; inline constexpr const char zzz[] = "💤"; inline constexpr const char atm[] = "🏧"; inline constexpr const char wc[] = "🚾"; + inline constexpr const char water_closet[] = "🚾"; inline constexpr const char wheelchair[] = "♿"; inline constexpr const char parking[] = "🅿️"; + inline constexpr const char elevator[] = "🛗"; inline constexpr const char u7a7a[] = "🈳"; inline constexpr const char sa[] = "🈂️"; inline constexpr const char passport_control[] = "🛂"; inline constexpr const char customs[] = "🛃"; inline constexpr const char baggage_claim[] = "🛄"; inline constexpr const char left_luggage[] = "🛅"; - inline constexpr const char elevator[] = "🛗"; + inline constexpr const char wireless[] = "🛜"; inline constexpr const char mens[] = "🚹"; + inline constexpr const char mens_room[] = "🚹"; inline constexpr const char womens[] = "🚺"; + inline constexpr const char womens_room[] = "🚺"; inline constexpr const char baby_symbol[] = "🚼"; inline constexpr const char restroom[] = "🚻"; inline constexpr const char put_litter_in_its_place[] = "🚮"; inline constexpr const char cinema[] = "🎦"; inline constexpr const char signal_strength[] = "📶"; + inline constexpr const char antenna_bars[] = "📶"; inline constexpr const char koko[] = "🈁"; inline constexpr const char symbols[] = "🔣"; + inline constexpr const char input_symbols[] = "🔣"; inline constexpr const char information_source[] = "ℹ️"; + inline constexpr const char information[] = "ℹ️"; inline constexpr const char abc[] = "🔤"; inline constexpr const char abcd[] = "🔡"; inline constexpr const char capital_abcd[] = "🔠"; @@ -5160,6 +5353,7 @@ namespace unicode_emoji { inline constexpr const char eight[] = "8️⃣"; inline constexpr const char nine[] = "9️⃣"; inline constexpr const char keycap_ten[] = "🔟"; + inline constexpr const char input_numbers[] = "🔢"; inline constexpr const char hash[] = "#️⃣"; inline constexpr const char asterisk[] = "*️⃣"; inline constexpr const char keycap_asterisk[] = "*️⃣"; @@ -5183,14 +5377,20 @@ namespace unicode_emoji { inline constexpr const char arrow_up_small[] = "🔼"; inline constexpr const char arrow_down_small[] = "🔽"; inline constexpr const char arrow_right[] = "➡️"; + inline constexpr const char right_arrow[] = "➡️"; inline constexpr const char arrow_left[] = "⬅️"; + inline constexpr const char left_arrow[] = "⬅️"; inline constexpr const char arrow_up[] = "⬆️"; + inline constexpr const char up_arrow[] = "⬆️"; inline constexpr const char arrow_down[] = "⬇️"; + inline constexpr const char down_arrow[] = "⬇️"; inline constexpr const char arrow_upper_right[] = "↗️"; inline constexpr const char arrow_lower_right[] = "↘️"; inline constexpr const char arrow_lower_left[] = "↙️"; inline constexpr const char arrow_upper_left[] = "↖️"; + inline constexpr const char up_left_arrow[] = "↖️"; inline constexpr const char arrow_up_down[] = "↕️"; + inline constexpr const char up_down_arrow[] = "↕️"; inline constexpr const char left_right_arrow[] = "↔️"; inline constexpr const char arrow_right_hook[] = "↪️"; inline constexpr const char leftwards_arrow_with_hook[] = "↩️"; @@ -5203,6 +5403,7 @@ namespace unicode_emoji { inline constexpr const char arrows_clockwise[] = "🔃"; inline constexpr const char musical_note[] = "🎵"; inline constexpr const char notes[] = "🎶"; + inline constexpr const char musical_notes[] = "🎶"; inline constexpr const char heavy_plus_sign[] = "➕"; inline constexpr const char heavy_minus_sign[] = "➖"; inline constexpr const char heavy_division_sign[] = "➗"; @@ -5212,17 +5413,24 @@ namespace unicode_emoji { inline constexpr const char heavy_dollar_sign[] = "💲"; inline constexpr const char currency_exchange[] = "💱"; inline constexpr const char tm[] = "™️"; + inline constexpr const char trade_mark[] = "™️"; inline constexpr const char copyright[] = "©️"; inline constexpr const char registered[] = "®️"; inline constexpr const char wavy_dash[] = "〰️"; inline constexpr const char curly_loop[] = "➰"; inline constexpr const char loop[] = "➿"; inline constexpr const char end[] = "🔚"; + inline constexpr const char end_arrow[] = "🔚"; inline constexpr const char back[] = "🔙"; + inline constexpr const char back_arrow[] = "🔙"; inline constexpr const char on[] = "🔛"; + inline constexpr const char on_arrow[] = "🔛"; inline constexpr const char top[] = "🔝"; + inline constexpr const char top_arrow[] = "🔝"; inline constexpr const char soon[] = "🔜"; + inline constexpr const char soon_arrow[] = "🔜"; inline constexpr const char heavy_check_mark[] = "✔️"; + inline constexpr const char check_mark[] = "✔️"; inline constexpr const char ballot_box_with_check[] = "☑️"; inline constexpr const char radio_button[] = "🔘"; inline constexpr const char white_circle[] = "⚪"; @@ -5259,11 +5467,13 @@ namespace unicode_emoji { inline constexpr const char yellow_square[] = "🟨"; inline constexpr const char speaker[] = "🔈"; inline constexpr const char mute[] = "🔇"; + inline constexpr const char muted_speaker[] = "🔇"; inline constexpr const char sound[] = "🔉"; inline constexpr const char loud_sound[] = "🔊"; inline constexpr const char bell[] = "🔔"; inline constexpr const char no_bell[] = "🔕"; inline constexpr const char mega[] = "📣"; + inline constexpr const char megaphone[] = "📣"; inline constexpr const char loudspeaker[] = "📢"; inline constexpr const char speech_left[] = "🗨️"; inline constexpr const char left_speech_bubble[] = "🗨️"; @@ -5273,36 +5483,65 @@ namespace unicode_emoji { inline constexpr const char anger_right[] = "🗯️"; inline constexpr const char right_anger_bubble[] = "🗯️"; inline constexpr const char spades[] = "♠️"; + inline constexpr const char spade_suit[] = "♠️"; inline constexpr const char clubs[] = "♣️"; + inline constexpr const char club_suit[] = "♣️"; inline constexpr const char hearts[] = "♥️"; + inline constexpr const char heart_suit[] = "♥️"; inline constexpr const char diamonds[] = "♦️"; + inline constexpr const char diamond_suit[] = "♦️"; inline constexpr const char black_joker[] = "🃏"; + inline constexpr const char joker[] = "🃏"; inline constexpr const char flower_playing_cards[] = "🎴"; inline constexpr const char mahjong[] = "🀄"; inline constexpr const char clock1[] = "🕐"; + inline constexpr const char one_oclock[] = "🕐"; inline constexpr const char clock2[] = "🕑"; + inline constexpr const char two_oclock[] = "🕑"; inline constexpr const char clock3[] = "🕒"; + inline constexpr const char three_oclock[] = "🕒"; inline constexpr const char clock4[] = "🕓"; + inline constexpr const char four_oclock[] = "🕓"; inline constexpr const char clock5[] = "🕔"; + inline constexpr const char five_oclock[] = "🕔"; inline constexpr const char clock6[] = "🕕"; + inline constexpr const char six_oclock[] = "🕕"; inline constexpr const char clock7[] = "🕖"; + inline constexpr const char seven_oclock[] = "🕖"; inline constexpr const char clock8[] = "🕗"; + inline constexpr const char eight_oclock[] = "🕗"; inline constexpr const char clock9[] = "🕘"; + inline constexpr const char nine_oclock[] = "🕘"; inline constexpr const char clock10[] = "🕙"; + inline constexpr const char ten_oclock[] = "🕙"; inline constexpr const char clock11[] = "🕚"; + inline constexpr const char eleven_oclock[] = "🕚"; inline constexpr const char clock12[] = "🕛"; + inline constexpr const char twelve_oclock[] = "🕛"; inline constexpr const char clock130[] = "🕜"; + inline constexpr const char one_thirty[] = "🕜"; inline constexpr const char clock230[] = "🕝"; + inline constexpr const char two_thirty[] = "🕝"; inline constexpr const char clock330[] = "🕞"; + inline constexpr const char three_thirty[] = "🕞"; inline constexpr const char clock430[] = "🕟"; + inline constexpr const char four_thirty[] = "🕟"; inline constexpr const char clock530[] = "🕠"; + inline constexpr const char five_thirty[] = "🕠"; inline constexpr const char clock630[] = "🕡"; + inline constexpr const char six_thirty[] = "🕡"; inline constexpr const char clock730[] = "🕢"; + inline constexpr const char seven_thirty[] = "🕢"; inline constexpr const char clock830[] = "🕣"; + inline constexpr const char eight_thirty[] = "🕣"; inline constexpr const char clock930[] = "🕤"; + inline constexpr const char nine_thirty[] = "🕤"; inline constexpr const char clock1030[] = "🕥"; + inline constexpr const char ten_thirty[] = "🕥"; inline constexpr const char clock1130[] = "🕦"; + inline constexpr const char eleven_thirty[] = "🕦"; inline constexpr const char clock1230[] = "🕧"; + inline constexpr const char twelve_thirty[] = "🕧"; inline constexpr const char female_sign[] = "♀️"; inline constexpr const char male_sign[] = "♂️"; inline constexpr const char transgender_symbol[] = "⚧"; @@ -5334,9 +5573,11 @@ namespace unicode_emoji { inline constexpr const char regional_indicator_b[] = "🇧"; inline constexpr const char regional_indicator_a[] = "🇦"; inline constexpr const char red_car[] = "🚗"; + inline constexpr const char automobile[] = "🚗"; inline constexpr const char taxi[] = "🚕"; inline constexpr const char blue_car[] = "🚙"; inline constexpr const char pickup_truck[] = "🛻"; + inline constexpr const char minibus[] = "🚐"; inline constexpr const char bus[] = "🚌"; inline constexpr const char trolleybus[] = "🚎"; inline constexpr const char race_car[] = "🏎️"; @@ -5344,16 +5585,17 @@ namespace unicode_emoji { inline constexpr const char police_car[] = "🚓"; inline constexpr const char ambulance[] = "🚑"; inline constexpr const char fire_engine[] = "🚒"; - inline constexpr const char minibus[] = "🚐"; inline constexpr const char truck[] = "🚚"; inline constexpr const char articulated_lorry[] = "🚛"; inline constexpr const char tractor[] = "🚜"; inline constexpr const char probing_cane[] = "🦯"; - inline constexpr const char crutch[] = "🩼"; inline constexpr const char manual_wheelchair[] = "🦽"; inline constexpr const char motorized_wheelchair[] = "🦼"; + inline constexpr const char crutch[] = "🩼"; inline constexpr const char scooter[] = "🛴"; + inline constexpr const char kick_scooter[] = "🛴"; inline constexpr const char bike[] = "🚲"; + inline constexpr const char bicycle[] = "🚲"; inline constexpr const char motor_scooter[] = "🛵"; inline constexpr const char motorbike[] = "🛵"; inline constexpr const char motorcycle[] = "🏍️"; @@ -5370,12 +5612,15 @@ namespace unicode_emoji { inline constexpr const char suspension_railway[] = "🚟"; inline constexpr const char railway_car[] = "🚃"; inline constexpr const char train[] = "🚋"; + inline constexpr const char tram_car[] = "🚋"; inline constexpr const char mountain_railway[] = "🚞"; inline constexpr const char monorail[] = "🚝"; inline constexpr const char bullettrain_side[] = "🚄"; inline constexpr const char bullettrain_front[] = "🚅"; + inline constexpr const char bullet_train[] = "🚅"; inline constexpr const char light_rail[] = "🚈"; inline constexpr const char steam_locomotive[] = "🚂"; + inline constexpr const char locomotive[] = "🚂"; inline constexpr const char train2[] = "🚆"; inline constexpr const char metro[] = "🚇"; inline constexpr const char tram[] = "🚊"; @@ -5395,6 +5640,7 @@ namespace unicode_emoji { inline constexpr const char sailboat[] = "⛵"; inline constexpr const char speedboat[] = "🚤"; inline constexpr const char motorboat[] = "🛥️"; + inline constexpr const char motor_boat[] = "🛥️"; inline constexpr const char cruise_ship[] = "🛳️"; inline constexpr const char passenger_ship[] = "🛳️"; inline constexpr const char ferry[] = "⛴️"; @@ -5403,16 +5649,20 @@ namespace unicode_emoji { inline constexpr const char anchor[] = "⚓"; inline constexpr const char hook[] = "🪝"; inline constexpr const char fuelpump[] = "⛽"; + inline constexpr const char fuel_pump[] = "⛽"; inline constexpr const char construction[] = "🚧"; inline constexpr const char vertical_traffic_light[] = "🚦"; inline constexpr const char traffic_light[] = "🚥"; inline constexpr const char busstop[] = "🚏"; + inline constexpr const char bus_stop[] = "🚏"; inline constexpr const char map[] = "🗺️"; inline constexpr const char world_map[] = "🗺️"; inline constexpr const char moyai[] = "🗿"; + inline constexpr const char moai[] = "🗿"; inline constexpr const char statue_of_liberty[] = "🗽"; inline constexpr const char tokyo_tower[] = "🗼"; inline constexpr const char european_castle[] = "🏰"; + inline constexpr const char castle[] = "🏰"; inline constexpr const char japanese_castle[] = "🏯"; inline constexpr const char stadium[] = "🏟️"; inline constexpr const char ferris_wheel[] = "🎡"; @@ -5437,6 +5687,7 @@ namespace unicode_emoji { inline constexpr const char house_with_garden[] = "🏡"; inline constexpr const char homes[] = "🏘️"; inline constexpr const char house_buildings[] = "🏘️"; + inline constexpr const char houses[] = "🏘️"; inline constexpr const char house_abandoned[] = "🏚️"; inline constexpr const char derelict_house_building[] = "🏚️"; inline constexpr const char hut[] = "🛖"; @@ -5465,16 +5716,19 @@ namespace unicode_emoji { inline constexpr const char railroad_track[] = "🛤️"; inline constexpr const char motorway[] = "🛣️"; inline constexpr const char japan[] = "🗾"; + inline constexpr const char map_of_japan[] = "🗾"; inline constexpr const char rice_scene[] = "🎑"; inline constexpr const char park[] = "🏞️"; inline constexpr const char national_park[] = "🏞️"; inline constexpr const char sunrise[] = "🌅"; inline constexpr const char sunrise_over_mountains[] = "🌄"; inline constexpr const char stars[] = "🌠"; + inline constexpr const char shooting_star[] = "🌠"; inline constexpr const char sparkler[] = "🎇"; inline constexpr const char fireworks[] = "🎆"; inline constexpr const char city_sunset[] = "🌇"; inline constexpr const char city_sunrise[] = "🌇"; + inline constexpr const char sunset[] = "🌇"; inline constexpr const char city_dusk[] = "🌆"; inline constexpr const char cityscape[] = "🏙️"; inline constexpr const char night_with_stars[] = "🌃"; diff --git a/include/dpp/utility.h b/include/dpp/utility.h index 55ec9e83b5..f78d3b5b9e 100644 --- a/include/dpp/utility.h +++ b/include/dpp/utility.h @@ -365,13 +365,13 @@ struct DPP_EXPORT image_data { * * @param rhs Image to copy */ - image_data(image_data&&) noexcept = default; + image_data(image_data&& rhs) noexcept = default; /** * @brief Construct from string buffer * * @param format Image format - * @param str Data in a string + * @param bytes Data in a string * @see image_type */ image_data(image_type format, std::string_view bytes); @@ -380,8 +380,8 @@ struct DPP_EXPORT image_data { * @brief Construct from byte buffer * * @param format Image format - * @param buf Byte buffer - * @param size_t Image size in bytes + * @param bytes Data of the image + * @param byte_size Image size in bytes * @see image_type */ image_data(image_type format, const std::byte* bytes, uint32_t byte_size); @@ -405,8 +405,8 @@ struct DPP_EXPORT image_data { /** * @brief Set image data. * - * @param format Format of the image - * @param data Data of the image + * @param format Image format + * @param bytes Data of the image */ void set(image_type format, std::string_view bytes); @@ -414,7 +414,8 @@ struct DPP_EXPORT image_data { * @brief Set image data. * * @param format Format of the image - * @param data Data of the image + * @param bytes Data of the image + * @param byte_size Image size in bytes */ void set(image_type format, const std::byte* bytes, uint32_t byte_size); @@ -507,7 +508,7 @@ struct icon { /** * @brief Get as icon hash. * - * @warn The behavior is undefined if `is_iconhash() == false` + * @warning The behavior is undefined if `is_iconhash() == false` * @return iconhash& This iconhash */ iconhash& as_iconhash() &; @@ -515,7 +516,7 @@ struct icon { /** * @brief Get as icon hash. * - * @warn The behavior is undefined if `is_iconhash() == false` + * @warning The behavior is undefined if `is_iconhash() == false` * @return iconhash& This iconhash */ const iconhash& as_iconhash() const&; @@ -523,7 +524,7 @@ struct icon { /** * @brief Get as icon hash. * - * @warn The behavior is undefined if `is_iconhash() == false` + * @warning The behavior is undefined if `is_iconhash() == false` * @return iconhash& This iconhash */ iconhash&& as_iconhash() &&; @@ -539,7 +540,7 @@ struct icon { /** * @brief Get as image data. * - * @warn The behavior is undefined if `is_image_data() == false` + * @warning The behavior is undefined if `is_image_data() == false` * @return image_data& This image */ image_data& as_image_data() &; @@ -547,7 +548,7 @@ struct icon { /** * @brief Get as image. * - * @warn The behavior is undefined if `is_image_data() == false` + * @warning The behavior is undefined if `is_image_data() == false` * @return image_data& This image */ const image_data& as_image_data() const&; @@ -555,7 +556,7 @@ struct icon { /** * @brief Get as image. * - * @warn The behavior is undefined if `is_image_data() == false` + * @warning The behavior is undefined if `is_image_data() == false` * @return image_data& This image */ image_data&& as_image_data() &&; @@ -738,22 +739,36 @@ uint32_t DPP_EXPORT hsl(int h, int s, int l); std::string DPP_EXPORT debug_dump(uint8_t* data, size_t length); /** - * @brief Returns the length of a UTF-8 string in codepoints - * + * @brief Returns the length of a UTF-8 string in codepoints. + * @note Result is unspecified for strings that are not valid UTF-8. + * * @param str string to count length of - * @return size_t length of string (0 for invalid utf8) + * @return size_t Length of string */ -size_t DPP_EXPORT utf8len(const std::string &str); +size_t DPP_EXPORT utf8len(std::string_view str); /** - * @brief Return substring of a UTF-8 encoded string in codepoints - * + * @brief Return subview of a UTF-8 encoded string in codepoints. + * @note You must ensure that the resulting view is not used after the lifetime of the viewed string has ended. + * @note Result is unspecified for strings that are not valid UTF-8. + * + * @param str string to return substring from + * @param start start codepoint offset + * @param length length in codepoints + * @return std::string_view The requested subview + */ +std::string_view DPP_EXPORT utf8subview(std::string_view str, size_t start, size_t length); + +/** + * @brief Return substring of a UTF-8 encoded string in codepoints. + * @note Result is unspecified for strings that are not valid UTF-8. + * * @param str string to return substring from * @param start start codepoint offset * @param length length in codepoints - * @return std::string Substring in UTF-8 or empty string if invalid UTF-8 passed in + * @return std::string The requested substring */ -std::string DPP_EXPORT utf8substr(const std::string& str, std::string::size_type start, std::string::size_type length); +std::string DPP_EXPORT utf8substr(std::string_view str, size_t start, size_t length); /** * @brief Read a whole file into a std::string. diff --git a/include/dpp/version.h b/include/dpp/version.h index a02707d165..92941b5eee 100644 --- a/include/dpp/version.h +++ b/include/dpp/version.h @@ -22,9 +22,9 @@ #pragma once #if !defined(DPP_VERSION_LONG) -#define DPP_VERSION_LONG 0x00100029 -#define DPP_VERSION_SHORT 100029 -#define DPP_VERSION_TEXT "D++ 10.0.29 (05-Nov-2023)" +#define DPP_VERSION_LONG 0x00100031 +#define DPP_VERSION_SHORT 100031 +#define DPP_VERSION_TEXT "D++ 10.0.31 (19-May-2024)" #define DPP_VERSION_MAJOR ((DPP_VERSION_LONG & 0x00ff0000) >> 16) #define DPP_VERSION_MINOR ((DPP_VERSION_LONG & 0x0000ff00) >> 8) diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index 3879d10e2f..ba47b77cf7 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -258,7 +258,7 @@ foreach (fullmodname ${subdirlist}) endif() else() - target_link_libraries(${modname} PUBLIC ${OPENSSL_CRYPTO_LIBRARY} ${OPENSSL_SSL_LIBRARY} ${ZLIB_LIBRARIES}) + target_link_libraries(${modname} PUBLIC ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY} ${ZLIB_LIBRARIES}) if (MINGW) target_link_libraries(${modname} PUBLIC wsock32 ws2_32 crypt32) endif () diff --git a/makerelease.sh b/makerelease.sh index d114140f57..bcf7af5ca9 100755 --- a/makerelease.sh +++ b/makerelease.sh @@ -19,7 +19,7 @@ mv "./libdpp - RPM Package ARMv6/libdpp-$NEWVER-Linux.rpm" "./assets/libdpp-$NEW # deb mv "./libdpp - Debian Package amd64/libdpp-$NEWVER-Linux.deb" "./assets/libdpp-$NEWVER-linux-x64.deb" mv "./libdpp - Debian Package Linux x86/libdpp-$NEWVER-Linux.deb" "./assets/libdpp-$NEWVER-linux-i386.deb" -mv "./libdpp - Debian Package amd64/libdpp-$NEWVER-Linux.deb" "./assets/libdpp-$NEWVER-linux-rpi-arm64.deb" +mv "./libdpp - Debian Package arm64/libdpp-$NEWVER-Linux.deb" "./assets/libdpp-$NEWVER-linux-rpi-arm64.deb" mv "./libdpp - Debian Package arm7hf/libdpp-$NEWVER-Linux.deb" "./assets/libdpp-$NEWVER-linux-rpi-arm7hf.deb" mv "./libdpp - Debian Package ARMv6/libdpp-$NEWVER-Linux.deb" "./assets/libdpp-$NEWVER-linux-rpi-arm6.deb" diff --git a/src/dpp/auditlog.cpp b/src/dpp/auditlog.cpp index c1480938f1..9abc95f121 100644 --- a/src/dpp/auditlog.cpp +++ b/src/dpp/auditlog.cpp @@ -42,10 +42,10 @@ audit_entry &audit_entry::fill_from_json_impl(nlohmann::json *j) { audit_change ac; ac.key = string_not_null(&change, "key"); if (change.find("new_value") != change.end()) { - ac.new_value = change["new_value"].dump(); + ac.new_value = change["new_value"].dump(-1, ' ', false, json::error_handler_t::replace); } if (change.find("old_value") != change.end()) { - ac.old_value = change["old_value"].dump(); + ac.old_value = change["old_value"].dump(-1, ' ', false, json::error_handler_t::replace); } this->changes.push_back(ac); } diff --git a/src/dpp/cluster.cpp b/src/dpp/cluster.cpp index e8a13a9bab..db8ce14c31 100644 --- a/src/dpp/cluster.cpp +++ b/src/dpp/cluster.cpp @@ -317,13 +317,12 @@ json error_response(const std::string& message, http_request_completion_t& rv) }}, {"message", message} }); - rv.body = j.dump(); + rv.body = j.dump(-1, ' ', false, json::error_handler_t::replace); return j; } void cluster::post_rest(const std::string &endpoint, const std::string &major_parameters, const std::string ¶meters, http_method method, const std::string &postdata, json_encode_t callback, const std::string &filename, const std::string &filecontent, const std::string &filemimetype, const std::string &protocol) { - /* NOTE: This is not a memory leak! The request_queue will free the http_request once it reaches the end of its lifecycle */ - rest->post_request(new http_request(endpoint + (!major_parameters.empty() ? "/" : "") + major_parameters, parameters, [endpoint, callback](http_request_completion_t rv) { + rest->post_request(std::make_unique(endpoint + (!major_parameters.empty() ? "/" : "") + major_parameters, parameters, [endpoint, callback](http_request_completion_t rv) { json j; if (rv.error == h_success && !rv.body.empty()) { try { @@ -350,8 +349,7 @@ void cluster::post_rest_multipart(const std::string &endpoint, const std::string file_mimetypes.push_back(data.mimetype); } - /* NOTE: This is not a memory leak! The request_queue will free the http_request once it reaches the end of its lifecycle */ - rest->post_request(new http_request(endpoint + (!major_parameters.empty() ? "/" : "") + major_parameters, parameters, [endpoint, callback](http_request_completion_t rv) { + rest->post_request(std::make_unique(endpoint + (!major_parameters.empty() ? "/" : "") + major_parameters, parameters, [endpoint, callback](http_request_completion_t rv) { json j; if (rv.error == h_success && !rv.body.empty()) { try { @@ -369,8 +367,7 @@ void cluster::post_rest_multipart(const std::string &endpoint, const std::string void cluster::request(const std::string &url, http_method method, http_completion_event callback, const std::string &postdata, const std::string &mimetype, const std::multimap &headers, const std::string &protocol) { - /* NOTE: This is not a memory leak! The request_queue will free the http_request once it reaches the end of its lifecycle */ - raw_rest->post_request(new http_request(url, callback, method, postdata, mimetype, headers, protocol)); + raw_rest->post_request(std::make_unique(url, callback, method, postdata, mimetype, headers, protocol)); } gateway::gateway() : shards(0), session_start_total(0), session_start_remaining(0), session_start_reset_after(0), session_start_max_concurrency(0) { @@ -391,6 +388,11 @@ gateway::gateway(nlohmann::json* j) { } void cluster::set_presence(const dpp::presence &p) { + if(p.activities.empty()) { + log(ll_warning, "An empty presence was passed to set_presence."); + return; + } + json pres = p.to_json(); for (auto& s : shards) { if (s.second->is_connected()) { @@ -409,7 +411,7 @@ cluster& cluster::clear_audit_reason() { return *this; } -cluster& cluster::set_default_gateway(std::string &default_gateway_new) { +cluster& cluster::set_default_gateway(const std::string &default_gateway_new) { default_gateway = default_gateway_new; return *this; } diff --git a/src/dpp/cluster/appcommand.cpp b/src/dpp/cluster/appcommand.cpp index 15a2bb1416..80c3308447 100644 --- a/src/dpp/cluster/appcommand.cpp +++ b/src/dpp/cluster/appcommand.cpp @@ -28,7 +28,7 @@ void cluster::global_bulk_command_create(const std::vector &comman for (auto & s : commands) { j.push_back(s.to_json(false)); } - rest_request_list(this, API_PATH "/applications", std::to_string(commands.size() > 0 && commands[0].application_id ? commands[0].application_id : me.id), "commands", m_put, j.dump(), callback); + rest_request_list(this, API_PATH "/applications", std::to_string(commands.size() > 0 && commands[0].application_id ? commands[0].application_id : me.id), "commands", m_put, j.dump(-1, ' ', false, json::error_handler_t::replace), callback); } void cluster::global_bulk_command_delete(command_completion_event_t callback) { @@ -60,7 +60,7 @@ void cluster::guild_bulk_command_create(const std::vector &command for (auto & s : commands) { j.push_back(s.to_json(false)); } - rest_request_list(this, API_PATH "/applications", std::to_string(commands.size() > 0 && commands[0].application_id ? commands[0].application_id : me.id), "guilds/" + std::to_string(guild_id) + "/commands", m_put, j.dump(), callback); + rest_request_list(this, API_PATH "/applications", std::to_string(commands.size() > 0 && commands[0].application_id ? commands[0].application_id : me.id), "guilds/" + std::to_string(guild_id) + "/commands", m_put, j.dump(-1, ' ', false, json::error_handler_t::replace), callback); } void cluster::guild_bulk_command_delete(snowflake guild_id, command_completion_event_t callback) { @@ -85,7 +85,7 @@ void cluster::guild_bulk_command_edit_permissions(const std::vector(this, API_PATH "/applications", std::to_string(me.id), "guilds/" + std::to_string(guild_id) + "/commands/permissions", m_put, j.dump(), callback); + rest_request_list(this, API_PATH "/applications", std::to_string(me.id), "guilds/" + std::to_string(guild_id) + "/commands/permissions", m_put, j.dump(-1, ' ', false, json::error_handler_t::replace), callback); } void cluster::guild_command_create(const slashcommand &s, snowflake guild_id, command_completion_event_t callback) { @@ -116,7 +116,7 @@ void cluster::guild_command_edit_permissions(const slashcommand &s, snowflake gu j["permissions"].push_back(jperm); } } - rest_request(this, API_PATH "/applications", std::to_string(s.application_id ? s.application_id : me.id), "guilds/" + std::to_string(guild_id) + "/commands/" + std::to_string(s.id) + "/permissions", m_put, j.dump(), callback); + rest_request(this, API_PATH "/applications", std::to_string(s.application_id ? s.application_id : me.id), "guilds/" + std::to_string(guild_id) + "/commands/" + std::to_string(s.id) + "/permissions", m_put, j.dump(-1, ' ', false, json::error_handler_t::replace), callback); } void cluster::guild_command_get(snowflake id, snowflake guild_id, command_completion_event_t callback) { diff --git a/src/dpp/cluster/channel.cpp b/src/dpp/cluster/channel.cpp index 5b51448faf..496169c11c 100644 --- a/src/dpp/cluster/channel.cpp +++ b/src/dpp/cluster/channel.cpp @@ -43,7 +43,7 @@ void cluster::channel_edit_permissions(const class channel &c, const snowflake o void cluster::channel_edit_permissions(const snowflake channel_id, const snowflake overwrite_id, const uint64_t allow, const uint64_t deny, const bool member, command_completion_event_t callback) { json j({ {"allow", std::to_string(allow)}, {"deny", std::to_string(deny)}, {"type", member ? 1 : 0} }); - rest_request(this, API_PATH "/channels", std::to_string(channel_id), "permissions/" + std::to_string(overwrite_id), m_put, j.dump(), callback); + rest_request(this, API_PATH "/channels", std::to_string(channel_id), "permissions/" + std::to_string(overwrite_id), m_put, j.dump(-1, ' ', false, json::error_handler_t::replace), callback); } void cluster::channel_edit_positions(const std::vector &c, command_completion_event_t callback) { @@ -61,7 +61,7 @@ void cluster::channel_edit_positions(const std::vector &c, command_comp } j.push_back(cj); } - rest_request(this, API_PATH "/guilds", std::to_string(c[0].guild_id), "channels/" + std::to_string(c[0].id), m_patch, j.dump(), callback); + rest_request(this, API_PATH "/guilds", std::to_string(c[0].guild_id), "channels/" + std::to_string(c[0].id), m_patch, j.dump(-1, ' ', false, json::error_handler_t::replace), callback); } void cluster::channel_edit(const class channel &c, command_completion_event_t callback) { @@ -70,7 +70,7 @@ void cluster::channel_edit(const class channel &c, command_completion_event_t ca void cluster::channel_follow_news(const class channel &c, snowflake target_channel_id, command_completion_event_t callback) { json j({ {"webhook_channel_id", target_channel_id} }); - rest_request(this, API_PATH "/channels", std::to_string(c.id), "followers", m_post, j.dump(), callback); + rest_request(this, API_PATH "/channels", std::to_string(c.id), "followers", m_post, j.dump(-1, ' ', false, json::error_handler_t::replace), callback); } void cluster::channel_get(snowflake c, command_completion_event_t callback) { @@ -98,4 +98,9 @@ void cluster::channels_get(snowflake guild_id, command_completion_event_t callba rest_request_list(this, API_PATH "/guilds", std::to_string(guild_id), "channels", m_get, "", callback); } +void cluster::channel_set_voice_status(snowflake channel_id, const std::string& status, command_completion_event_t callback) { + json j({ {"status", status} }); + rest_request(this, API_PATH "/channels", std::to_string(channel_id), "voice-status", m_put, j.dump(-1, ' ', false, json::error_handler_t::replace), callback); +} + } // namespace dpp diff --git a/src/dpp/cluster/confirmation.cpp b/src/dpp/cluster/confirmation.cpp index 41cc6915a1..07072ccaf2 100644 --- a/src/dpp/cluster/confirmation.cpp +++ b/src/dpp/cluster/confirmation.cpp @@ -72,115 +72,93 @@ bool confirmation_callback_t::is_error() const { } } +namespace { + +std::vector find_errors_in_object(const std::string& obj, const std::string& current_field, const json &j) { + std::vector ret; + + if (auto errors = j.find("_errors"); errors != j.end()) { + for (const json& errordetails : *errors) { + error_detail detail; + detail.code = errordetails["code"].get(); + detail.reason = errordetails["message"].get(); + detail.field = current_field; + detail.object = obj; + ret.emplace_back(detail); + } + } else { + for (auto it = j.begin(); it != j.end(); ++it) { + std::vector sub_errors; + std::string field; + + if (obj.empty()) { + field = current_field; + } else if (isdigit(*current_field.c_str())) { + /* An element of an array, e.g. an element of a slash command vector for global_bulk_slash_command_create */ + field = obj; + field += '['; + field += current_field; + field += ']'; + } else { + /* A field of an object, e.g. message.content too long */ + field = obj; + field += '.'; + field += current_field; + } + + sub_errors = find_errors_in_object(field, it.key(), *it); + + if (!sub_errors.empty()) { + ret.reserve(ret.capacity() + sub_errors.size()); + std::move(sub_errors.begin(), sub_errors.end(), std::back_inserter(ret)); + } + } + } + return ret; +} + +} + error_info confirmation_callback_t::get_error() const { if (is_error()) { - json j = json::parse(this->http_info.body); - error_info e; - - set_int32_not_null(&j, "code", e.code); - set_string_not_null(&j, "message", e.message); - json& errors = j["errors"]; - for (auto obj = errors.begin(); obj != errors.end(); ++obj) { - - /* Arrays in the error report are numerically indexed with a number in a string. Ugh. */ - if (isdigit(*(obj.key().c_str()))) { - /* An array of error messages */ - int array_index = std::atoll(obj.key().c_str()); - for (auto index = obj->begin(); index != obj->end(); ++index) { - if (index->find("_errors") != index->end()) { - /* A single object where one or more fields generated an error */ - for (auto errordetails = (*index)["_errors"].begin(); errordetails != (*index)["_errors"].end(); ++errordetails) { - error_detail detail; - detail.code = (*errordetails)["code"].get(); - detail.reason = (*errordetails)["message"].get(); - detail.object.clear(); - detail.field = obj.key(); - detail.index = array_index; - e.errors.emplace_back(detail); - } - } else { - /* An object where one or more fields within it generated an error, e.g. slash command */ - for (auto fields = index->begin(); fields != index->end(); ++fields) { - if (fields->find("_errors") != fields->end()) { - for (auto errordetails = (*fields)["_errors"].begin(); errordetails != (*fields)["_errors"].end(); ++errordetails) { - error_detail detail; - detail.code = (*errordetails)["code"].get(); - detail.reason = (*errordetails)["message"].get(); - detail.field = fields.key(); - detail.object = obj.key(); - detail.index = array_index; - e.errors.emplace_back(detail); - } - } else { - /* An array of objects where one or more generated an error, e.g. slash command bulk registration */ - for (auto fields2 = fields->begin(); fields2 != fields->end(); ++fields2) { - for (auto errordetails = (*fields2)["_errors"].begin(); errordetails != (*fields2)["_errors"].end(); ++errordetails) { - error_detail detail; - detail.code = (*errordetails)["code"].get(); - detail.reason = (*errordetails)["message"].get(); - detail.field = index.key() + "[" + fields.key() + "]." + fields2.key(); - detail.object = obj.key(); - detail.index = array_index; - e.errors.emplace_back(detail); - } - } - } - } - } - } + try { + json j = json::parse(this->http_info.body); + error_info e; - } else if (obj->find("_errors") != obj->end()) { - /* An object of error messages (rare) */ - e.errors.reserve((*obj)["_errors"].size()); - for (auto errordetails = (*obj)["_errors"].begin(); errordetails != (*obj)["_errors"].end(); ++errordetails) { - error_detail detail; - detail.code = (*errordetails)["code"].get(); - detail.reason = (*errordetails)["message"].get(); - detail.object.clear(); - detail.field = obj.key(); - detail.index = 0; - e.errors.emplace_back(detail); - } - } else { - /* An object that has a subobject with errors */ - for (auto index = obj->begin(); index != obj->end(); ++index) { - int array_index = std::atoll(index.key().c_str()); - for (auto index2 = index->begin(); index2 != index->end(); ++index2) { - if (index2->find("_errors") != index2->end()) { - /* A single object where one or more fields generated an error */ - for (auto errordetails = (*index2)["_errors"].begin(); errordetails != (*index2)["_errors"].end(); ++errordetails) { - error_detail detail; - detail.code = (*errordetails)["code"].get(); - detail.reason = (*errordetails)["message"].get(); - detail.object = obj.key(); - detail.field = index2.key(); - detail.index = array_index; - e.errors.emplace_back(detail); - } - } - } + set_int32_not_null(&j, "code", e.code); + set_string_not_null(&j, "message", e.message); + json &errors = j["errors"]; + for (auto obj = errors.begin(); obj != errors.end(); ++obj) { + std::vector sub_errors; + std::string field = isdigit(*obj.key().c_str()) ? "[" + obj.key() + "]" : obj.key(); + + sub_errors = find_errors_in_object({}, field, *obj); + + if (!sub_errors.empty()) { + e.errors.reserve(e.errors.capacity() + sub_errors.size()); + std::move(sub_errors.begin(), sub_errors.end(), std::back_inserter(e.errors)); } } - } - e.human_readable = std::to_string(e.code) + ": " + e.message; - std::string prefix = e.errors.size() == 1 ? " " : "\n\t"; - for (const auto& error : e.errors) { - if (error.object.empty()) { - /* A singular field with an error in an unnamed object */ - e.human_readable += prefix + "- " + error.field + ": " + error.reason + " (" + error.code + ")"; - } else if (isdigit(*(error.object.c_str()))) { - /* An unnamed array of objects where one or more generated an error, e.g. slash command bulk registration */ - e.human_readable += prefix + "- [" + error.object + "]." + error.field + ": " + error.reason + " (" + error.code + ")"; - } else { - /* A named array of objects whre a field in the object has an error */ - e.human_readable += prefix + "- " + error.object + "[" + std::to_string(error.index) + "]." + error.field + ": " + error.reason + " (" + error.code + ")"; + e.human_readable = std::to_string(e.code) + ": " + e.message; + std::string prefix = e.errors.size() == 1 ? " " : "\n\t"; + for (const auto &error: e.errors) { + if (error.object.empty()) { + /* A singular field with an error in an unnamed object */ + e.human_readable += prefix + "- " + error.field + ": " + error.reason + " (" + error.code + ")"; + } else { + /* An object field that caused an error */ + e.human_readable += prefix + "- " + error.object + '.' + error.field + ": " + error.reason + " (" + error.code + ")"; + } } - } - return e; + return e; + } + catch (const std::exception &e) { + return {}; + } } - return error_info(); + return {}; } } // namespace dpp diff --git a/src/dpp/cluster/dm.cpp b/src/dpp/cluster/dm.cpp index 48a381c9d6..cba8af9654 100644 --- a/src/dpp/cluster/dm.cpp +++ b/src/dpp/cluster/dm.cpp @@ -23,7 +23,7 @@ namespace dpp { void cluster::create_dm_channel(snowflake user_id, command_completion_event_t callback) { - rest_request(this, API_PATH "/users", "@me", "channels", m_post, json({{"recipient_id", std::to_string(user_id)}}).dump(), callback); + rest_request(this, API_PATH "/users", "@me", "channels", m_post, json({{"recipient_id", std::to_string(user_id)}}).dump(-1, ' ', false, json::error_handler_t::replace), callback); } void cluster::current_user_get_dms(command_completion_event_t callback) { @@ -56,7 +56,7 @@ void cluster::gdm_add(snowflake channel_id, snowflake user_id, const std::string json params; params["access_token"] = access_token; params["nick"] = nick; - rest_request(this, API_PATH "/channels", std::to_string(channel_id), "recipients/" + std::to_string(user_id), m_put, params.dump(), callback); + rest_request(this, API_PATH "/channels", std::to_string(channel_id), "recipients/" + std::to_string(user_id), m_put, params.dump(-1, ' ', false, json::error_handler_t::replace), callback); } void cluster::gdm_remove(snowflake channel_id, snowflake user_id, command_completion_event_t callback) { diff --git a/src/dpp/cluster/guild.cpp b/src/dpp/cluster/guild.cpp index 87f73371c4..bf58372f69 100644 --- a/src/dpp/cluster/guild.cpp +++ b/src/dpp/cluster/guild.cpp @@ -24,7 +24,7 @@ namespace dpp { void cluster::guild_current_member_edit(snowflake guild_id, const std::string &nickname, command_completion_event_t callback) { - std::string o = (nickname.empty() ? json({{"nick", json::value_t::null }}) : json({{"nick", nickname }})).dump(); + std::string o = (nickname.empty() ? json({{"nick", json::value_t::null }}) : json({{"nick", nickname }})).dump(-1, ' ', false, json::error_handler_t::replace); rest_request(this, API_PATH "/guilds", std::to_string(guild_id), "members/@me", m_patch, o, callback); } @@ -52,7 +52,7 @@ void cluster::guild_ban_add(snowflake guild_id, snowflake user_id, uint32_t dele } } } - rest_request(this, API_PATH "/guilds", std::to_string(guild_id), "bans/" + std::to_string(user_id), m_put, j.dump(), callback); + rest_request(this, API_PATH "/guilds", std::to_string(guild_id), "bans/" + std::to_string(user_id), m_put, j.dump(-1, ' ', false, json::error_handler_t::replace), callback); } @@ -140,7 +140,7 @@ void cluster::guild_begin_prune(snowflake guild_id, const struct prune& pruneinf void cluster::guild_set_nickname(snowflake guild_id, const std::string &nickname, command_completion_event_t callback) { - std::string o = (nickname.empty() ? json({{"nick", json::value_t::null }}) : json({{"nick", nickname }})).dump(); + std::string o = (nickname.empty() ? json({{"nick", json::value_t::null }}) : json({{"nick", nickname }})).dump(-1, ' ', false, json::error_handler_t::replace); rest_request(this, API_PATH "/guilds", std::to_string(guild_id), "members/@me/nick", m_patch, o, callback); } @@ -165,7 +165,7 @@ void cluster::guild_get_welcome_screen(snowflake guild_id, command_completion_ev void cluster::guild_edit_welcome_screen(snowflake guild_id, const struct welcome_screen& welcome_screen, bool enabled, command_completion_event_t callback) { json j = welcome_screen.to_json(); j["enabled"] = enabled; - rest_request(this, API_PATH "/guilds", std::to_string(guild_id), "welcome-screen", m_patch, j.dump(), callback); + rest_request(this, API_PATH "/guilds", std::to_string(guild_id), "welcome-screen", m_patch, j.dump(-1, ' ', false, json::error_handler_t::replace), callback); } diff --git a/src/dpp/cluster/guild_member.cpp b/src/dpp/cluster/guild_member.cpp index e851e9c7ad..28e3b953b0 100644 --- a/src/dpp/cluster/guild_member.cpp +++ b/src/dpp/cluster/guild_member.cpp @@ -25,7 +25,7 @@ namespace dpp { void cluster::guild_add_member(const guild_member& gm, const std::string &access_token, command_completion_event_t callback) { json j = gm.to_json(); j["access_token"] = access_token; - rest_request(this, API_PATH "/guilds", std::to_string(gm.guild_id), "members/" + std::to_string(gm.user_id), m_put, j.dump(), callback); + rest_request(this, API_PATH "/guilds", std::to_string(gm.guild_id), "members/" + std::to_string(gm.user_id), m_put, j.dump(-1, ' ', false, json::error_handler_t::replace), callback); } @@ -93,7 +93,13 @@ void cluster::guild_member_timeout(snowflake guild_id, snowflake user_id, time_t j["communication_disabled_until"] = json::value_t::null; } - rest_request(this, API_PATH "/guilds", std::to_string(guild_id), "members/" + std::to_string(user_id), m_patch, j.dump(), callback); + rest_request(this, API_PATH "/guilds", std::to_string(guild_id), "members/" + std::to_string(user_id), m_patch, j.dump(-1, ' ', false, json::error_handler_t::replace), callback); +} + +void cluster::guild_member_timeout_remove(snowflake guild_id, snowflake user_id, command_completion_event_t callback) { + json j; + j["communication_disabled_until"] = json::value_t::null; + rest_request(this, API_PATH "/guilds", std::to_string(guild_id), "members/" + std::to_string(user_id), m_patch, j.dump(-1, ' ', false, json::error_handler_t::replace), callback); } @@ -116,7 +122,7 @@ void cluster::guild_member_move(const snowflake channel_id, const snowflake guil j["channel_id"] = json::value_t::null; } - this->post_rest(API_PATH "/guilds", std::to_string(guild_id), "members/" + std::to_string(user_id), m_patch, j.dump(), [this, guild_id, user_id, callback](json &j, const http_request_completion_t& http) { + this->post_rest(API_PATH "/guilds", std::to_string(guild_id), "members/" + std::to_string(user_id), m_patch, j.dump(-1, ' ', false, json::error_handler_t::replace), [this, guild_id, user_id, callback](json &j, const http_request_completion_t& http) { if (callback) { callback(confirmation_callback_t(this, guild_member().fill_from_json(&j, guild_id, user_id), http)); } diff --git a/src/dpp/cluster/message.cpp b/src/dpp/cluster/message.cpp index 231670b31c..e1d4943b59 100644 --- a/src/dpp/cluster/message.cpp +++ b/src/dpp/cluster/message.cpp @@ -66,7 +66,7 @@ void cluster::message_delete_bulk(const std::vector& message_ids, sno for (auto & m : message_ids) { j["messages"].push_back(std::to_string(m)); } - rest_request(this, API_PATH "/channels", std::to_string(channel_id), "messages/bulk-delete", m_post, j.dump(), callback); + rest_request(this, API_PATH "/channels", std::to_string(channel_id), "messages/bulk-delete", m_post, j.dump(-1, ' ', false, json::error_handler_t::replace), callback); } @@ -119,6 +119,16 @@ void cluster::message_edit(const message &m, command_completion_event_t callback }, m.file_data); } +void cluster::message_edit_flags(const message &m, command_completion_event_t callback) { + this->post_rest_multipart(API_PATH "/channels", std::to_string(m.channel_id), "messages/" + std::to_string(m.id), m_patch, nlohmann::json{ + {"flags", m.flags}, + }.dump(-1, ' ', false, json::error_handler_t::replace), [this, callback](json &j, const http_request_completion_t& http) { + if (callback) { + callback(confirmation_callback_t(this, message(this).fill_from_json(&j), http)); + } + }, m.file_data); +} + void cluster::message_get(snowflake message_id, snowflake channel_id, command_completion_event_t callback) { rest_request(this, API_PATH "/channels", std::to_string(channel_id), "messages/" + std::to_string(message_id), m_get, "", callback); @@ -162,6 +172,38 @@ void cluster::message_unpin(snowflake channel_id, snowflake message_id, command_ } +void cluster::poll_get_answer_voters(const message& m, uint32_t answer_id, snowflake after, uint64_t limit, command_completion_event_t callback) { + std::map parameters { + {"limit", std::to_string(limit > 100 ? 100 : limit)} + }; + + if (after > 0) { + parameters["after"] = after; + } + rest_request_list(this, API_PATH "/channels", std::to_string(m.channel_id), "polls/" + std::to_string(m.id) + "/answers/" + std::to_string(answer_id) + utility::make_url_parameters(parameters), m_get, "", std::move(callback), "id", "users"); +} + +void cluster::poll_get_answer_voters(snowflake message_id, snowflake channel_id, uint32_t answer_id, snowflake after, uint64_t limit, command_completion_event_t callback) { + std::map parameters { + {"limit", std::to_string(limit > 100 ? 100 : limit)} + }; + + if (after > 0) { + parameters["after"] = after; + } + rest_request_list(this, API_PATH "/channels", std::to_string(channel_id), "polls/" + std::to_string(message_id) + "/answers/" + std::to_string(answer_id) + utility::make_url_parameters(parameters), m_get, "", std::move(callback), "id", "users"); +} + + +void cluster::poll_end(const message &m, command_completion_event_t callback) { + rest_request(this, API_PATH "/channels", std::to_string(m.channel_id), "polls/" + std::to_string(m.id) + "/expire", m_post, "", std::move(callback)); +} + +void cluster::poll_end(snowflake message_id, snowflake channel_id, command_completion_event_t callback) { + rest_request(this, API_PATH "/channels", std::to_string(channel_id), "polls/" + std::to_string(message_id) + "/expire", m_post, "", std::move(callback)); +} + + void cluster::channel_pins_get(snowflake channel_id, command_completion_event_t callback) { rest_request_list(this, API_PATH "/channels", std::to_string(channel_id), "pins", m_get, "", callback); } diff --git a/src/dpp/cluster/role.cpp b/src/dpp/cluster/role.cpp index 1ff58bbf1d..2a2065a8f2 100644 --- a/src/dpp/cluster/role.cpp +++ b/src/dpp/cluster/role.cpp @@ -43,7 +43,7 @@ void cluster::roles_edit_position(snowflake guild_id, const std::vector &r for (auto & r : roles) { j.push_back({ {"id", r.id}, {"position", r.position} }); } - rest_request_list(this, API_PATH "/guilds", std::to_string(guild_id), "roles", m_patch, j.dump(), callback); + rest_request_list(this, API_PATH "/guilds", std::to_string(guild_id), "roles", m_patch, j.dump(-1, ' ', false, json::error_handler_t::replace), callback); } void cluster::roles_get(snowflake guild_id, command_completion_event_t callback) { @@ -59,7 +59,7 @@ void cluster::application_role_connection_update(snowflake application_id, const for (const auto &conn_metadata : connection_metadata) { j.push_back(conn_metadata.to_json()); } - rest_request_vector(this, API_PATH "/applications", std::to_string(application_id), "role-connections/metadata", m_put, j.dump(), callback); + rest_request_vector(this, API_PATH "/applications", std::to_string(application_id), "role-connections/metadata", m_put, j.dump(-1, ' ', false, json::error_handler_t::replace), callback); } void cluster::user_application_role_connection_get(snowflake application_id, command_completion_event_t callback) { diff --git a/src/dpp/cluster/template.cpp b/src/dpp/cluster/template.cpp index edda3b3536..f0503ff83f 100644 --- a/src/dpp/cluster/template.cpp +++ b/src/dpp/cluster/template.cpp @@ -25,13 +25,13 @@ namespace dpp { void cluster::guild_create_from_template(const std::string &code, const std::string &name, command_completion_event_t callback) { json params({{"name", name}}); - rest_request(this, API_PATH "/guilds", "templates", code, m_post, params.dump(), callback); + rest_request(this, API_PATH "/guilds", "templates", code, m_post, params.dump(-1, ' ', false, json::error_handler_t::replace), callback); } void cluster::guild_template_create(snowflake guild_id, const std::string &name, const std::string &description, command_completion_event_t callback) { json params({{"name", name}, {"description", description}}); - rest_request(this, API_PATH "/guilds", std::to_string(guild_id), "templates", m_post, params.dump(), callback); + rest_request(this, API_PATH "/guilds", std::to_string(guild_id), "templates", m_post, params.dump(-1, ' ', false, json::error_handler_t::replace), callback); } @@ -42,7 +42,7 @@ void cluster::guild_template_delete(snowflake guild_id, const std::string &code, void cluster::guild_template_modify(snowflake guild_id, const std::string &code, const std::string &name, const std::string &description, command_completion_event_t callback) { json params({{"name", name}, {"description", description}}); - rest_request(this, API_PATH "/guilds", std::to_string(guild_id), "templates/" + code, m_patch, params.dump(), callback); + rest_request(this, API_PATH "/guilds", std::to_string(guild_id), "templates/" + code, m_patch, params.dump(-1, ' ', false, json::error_handler_t::replace), callback); } diff --git a/src/dpp/cluster/thread.cpp b/src/dpp/cluster/thread.cpp index 8e8ab147e3..b3c109406e 100644 --- a/src/dpp/cluster/thread.cpp +++ b/src/dpp/cluster/thread.cpp @@ -70,7 +70,20 @@ void cluster::threads_get_private_archived(snowflake channel_id, time_t before_t {"before", before_timestamp}, {"limit", limit}, }); - rest_request_list(this, API_PATH "/channels", std::to_string(channel_id), "/threads/archived/private" + parameters, m_get, "", callback); + this->post_rest(API_PATH "/channels", std::to_string(channel_id), "/threads/archived/private" + parameters, m_get, "", [this, callback](json &j, const http_request_completion_t& http) { + std::unordered_map list; + confirmation_callback_t e(this, confirmation(), http); + if (!e.is_error()) { + if (j.contains("threads")) { + for (auto &curr_item: j["threads"]) { + list[snowflake_not_null(&curr_item, "id")].fill_from_json(&curr_item); + } + } + } + if (callback) { + callback(confirmation_callback_t(this, list, http)); + } + }); } void cluster::threads_get_public_archived(snowflake channel_id, time_t before_timestamp, uint16_t limit, command_completion_event_t callback) { @@ -78,7 +91,20 @@ void cluster::threads_get_public_archived(snowflake channel_id, time_t before_ti {"before", before_timestamp}, {"limit", limit}, }); - rest_request_list(this, API_PATH "/channels", std::to_string(channel_id), "/threads/archived/public" + parameters, m_get, "", callback); + this->post_rest(API_PATH "/channels", std::to_string(channel_id), "/threads/archived/public" + parameters, m_get, "", [this, callback](json &j, const http_request_completion_t& http) { + std::unordered_map list; + confirmation_callback_t e(this, confirmation(), http); + if (!e.is_error()) { + if (j.contains("threads")) { + for (auto &curr_item: j["threads"]) { + list[snowflake_not_null(&curr_item, "id")].fill_from_json(&curr_item); + } + } + } + if (callback) { + callback(confirmation_callback_t(this, list, http)); + } + }); } void cluster::thread_member_get(const snowflake thread_id, const snowflake user_id, command_completion_event_t callback) { @@ -112,7 +138,7 @@ void cluster::thread_create_in_forum(const std::string& thread_name, snowflake c break; } - this->post_rest_multipart(API_PATH "/channels", std::to_string(channel_id), "threads", m_post, j.dump(), [this, callback](json &j, const http_request_completion_t& http) { + this->post_rest_multipart(API_PATH "/channels", std::to_string(channel_id), "threads", m_post, j.dump(-1, ' ', false, json::error_handler_t::replace), [this, callback](json &j, const http_request_completion_t& http) { if (callback) { auto t = thread().fill_from_json(&j); confirmation_callback_t e(this, confirmation(), http); @@ -135,7 +161,7 @@ void cluster::thread_create(const std::string& thread_name, snowflake channel_id {"invitable", invitable}, {"rate_limit_per_user", rate_limit_per_user} }); - rest_request(this, API_PATH "/channels", std::to_string(channel_id), "threads", m_post, j.dump(), callback); + rest_request(this, API_PATH "/channels", std::to_string(channel_id), "threads", m_post, j.dump(-1, ' ', false, json::error_handler_t::replace), callback); } void cluster::thread_edit(const thread &t, command_completion_event_t callback) @@ -150,7 +176,7 @@ void cluster::thread_create_with_message(const std::string& thread_name, snowfla {"auto_archive_duration", auto_archive_duration}, {"rate_limit_per_user", rate_limit_per_user} }); - rest_request(this, API_PATH "/channels", std::to_string(channel_id), "messages/" + std::to_string(message_id) + "/threads", m_post, j.dump(), callback); + rest_request(this, API_PATH "/channels", std::to_string(channel_id), "messages/" + std::to_string(message_id) + "/threads", m_post, j.dump(-1, ' ', false, json::error_handler_t::replace), callback); } void cluster::thread_member_add(snowflake thread_id, snowflake user_id, command_completion_event_t callback) { diff --git a/src/dpp/cluster/timer.cpp b/src/dpp/cluster/timer.cpp index 94099c7a9e..e6d7df1814 100644 --- a/src/dpp/cluster/timer.cpp +++ b/src/dpp/cluster/timer.cpp @@ -97,10 +97,21 @@ void cluster::tick_timers() { } } for (auto & t : scheduled) { + timer handle = t->handle; /* Call handler */ t->on_tick(t->handle); - /* Reschedule for next tick */ - timer_reschedule(t); + /* Reschedule if it wasn't deleted. + * Note: We wrap the .contains() check in a lambda as it needs locking + * for thread safety, but timer_rescheudle also locks the container, so this + * is the cleanest way to do it. + */ + bool not_deleted = ([handle, this]() -> bool { + std::lock_guard l(timer_guard); + return timer_list.find(handle) != timer_list.end(); + }()); + if (not_deleted) { + timer_reschedule(t); + } } } diff --git a/src/dpp/cluster/user.cpp b/src/dpp/cluster/user.cpp index a430f18a10..b3cf763bb8 100644 --- a/src/dpp/cluster/user.cpp +++ b/src/dpp/cluster/user.cpp @@ -41,7 +41,7 @@ void cluster::current_user_edit(const std::string &nickname, const std::string& } j["avatar"] = "data:" + mimetypes.find(type)->second + ";base64," + base64_encode((unsigned char const*)image_blob.data(), (unsigned int)image_blob.length()); } - rest_request(this, API_PATH "/users", "@me", "", m_patch, j.dump(), callback); + rest_request(this, API_PATH "/users", "@me", "", m_patch, j.dump(-1, ' ', false, json::error_handler_t::replace), callback); } void cluster::current_application_get(command_completion_event_t callback) { @@ -65,7 +65,7 @@ void cluster::current_user_set_voice_state(snowflake guild_id, snowflake channel } else { j["request_to_speak_timestamp"] = json::value_t::null; } - rest_request(this, API_PATH "/guilds", std::to_string(guild_id), "/voice-states/@me", m_patch, j.dump(), callback); + rest_request(this, API_PATH "/guilds", std::to_string(guild_id), "/voice-states/@me", m_patch, j.dump(-1, ' ', false, json::error_handler_t::replace), callback); } void cluster::user_set_voice_state(snowflake user_id, snowflake guild_id, snowflake channel_id, bool suppress, command_completion_event_t callback) { @@ -73,7 +73,7 @@ void cluster::user_set_voice_state(snowflake user_id, snowflake guild_id, snowfl {"channel_id", channel_id}, {"suppress", suppress} }); - rest_request(this, API_PATH "/guilds", std::to_string(guild_id), "/voice-states/" + std::to_string(user_id), m_patch, j.dump(), callback); + rest_request(this, API_PATH "/guilds", std::to_string(guild_id), "/voice-states/" + std::to_string(user_id), m_patch, j.dump(-1, ' ', false, json::error_handler_t::replace), callback); } void cluster::current_user_connections_get(command_completion_event_t callback) { diff --git a/src/dpp/cluster/webhook.cpp b/src/dpp/cluster/webhook.cpp index 52b895c77c..5231d19e40 100644 --- a/src/dpp/cluster/webhook.cpp +++ b/src/dpp/cluster/webhook.cpp @@ -63,7 +63,7 @@ void cluster::edit_webhook_with_token(const class webhook& wh, command_completio if (jwh.find("channel_id") != jwh.end()) { jwh.erase(jwh.find("channel_id")); } - rest_request(this, API_PATH "/webhooks", std::to_string(wh.id), utility::url_encode(wh.token), m_patch, jwh.dump(), callback); + rest_request(this, API_PATH "/webhooks", std::to_string(wh.id), utility::url_encode(wh.token), m_patch, jwh.dump(-1, ' ', false, json::error_handler_t::replace), callback); } void cluster::execute_webhook(const class webhook &wh, const struct message& m, bool wait, snowflake thread_id, const std::string& thread_name, command_completion_event_t callback) { @@ -83,7 +83,7 @@ void cluster::execute_webhook(const class webhook &wh, const struct message& m, if (!wh.name.empty()) { j["username"] = wh.name; } - body = j.dump(); + body = j.dump(-1, ' ', false, json::error_handler_t::replace); } this->post_rest_multipart(API_PATH "/webhooks", std::to_string(wh.id), utility::url_encode(!wh.token.empty() ? wh.token : token) + parameters, m_post, !body.empty() ? body : m.build_json(false), [this, callback](json &j, const http_request_completion_t& http) { diff --git a/src/dpp/cluster_coro_calls.cpp b/src/dpp/cluster_coro_calls.cpp index d03183cdeb..dee4daef50 100644 --- a/src/dpp/cluster_coro_calls.cpp +++ b/src/dpp/cluster_coro_calls.cpp @@ -219,6 +219,10 @@ async cluster::co_channels_get(snowflake guild_id) { return async{ this, static_cast(&cluster::channels_get), guild_id }; } +async cluster::co_channel_set_voice_status(snowflake channel_id, const std::string& status) { + return async{ this, static_cast(&cluster::channel_set_voice_status), channel_id, status }; +} + async cluster::co_create_dm_channel(snowflake user_id) { return async{ this, static_cast(&cluster::create_dm_channel), user_id }; } @@ -407,6 +411,10 @@ async cluster::co_guild_member_timeout(snowflake guild_ return async{ this, static_cast(&cluster::guild_member_timeout), guild_id, user_id, communication_disabled_until }; } +async cluster::co_guild_member_timeout_remove(snowflake guild_id, snowflake user_id) { + return async{ this, static_cast(&cluster::guild_member_timeout_remove), guild_id, user_id }; +} + async cluster::co_guild_member_delete_role(snowflake guild_id, snowflake user_id, snowflake role_id) { return async{ this, static_cast(&cluster::guild_member_delete_role), guild_id, user_id, role_id }; } @@ -495,6 +503,10 @@ async cluster::co_message_edit(const message &m) { return async{ this, static_cast(&cluster::message_edit), m }; } +async cluster::co_message_edit_flags(const message &m) { + return async{ this, static_cast(&cluster::message_edit_flags), m }; +} + async cluster::co_message_get(snowflake message_id, snowflake channel_id) { return async{ this, static_cast(&cluster::message_get), message_id, channel_id }; } @@ -519,6 +531,22 @@ async cluster::co_message_unpin(snowflake channel_id, s return async{ this, static_cast(&cluster::message_unpin), channel_id, message_id }; } +async cluster::co_poll_get_answer_voters(const message& m, uint32_t answer_id, snowflake after, uint64_t limit) { + return async{ this, static_cast(&cluster::poll_get_answer_voters), m, answer_id, after, limit }; +} + +async cluster::co_poll_get_answer_voters(snowflake message_id, snowflake channel_id, uint32_t answer_id, snowflake after, uint64_t limit) { + return async{ this, static_cast(&cluster::poll_get_answer_voters), message_id, channel_id, answer_id, after, limit }; +} + +async cluster::co_poll_end(const message &m) { + return async{ this, static_cast(&cluster::poll_end), m }; +} + +async cluster::co_poll_end(snowflake message_id, snowflake channel_id) { + return async{ this, static_cast(&cluster::poll_end), message_id, channel_id }; +} + async cluster::co_channel_pins_get(snowflake channel_id) { return async{ this, static_cast(&cluster::channel_pins_get), channel_id }; } @@ -819,8 +847,8 @@ async cluster::co_get_webhook_with_token(snowflake webh }; /* End of auto-generated definitions */ -dpp::async dpp::cluster::co_request(const std::string &url, http_method method, const std::string &postdata, const std::string &mimetype, const std::multimap &headers) { - return async{ [&, this] (C &&cc) { return this->request(url, method, std::forward(cc), postdata, mimetype, headers); }}; +dpp::async dpp::cluster::co_request(const std::string &url, http_method method, const std::string &postdata, const std::string &mimetype, const std::multimap &headers, const std::string &protocol) { + return async{ [&, this] (C &&cc) { return this->request(url, method, std::forward(cc), postdata, mimetype, headers, protocol); }}; } #endif diff --git a/src/dpp/cluster_sync_calls.cpp b/src/dpp/cluster_sync_calls.cpp index 66e057c1ee..368c8b8744 100644 --- a/src/dpp/cluster_sync_calls.cpp +++ b/src/dpp/cluster_sync_calls.cpp @@ -217,6 +217,10 @@ channel_map cluster::channels_get_sync(snowflake guild_id) { return dpp::sync(this, static_cast(&cluster::channels_get), guild_id); } +confirmation cluster::channel_set_voice_status_sync(snowflake channel_id, const std::string& status) { + return dpp::sync(this, static_cast(&cluster::channel_set_voice_status), channel_id, status); +} + channel cluster::create_dm_channel_sync(snowflake user_id) { return dpp::sync(this, static_cast(&cluster::create_dm_channel), user_id); } @@ -405,6 +409,10 @@ confirmation cluster::guild_member_timeout_sync(snowflake guild_id, snowflake us return dpp::sync(this, static_cast(&cluster::guild_member_timeout), guild_id, user_id, communication_disabled_until); } +confirmation cluster::guild_member_timeout_remove_sync(snowflake guild_id, snowflake user_id) { + return dpp::sync(this, static_cast(&cluster::guild_member_timeout_remove), guild_id, user_id); +} + confirmation cluster::guild_member_delete_role_sync(snowflake guild_id, snowflake user_id, snowflake role_id) { return dpp::sync(this, static_cast(&cluster::guild_member_delete_role), guild_id, user_id, role_id); } @@ -493,6 +501,10 @@ message cluster::message_edit_sync(const message &m) { return dpp::sync(this, static_cast(&cluster::message_edit), m); } +message cluster::message_edit_flags_sync(const message &m) { + return dpp::sync(this, static_cast(&cluster::message_edit_flags), m); +} + message cluster::message_get_sync(snowflake message_id, snowflake channel_id) { return dpp::sync(this, static_cast(&cluster::message_get), message_id, channel_id); } @@ -517,6 +529,22 @@ confirmation cluster::message_unpin_sync(snowflake channel_id, snowflake message return dpp::sync(this, static_cast(&cluster::message_unpin), channel_id, message_id); } +user_map cluster::poll_get_answer_voters_sync(const message& m, uint32_t answer_id, snowflake after, uint64_t limit) { + return dpp::sync(this, static_cast(&cluster::poll_get_answer_voters), m, answer_id, after, limit); +} + +user_map cluster::poll_get_answer_voters_sync(snowflake message_id, snowflake channel_id, uint32_t answer_id, snowflake after, uint64_t limit) { + return dpp::sync(this, static_cast(&cluster::poll_get_answer_voters), message_id, channel_id, answer_id, after, limit); +} + +message cluster::poll_end_sync(const message &m) { + return dpp::sync(this, static_cast(&cluster::poll_end), m); +} + +message cluster::poll_end_sync(snowflake message_id, snowflake channel_id) { + return dpp::sync(this, static_cast(&cluster::poll_end), message_id, channel_id); +} + message_map cluster::channel_pins_get_sync(snowflake channel_id) { return dpp::sync(this, static_cast(&cluster::channel_pins_get), channel_id); } diff --git a/src/dpp/commandhandler.cpp b/src/dpp/commandhandler.cpp index 9e15168f53..e337b0eee9 100644 --- a/src/dpp/commandhandler.cpp +++ b/src/dpp/commandhandler.cpp @@ -168,7 +168,7 @@ bool commandhandler::string_has_prefix(std::string &str) { for (auto& p : prefixes) { size_t prefix_length = utility::utf8len(p); - if (utility::utf8substr(str, 0, prefix_length) == p) { + if (utility::utf8subview(str, 0, prefix_length) == p) { str.erase(str.begin(), str.begin() + prefix_length); return true; } diff --git a/src/dpp/discordclient.cpp b/src/dpp/discordclient.cpp index 0f925f6313..401d9cd610 100644 --- a/src/dpp/discordclient.cpp +++ b/src/dpp/discordclient.cpp @@ -611,32 +611,34 @@ uint64_t discord_client::get_channel_count() { discord_client& discord_client::connect_voice(snowflake guild_id, snowflake channel_id, bool self_mute, bool self_deaf) { #ifdef HAVE_VOICE std::unique_lock lock(voice_mutex); - if (connecting_voice_channels.find(guild_id) == connecting_voice_channels.end()) { - connecting_voice_channels[guild_id] = std::make_unique(this, channel_id); - /* Once sent, this expects two events (in any order) on the websocket: - * VOICE_SERVER_UPDATE and VOICE_STATUS_UPDATE - */ - log(ll_debug, "Sending op 4 to join VC, guild " + std::to_string(guild_id) + " channel " + std::to_string(channel_id)); - queue_message(jsonobj_to_string(json({ - { "op", 4 }, - { "d", { - { "guild_id", std::to_string(guild_id) }, - { "channel_id", std::to_string(channel_id) }, - { "self_mute", self_mute }, - { "self_deaf", self_deaf }, - } - } - })), false); - } else { - log(ll_debug, "Requested the bot connect to voice channel " + std::to_string(channel_id) + " on guild " + std::to_string(guild_id) + ", but it seems we are already on this VC"); + if (connecting_voice_channels.find(guild_id) != connecting_voice_channels.end()) { + if (connecting_voice_channels[guild_id]->channel_id == channel_id) { + log(ll_debug, "Requested the bot connect to voice channel " + std::to_string(channel_id) + " on guild " + std::to_string(guild_id) + ", but it seems we are already on this VC"); + return *this; + } } + connecting_voice_channels[guild_id] = std::make_unique(this, channel_id); + /* Once sent, this expects two events (in any order) on the websocket: + * VOICE_SERVER_UPDATE and VOICE_STATUS_UPDATE + */ + log(ll_debug, "Sending op 4 to join VC, guild " + std::to_string(guild_id) + " channel " + std::to_string(channel_id)); + queue_message(jsonobj_to_string(json({ + { "op", 4 }, + { "d", { + { "guild_id", std::to_string(guild_id) }, + { "channel_id", std::to_string(channel_id) }, + { "self_mute", self_mute }, + { "self_deaf", self_deaf }, + } + } + })), false); #endif return *this; } std::string discord_client::jsonobj_to_string(const nlohmann::json& json) { if (protocol == ws_json) { - return json.dump(); + return json.dump(-1, ' ', false, json::error_handler_t::replace); } else { return etf->build(json); } diff --git a/src/dpp/discordevents.cpp b/src/dpp/discordevents.cpp index 18396ed225..2079be749c 100644 --- a/src/dpp/discordevents.cpp +++ b/src/dpp/discordevents.cpp @@ -286,10 +286,18 @@ time_t ts_not_null(const json* j, const char* keyname) } crossplatform_strptime(timedate.substr(0, 19).c_str(), "%Y-%m-%dT%T", ×tamp); timestamp.tm_isdst = 0; - retval = mktime(×tamp); + #ifndef _WIN32 + retval = timegm(×tamp); + #else + retval = _mkgmtime(×tamp); + #endif } else { crossplatform_strptime(timedate.substr(0, 19).c_str(), "%Y-%m-%d %T", ×tamp); - retval = mktime(×tamp); + #ifndef _WIN32 + retval = timegm(×tamp); + #else + retval = _mkgmtime(×tamp); + #endif } } return retval; @@ -311,94 +319,113 @@ void set_ts_not_null(const json* j, const char* keyname, time_t &v) } crossplatform_strptime(timedate.substr(0, 19).c_str(), "%Y-%m-%dT%T", ×tamp); timestamp.tm_isdst = 0; - retval = mktime(×tamp); + #ifndef _WIN32 + retval = timegm(×tamp); + #else + retval = _mkgmtime(×tamp); + #endif } else { crossplatform_strptime(timedate.substr(0, 19).c_str(), "%Y-%m-%d %T", ×tamp); - retval = mktime(×tamp); + #ifndef _WIN32 + retval = timegm(×tamp); + #else + retval = _mkgmtime(×tamp); + #endif } v = retval; } } -const std::map eventmap = { - { "__LOG__", new dpp::events::logger() }, - { "GUILD_CREATE", new dpp::events::guild_create() }, - { "GUILD_UPDATE", new dpp::events::guild_update() }, - { "GUILD_DELETE", new dpp::events::guild_delete() }, - { "GUILD_MEMBER_UPDATE", new dpp::events::guild_member_update() }, - { "RESUMED", new dpp::events::resumed() }, - { "READY", new dpp::events::ready() }, - { "CHANNEL_CREATE", new dpp::events::channel_create() }, - { "CHANNEL_UPDATE", new dpp::events::channel_update() }, - { "CHANNEL_DELETE", new dpp::events::channel_delete() }, - { "PRESENCE_UPDATE", new dpp::events::presence_update() }, - { "TYPING_START", new dpp::events::typing_start() }, - { "MESSAGE_CREATE", new dpp::events::message_create() }, - { "MESSAGE_UPDATE", new dpp::events::message_update() }, - { "MESSAGE_DELETE", new dpp::events::message_delete() }, - { "MESSAGE_DELETE_BULK", new dpp::events::message_delete_bulk() }, - { "MESSAGE_REACTION_ADD", new dpp::events::message_reaction_add() }, - { "MESSAGE_REACTION_REMOVE", new dpp::events::message_reaction_remove() }, - { "MESSAGE_REACTION_REMOVE_ALL", new dpp::events::message_reaction_remove_all() }, - { "MESSAGE_REACTION_REMOVE_EMOJI", new dpp::events::message_reaction_remove_emoji() }, - { "CHANNEL_PINS_UPDATE", new dpp::events::channel_pins_update() }, - { "GUILD_BAN_ADD", new dpp::events::guild_ban_add() }, - { "GUILD_BAN_REMOVE", new dpp::events::guild_ban_remove() }, - { "GUILD_EMOJIS_UPDATE", new dpp::events::guild_emojis_update() }, - { "GUILD_INTEGRATIONS_UPDATE", new dpp::events::guild_integrations_update() }, - { "INTEGRATION_CREATE", new dpp::events::integration_create() }, - { "INTEGRATION_UPDATE", new dpp::events::integration_update() }, - { "INTEGRATION_DELETE", new dpp::events::integration_delete() }, - { "GUILD_MEMBER_ADD", new dpp::events::guild_member_add() }, - { "GUILD_MEMBER_REMOVE", new dpp::events::guild_member_remove() }, - { "GUILD_MEMBERS_CHUNK", new dpp::events::guild_members_chunk() }, - { "GUILD_ROLE_CREATE", new dpp::events::guild_role_create() }, - { "GUILD_ROLE_UPDATE", new dpp::events::guild_role_update() }, - { "GUILD_ROLE_DELETE", new dpp::events::guild_role_delete() }, - { "VOICE_STATE_UPDATE", new dpp::events::voice_state_update() }, - { "VOICE_SERVER_UPDATE", new dpp::events::voice_server_update() }, - { "WEBHOOKS_UPDATE", new dpp::events::webhooks_update() }, - { "INVITE_CREATE", new dpp::events::invite_create() }, - { "INVITE_DELETE", new dpp::events::invite_delete() }, - { "INTERACTION_CREATE", new dpp::events::interaction_create() }, - { "USER_UPDATE", new dpp::events::user_update() }, - { "GUILD_JOIN_REQUEST_DELETE", new dpp::events::guild_join_request_delete() }, +template +static dpp::events::event* make_static_event() noexcept { + static EventType event; + return &event; +} + +static const std::map event_map = { + { "__LOG__", make_static_event() }, + { "GUILD_CREATE", make_static_event() }, + { "GUILD_UPDATE", make_static_event() }, + { "GUILD_DELETE", make_static_event() }, + { "GUILD_MEMBER_UPDATE", make_static_event() }, + { "RESUMED", make_static_event() }, + { "READY", make_static_event() }, + { "CHANNEL_CREATE", make_static_event() }, + { "CHANNEL_UPDATE", make_static_event() }, + { "CHANNEL_DELETE", make_static_event() }, + { "PRESENCE_UPDATE", make_static_event() }, + { "TYPING_START", make_static_event() }, + { "MESSAGE_CREATE", make_static_event() }, + { "MESSAGE_UPDATE", make_static_event() }, + { "MESSAGE_DELETE", make_static_event() }, + { "MESSAGE_DELETE_BULK", make_static_event() }, + { "MESSAGE_REACTION_ADD", make_static_event() }, + { "MESSAGE_REACTION_REMOVE", make_static_event() }, + { "MESSAGE_REACTION_REMOVE_ALL", make_static_event() }, + { "MESSAGE_REACTION_REMOVE_EMOJI", make_static_event() }, + { "MESSAGE_POLL_VOTE_ADD", make_static_event() }, + { "MESSAGE_POLL_VOTE_REMOVE", make_static_event() }, + { "CHANNEL_PINS_UPDATE", make_static_event() }, + { "GUILD_BAN_ADD", make_static_event() }, + { "GUILD_BAN_REMOVE", make_static_event() }, + { "GUILD_EMOJIS_UPDATE", make_static_event() }, + { "GUILD_INTEGRATIONS_UPDATE", make_static_event() }, + { "INTEGRATION_CREATE", make_static_event() }, + { "INTEGRATION_UPDATE", make_static_event() }, + { "INTEGRATION_DELETE", make_static_event() }, + { "GUILD_MEMBER_ADD", make_static_event() }, + { "GUILD_MEMBER_REMOVE", make_static_event() }, + { "GUILD_MEMBERS_CHUNK", make_static_event() }, + { "GUILD_ROLE_CREATE", make_static_event() }, + { "GUILD_ROLE_UPDATE", make_static_event() }, + { "GUILD_ROLE_DELETE", make_static_event() }, + { "VOICE_STATE_UPDATE", make_static_event() }, + { "VOICE_SERVER_UPDATE", make_static_event() }, + { "WEBHOOKS_UPDATE", make_static_event() }, + { "INVITE_CREATE", make_static_event() }, + { "INVITE_DELETE", make_static_event() }, + { "INTERACTION_CREATE", make_static_event() }, + { "USER_UPDATE", make_static_event() }, + { "GUILD_JOIN_REQUEST_DELETE", make_static_event() }, { "GUILD_JOIN_REQUEST_UPDATE", nullptr }, - { "STAGE_INSTANCE_CREATE", new dpp::events::stage_instance_create() }, - { "STAGE_INSTANCE_UPDATE", new dpp::events::stage_instance_update() }, - { "STAGE_INSTANCE_DELETE", new dpp::events::stage_instance_delete() }, - { "THREAD_CREATE", new dpp::events::thread_create() }, - { "THREAD_UPDATE", new dpp::events::thread_update() }, - { "THREAD_DELETE", new dpp::events::thread_delete() }, - { "THREAD_LIST_SYNC", new dpp::events::thread_list_sync() }, - { "THREAD_MEMBER_UPDATE", new dpp::events::thread_member_update() }, - { "THREAD_MEMBERS_UPDATE", new dpp::events::thread_members_update() }, - { "GUILD_STICKERS_UPDATE", new dpp::events::guild_stickers_update() }, + { "STAGE_INSTANCE_CREATE", make_static_event() }, + { "STAGE_INSTANCE_UPDATE", make_static_event() }, + { "STAGE_INSTANCE_DELETE", make_static_event() }, + { "THREAD_CREATE", make_static_event() }, + { "THREAD_UPDATE", make_static_event() }, + { "THREAD_DELETE", make_static_event() }, + { "THREAD_LIST_SYNC", make_static_event() }, + { "THREAD_MEMBER_UPDATE", make_static_event() }, + { "THREAD_MEMBERS_UPDATE", make_static_event() }, + { "GUILD_STICKERS_UPDATE", make_static_event() }, { "GUILD_APPLICATION_COMMAND_COUNTS_UPDATE", nullptr }, { "APPLICATION_COMMAND_PERMISSIONS_UPDATE", nullptr }, { "EMBEDDED_ACTIVITY_UPDATE", nullptr }, { "GUILD_APPLICATION_COMMAND_INDEX_UPDATE", nullptr }, { "CHANNEL_TOPIC_UPDATE", nullptr }, + { "GUILD_SOUNDBOARD_SOUND_CREATE", nullptr }, + { "GUILD_SOUNDBOARD_SOUND_DELETE", nullptr }, + { "GUILD_SOUNDBOARD_SOUNDS_UPDATE", nullptr }, { "VOICE_CHANNEL_STATUS_UPDATE", nullptr }, - { "GUILD_SCHEDULED_EVENT_CREATE", new dpp::events::guild_scheduled_event_create() }, - { "GUILD_SCHEDULED_EVENT_UPDATE", new dpp::events::guild_scheduled_event_update() }, - { "GUILD_SCHEDULED_EVENT_DELETE", new dpp::events::guild_scheduled_event_delete() }, - { "GUILD_SCHEDULED_EVENT_USER_ADD", new dpp::events::guild_scheduled_event_user_add() }, - { "GUILD_SCHEDULED_EVENT_USER_REMOVE", new dpp::events::guild_scheduled_event_user_remove() }, - { "AUTO_MODERATION_RULE_CREATE", new dpp::events::automod_rule_create() }, - { "AUTO_MODERATION_RULE_UPDATE", new dpp::events::automod_rule_update() }, - { "AUTO_MODERATION_RULE_DELETE", new dpp::events::automod_rule_delete() }, - { "AUTO_MODERATION_ACTION_EXECUTION", new dpp::events::automod_rule_execute() }, - { "GUILD_AUDIT_LOG_ENTRY_CREATE", new dpp::events::guild_audit_log_entry_create() }, - { "ENTITLEMENT_CREATE", new dpp::events::entitlement_create() }, - { "ENTITLEMENT_UPDATE", new dpp::events::entitlement_update() }, - { "ENTITLEMENT_DELETE", new dpp::events::entitlement_delete() }, + { "GUILD_SCHEDULED_EVENT_CREATE", make_static_event() }, + { "GUILD_SCHEDULED_EVENT_UPDATE", make_static_event() }, + { "GUILD_SCHEDULED_EVENT_DELETE", make_static_event() }, + { "GUILD_SCHEDULED_EVENT_USER_ADD", make_static_event() }, + { "GUILD_SCHEDULED_EVENT_USER_REMOVE", make_static_event() }, + { "AUTO_MODERATION_RULE_CREATE", make_static_event() }, + { "AUTO_MODERATION_RULE_UPDATE", make_static_event() }, + { "AUTO_MODERATION_RULE_DELETE", make_static_event() }, + { "AUTO_MODERATION_ACTION_EXECUTION", make_static_event() }, + { "GUILD_AUDIT_LOG_ENTRY_CREATE", make_static_event() }, + { "ENTITLEMENT_CREATE", make_static_event() }, + { "ENTITLEMENT_UPDATE", make_static_event() }, + { "ENTITLEMENT_DELETE", make_static_event() }, }; void discord_client::handle_event(const std::string &event, json &j, const std::string &raw) { - auto ev_iter = eventmap.find(event); - if (ev_iter != eventmap.end()) { + auto ev_iter = event_map.find(event); + if (ev_iter != event_map.end()) { /* A handler with nullptr is silently ignored. We don't plan to make a handler for it * so this usually some user-only thing that's crept into the API and shown to bots * that we dont care about. @@ -407,7 +434,7 @@ void discord_client::handle_event(const std::string &event, json &j, const std:: ev_iter->second->handle(this, j, raw); } } else { - log(dpp::ll_debug, "Unhandled event: " + event + ", " + j.dump()); + log(dpp::ll_debug, "Unhandled event: " + event + ", " + j.dump(-1, ' ', false, json::error_handler_t::replace)); } } diff --git a/src/dpp/discordvoiceclient.cpp b/src/dpp/discordvoiceclient.cpp index 5e514d7331..88932cca32 100644 --- a/src/dpp/discordvoiceclient.cpp +++ b/src/dpp/discordvoiceclient.cpp @@ -550,7 +550,7 @@ bool discord_voice_client::handle_frame(const std::string &data) } } }; - this->write(obj.dump()); + this->write(obj.dump(-1, ' ', false, json::error_handler_t::replace)); } else { log(dpp::ll_debug, "Connecting new voice session..."); json obj = { @@ -565,7 +565,7 @@ bool discord_voice_client::handle_frame(const std::string &data) } } }; - this->write(obj.dump()); + this->write(obj.dump(-1, ' ', false, json::error_handler_t::replace)); } this->connect_time = time(nullptr); } @@ -655,7 +655,7 @@ bool discord_voice_client::handle_frame(const std::string &data) } } } - }).dump()); + }).dump(-1, ' ', false, json::error_handler_t::replace)); } } break; @@ -692,6 +692,8 @@ dpp::utility::uptime discord_voice_client::get_remaining() { discord_voice_client& discord_voice_client::stop_audio() { std::lock_guard lock(this->stream_mutex); outbuf.clear(); + track_meta.clear(); + tracks = 0; return *this; } @@ -847,7 +849,7 @@ void discord_voice_client::write_ready() std::lock_guard lock(this->stream_mutex); if (!this->paused && outbuf.size()) { type = send_audio_type; - if (outbuf[0].packet.size() == 2 && (*((uint16_t*)(outbuf[0].packet.data()))) == AUDIO_TRACK_MARKER) { + if (outbuf[0].packet.size() == sizeof(uint16_t) && (*((uint16_t*)(outbuf[0].packet.data()))) == AUDIO_TRACK_MARKER) { outbuf.erase(outbuf.begin()); track_marker_found = true; if (tracks > 0) { @@ -1082,7 +1084,7 @@ void discord_voice_client::one_second_timer() if (this->heartbeat_interval) { /* Check if we're due to emit a heartbeat */ if (time(nullptr) > last_heartbeat + ((heartbeat_interval / 1000.0) * 0.75)) { - queue_message(json({{"op", 3}, {"d", rand()}}).dump(), true); + queue_message(json({{"op", 3}, {"d", rand()}}).dump(-1, ' ', false, json::error_handler_t::replace), true); last_heartbeat = time(nullptr); } } @@ -1165,20 +1167,29 @@ uint32_t discord_voice_client::get_tracks_remaining() { discord_voice_client& discord_voice_client::skip_to_next_marker() { std::lock_guard lock(this->stream_mutex); - /* Keep popping the first entry off the outbuf until the first entry is a track marker */ - while (!outbuf.empty() && outbuf[0].packet.size() != sizeof(uint16_t) && (*((uint16_t*)(outbuf[0].packet.data()))) != AUDIO_TRACK_MARKER) { - outbuf.erase(outbuf.begin()); - } - if (outbuf.size()) { - /* Remove the actual track marker out of the buffer */ - outbuf.erase(outbuf.begin()); + if (!outbuf.empty()) { + /* Find the first marker to skip to */ + auto i = std::find_if(outbuf.begin(), outbuf.end(), [](const voice_out_packet &v){ + return v.packet.size() == sizeof(uint16_t) && (*((uint16_t*)(v.packet.data()))) == AUDIO_TRACK_MARKER; + }); + + if (i != outbuf.end()) { + /* Skip queued packets until including found marker */ + outbuf.erase(outbuf.begin(), i+1); + } else { + /* No market found, skip the whole queue */ + outbuf.clear(); + } } + if (tracks > 0) { tracks--; } + if (!track_meta.empty()) { track_meta.erase(track_meta.begin()); } + return *this; } @@ -1296,7 +1307,7 @@ discord_voice_client& discord_voice_client::speak() { {"delay", 0}, {"ssrc", ssrc} }} - }).dump(), true); + }).dump(-1, ' ', false, json::error_handler_t::replace), true); sending = true; } return *this; diff --git a/src/dpp/events/message_poll_vote_add.cpp b/src/dpp/events/message_poll_vote_add.cpp new file mode 100644 index 0000000000..319d809e9c --- /dev/null +++ b/src/dpp/events/message_poll_vote_add.cpp @@ -0,0 +1,53 @@ +/************************************************************************************ + * + * D++, A Lightweight C++ library for Discord + * + * SPDX-License-Identifier: Apache-2.0 + * Copyright 2021 Craig Edwards and D++ contributors + * (https://github.com/brainboxdotcc/DPP/graphs/contributors) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ************************************************************************************/ +#include +#include +#include +#include +#include + + +namespace dpp::events { + + +/** + * @brief Handle event + * + * @param client Websocket client (current shard) + * @param j JSON data for the event + * @param raw Raw JSON string + */ +void message_poll_vote_add::handle(discord_client* client, json &j, const std::string &raw) { + + if (!client->creator->on_message_poll_vote_add.empty()) { + json d = j["d"]; + dpp::message_poll_vote_add_t vote(client, raw); + vote.user_id = snowflake_not_null(&j, "user_id"); + vote.message_id = snowflake_not_null(&j, "message_id"); + vote.channel_id = snowflake_not_null(&j, "channel_id"); + vote.guild_id = snowflake_not_null(&j, "guild_id"); + vote.answer_id = int32_not_null(&j, "answer_id"); + client->creator->on_message_poll_vote_add.call(vote); + } +} + +}; diff --git a/src/dpp/events/message_poll_vote_remove.cpp b/src/dpp/events/message_poll_vote_remove.cpp new file mode 100644 index 0000000000..55c243e767 --- /dev/null +++ b/src/dpp/events/message_poll_vote_remove.cpp @@ -0,0 +1,53 @@ +/************************************************************************************ + * + * D++, A Lightweight C++ library for Discord + * + * SPDX-License-Identifier: Apache-2.0 + * Copyright 2021 Craig Edwards and D++ contributors + * (https://github.com/brainboxdotcc/DPP/graphs/contributors) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ************************************************************************************/ +#include +#include +#include +#include +#include + + +namespace dpp::events { + + +/** + * @brief Handle event + * + * @param client Websocket client (current shard) + * @param j JSON data for the event + * @param raw Raw JSON string + */ +void message_poll_vote_remove::handle(discord_client* client, json &j, const std::string &raw) { + + if (!client->creator->on_message_poll_vote_add.empty()) { + json d = j["d"]; + dpp::message_poll_vote_remove_t vote(client, raw); + vote.user_id = snowflake_not_null(&j, "user_id"); + vote.message_id = snowflake_not_null(&j, "message_id"); + vote.channel_id = snowflake_not_null(&j, "channel_id"); + vote.guild_id = snowflake_not_null(&j, "guild_id"); + vote.answer_id = int32_not_null(&j, "answer_id"); + client->creator->on_message_poll_vote_remove.call(vote); + } +} + +}; diff --git a/src/dpp/guild.cpp b/src/dpp/guild.cpp index a1162321ea..2e0729e7b2 100644 --- a/src/dpp/guild.cpp +++ b/src/dpp/guild.cpp @@ -347,6 +347,11 @@ bool guild_member::has_rejoined() const { return flags & dpp::gm_did_rejoin; } +bool guild_member::is_guild_owner() const { + auto* _guild = find_guild(guild_id); + return _guild != nullptr && _guild->owner_id == this->user_id; +} + bool guild_member::has_completed_onboarding() const { return flags & dpp::gm_completed_onboarding; } @@ -776,7 +781,7 @@ guild_widget& guild_widget::fill_from_json_impl(nlohmann::json* j) { } json guild_widget::to_json_impl(bool with_id) const { - return json({{"channel_id", channel_id}, {"enabled", enabled}}).dump(); + return json({{"channel_id", channel_id}, {"enabled", enabled}}).dump(-1, ' ', false, json::error_handler_t::replace); } diff --git a/src/dpp/httpsclient.cpp b/src/dpp/httpsclient.cpp index 31ef37e49c..b18675cd65 100644 --- a/src/dpp/httpsclient.cpp +++ b/src/dpp/httpsclient.cpp @@ -103,7 +103,7 @@ multipart_content https_client::build_multipart(const std::string &json, const s /* Multiple files */ for (size_t i = 0; i < filenames.size(); ++i) { content += part_start + "name=\"files[" + std::to_string(i) + "]\"; filename=\"" + filenames[i] + "\""; - content += "\r\nContent-Type: " + (mimetypes.size() < i || mimetypes[i].empty() ? default_mime_type : mimetypes[i]) + two_cr; + content += "\r\nContent-Type: " + (mimetypes.size() <= i || mimetypes[i].empty() ? default_mime_type : mimetypes[i]) + two_cr; content += contents[i]; content += "\r\n"; } @@ -175,7 +175,7 @@ bool https_client::handle_buffer(std::string &buffer) h.erase(h.begin()); /* HTTP/1.1 200 OK */ std::vector req_status = utility::tokenize(status_line, " "); - if (req_status.size() >= 3 && (req_status[0] == "HTTP/1.1" || req_status[0] == "HTTP/1.0") && atoi(req_status[1].c_str())) { + if (req_status.size() >= 2 && (req_status[0] == "HTTP/1.1" || req_status[0] == "HTTP/1.0") && atoi(req_status[1].c_str())) { for(auto &hd : h) { std::string::size_type sep = hd.find(": "); if (sep != std::string::npos) { diff --git a/src/dpp/integration.cpp b/src/dpp/integration.cpp index f17239dd8a..c8e870fde1 100644 --- a/src/dpp/integration.cpp +++ b/src/dpp/integration.cpp @@ -110,7 +110,7 @@ json integration::to_json_impl(bool with_id) const { { "expire_behavior", (flags & if_expire_kick) ? 1 : 0 }, { "expire_grace_period", expire_grace_period }, { "enable_emoticons", emoticons_enabled() } - }).dump(); + }).dump(-1, ' ', false, json::error_handler_t::replace); } bool integration::emoticons_enabled() const { diff --git a/src/dpp/message.cpp b/src/dpp/message.cpp index d4523b5ff7..57ec118b60 100644 --- a/src/dpp/message.cpp +++ b/src/dpp/message.cpp @@ -357,7 +357,7 @@ void to_json(json& j, const component& cp) { o["type"] = "channel"; } else if (v.type == dpp::cdt_user) { o["type"] = "user"; - } + } j["default_values"].push_back(o); } } @@ -485,6 +485,155 @@ component &component::add_default_value(const snowflake id, const component_defa return *this; } +namespace { + +poll_media get_poll_media(const nlohmann::json& obj, std::string_view key) { + poll_media retval{}; + + if (auto it = obj.find(key); it != obj.end()) { + const json& media_json = *it; + + retval.text = string_not_null(&media_json, "text"); + if (it = media_json.find("emoji"); it != media_json.end()) { + const json& emoji_json = *it; + + retval.emoji.animated = bool_not_null(&emoji_json, "animated"); + retval.emoji.name = string_not_null(&emoji_json, "name"); + retval.emoji.id = snowflake_not_null(&emoji_json, "id"); + } + } + return retval; +}; + +json make_json(const poll_media &media) { + json retval{}; + + if (media.emoji.id != 0) { + json& emoji_json = retval["emoji"]; + emoji_json["id"] = media.emoji.id; + emoji_json["animated"] = media.emoji.animated; + } else if (!media.emoji.name.empty()) { + json& emoji_json = retval["emoji"]; + emoji_json["name"] = media.emoji.name; + emoji_json["animated"] = media.emoji.animated; + } + retval["text"] = media.text; + return retval; +} + +} + +void from_json(const nlohmann::json& j, poll& p) { + p.question = get_poll_media(j, "question"); + if (auto it = j.find("answers"); it != j.end() && it->is_array()) { + for (const json& element : *it) { + auto id = int32_not_null(&element, "answer_id"); + p.answers.emplace(id, poll_answer{ + id, + get_poll_media(element, "poll_media") + }); + } + } + p.expiry = double_not_null(&j, "expiry"); + p.allow_multiselect = bool_not_null(&j, "allow_multiselect"); + p.layout_type = static_cast(int32_not_null(&j, "layout_type")); + if (auto it = j.find("results"); it != j.end()) { + const json& results_json = *it; + poll_results p_results{}; + + p_results.is_finalized = bool_not_null(&results_json, "is_finalized"); + if (it = results_json.find("answer_counts"); it != results_json.end() && it->is_array()) { + for (const json& answer_count_json : *it) { + auto id = int32_not_null(&answer_count_json, "id"); + p_results.answer_counts.emplace(id, poll_results::answer_count{ + id, + int32_not_null(&answer_count_json, "count"), + bool_not_null(&answer_count_json, "me_voted") + }); + } + } + p.results = std::move(p_results); + } +} + +void to_json(json& j, const poll &p) { + j["question"] = make_json(p.question); + + json& answers_json = j["answers"]; + for (const auto& [_, answer] : p.answers) { + answers_json.emplace_back()["poll_media"] = make_json(answer.media); + } + /* When sending a poll object expiry is a duration in hours so we clamp it to positive and round */ + j["duration"] = (p.expiry < 0.0 ? uint32_t{0} : static_cast(p.expiry + 0.5)); + j["allow_multiselect"] = p.allow_multiselect; + j["layout_type"] = static_cast(p.layout_type); +} + +poll& poll::set_question(const std::string& text) { + question.text = text; + return *this; +} + +poll& poll::set_duration(uint32_t hours) noexcept { + expiry = static_cast(hours); + return *this; +} + +poll& poll::set_allow_multiselect(bool allow) noexcept { + allow_multiselect = allow; + return *this; +} + +poll& poll::add_answer(const poll_media& media) { + uint32_t max = 0; + for (const auto &pair : answers) { + if (pair.first > max) { + max = pair.first; + } + } + answers.emplace(max + 1, poll_answer{max + 1, media}); + return *this; +} + +poll& poll::add_answer(const std::string& text, snowflake emoji_id, bool is_animated) { + return add_answer(poll_media{text, partial_emoji{{}, emoji_id, is_animated}}); +} + +poll& poll::add_answer(const std::string& text, const std::string& emoji) { + return add_answer(poll_media{text, partial_emoji{emoji, {}, false}}); +} + +poll& poll::add_answer(const std::string& text, const emoji& e) { + return add_answer(poll_media{text, partial_emoji{e.name, e.id, e.is_animated()}}); +} + +const std::string& poll::get_question_text() const noexcept { + return question.text; +} + +const poll_media *poll::find_answer(uint32_t id) const noexcept { + if (auto it = answers.find(id); it != answers.end()) { + return &it->second.media; + } + return nullptr; +} + +std::optional poll::get_vote_count(uint32_t answer_id) const noexcept { + if (!results.has_value()) { + return std::nullopt; + } + if (auto it = results->answer_counts.find(answer_id); it != results->answer_counts.end()) { + return it->second.count; + } + /* Answers not present can mean 0 */ + if (find_answer(answer_id) == nullptr) { + return std::nullopt; + } + return 0; +} + + + embed::~embed() = default; embed::embed() : timestamp(0) { @@ -535,26 +684,32 @@ message::message(snowflake _channel_id, const std::string &_content, message_typ type = t; } -message& message::add_component(const component& c) -{ +message& message::add_component(const component& c) { components.emplace_back(c); return *this; } -message& message::add_embed(const embed& e) -{ +message& message::add_embed(const embed& e) { embeds.emplace_back(e); return *this; } -message& message::set_flags(uint16_t f) -{ +message& message::add_sticker(const sticker& s) { + stickers.emplace_back(s); + return *this; +} + +message& message::add_sticker(const snowflake& id) { + stickers.emplace_back().id = id; + return *this; +} + +message& message::set_flags(uint16_t f) { flags = f; return *this; } -message& message::set_type(message_type t) -{ +message& message::set_type(message_type t) { type = t; return *this; } @@ -611,16 +766,32 @@ message& message::set_guild_id(snowflake _guild_id) { return *this; } +message& message::set_poll(const poll& p) { + attached_poll = p; + return *this; +} + +const poll &message::get_poll() const { + return attached_poll.value(); +} + +bool message::has_poll() const noexcept { + return attached_poll.has_value(); +} + message::message(const std::string &_content, message_type t) : message() { content = utility::utf8substr(_content, 0, 4000); type = t; } -message::message(snowflake _channel_id, const embed& _embed) : message() { - channel_id = _channel_id; +message::message(const embed& _embed) : message() { embeds.emplace_back(_embed); } +message::message(snowflake _channel_id, const embed& _embed) : message(_embed) { + channel_id = _channel_id; +} + embed::embed(json* j) : embed() { title = string_not_null(j, "title"); type = string_not_null(j, "type"); @@ -835,7 +1006,7 @@ reaction::reaction(json* j) { } } -attachment::attachment(struct message* o) +attachment::attachment(struct message* o) : id(0) , size(0) , width(0) @@ -876,6 +1047,38 @@ bool attachment::is_remix() const { return flags & a_is_remix; } +time_t attachment::get_expire_time() const { + size_t attr_position = url.find('?'); + /* If no attributes were sent in url, we do not need to parse more */ + if(url.npos == attr_position){ + return 0; + } + std::string attributes = url.substr(attr_position + 1); + std::vector attr_list = utility::tokenize(attributes, "&"); + auto ex_attr = std::find_if(attr_list.begin(), attr_list.end(), [](const std::string& s){return s.substr(0, 3) == "ex=";}); + if(attr_list.end() == ex_attr){ + return 0; + } + /* Erase 'ex=' prefix before parsing */ + return std::stol(ex_attr->substr(3), nullptr, 16); +} + +time_t attachment::get_issued_time() const { + size_t attr_position = url.find('?'); + /* No attributes were sent in url, so we do not need to parse more */ + if(url.npos == attr_position){ + return 0; + } + std::string attributes = url.substr(attr_position + 1); + std::vector attr_list = utility::tokenize(attributes, "&"); + auto is_attr = std::find_if(attr_list.begin(), attr_list.end(), [](const std::string& s){return s.substr(0, 3) == "is=";}); + if(attr_list.end() == is_attr){ + return 0; + } + /* Erase 'is=' prefix before parsing */ + return std::stol(is_attr->substr(3), nullptr, 16); +} + json message::to_json(bool with_id, bool is_interaction_response) const { /* This is the basics. once it works, expand on it. */ json j({ @@ -942,6 +1145,12 @@ json message::to_json(bool with_id, bool is_interaction_response) const { } } + if (stickers.size()) { + auto [it, _] = j.emplace("sticker_ids", json::array()); + for (const sticker &s : stickers) { + it->push_back(std::to_string(s.id)); + } + } j["components"] = json::array(); for (auto & component : components) { @@ -1005,6 +1214,10 @@ json message::to_json(bool with_id, bool is_interaction_response) const { j["embeds"].push_back(e); } + if (attached_poll.has_value()) { + dpp::to_json(j["poll"], *attached_poll); + } + return j; } @@ -1024,6 +1237,15 @@ bool message::suppress_embeds() const { return flags & m_suppress_embeds; } +message& message::suppress_embeds(bool suppress) { + if (suppress) { + flags |= m_suppress_embeds; + } else { + flags &= ~m_suppress_embeds; + } + return *this; +} + bool message::is_source_message_deleted() const { return flags & m_source_message_deleted; } @@ -1174,6 +1396,9 @@ message& message::fill_from_json(json* d, cache_policy_t cp) { message_reference.message_id = snowflake_not_null(&mr, "message_id"); message_reference.fail_if_not_exists = bool_not_null(&mr, "fail_if_not_exists"); } + if (auto it = d->find("poll"); it != d->end()) { + from_json(*it, attached_poll.emplace()); + } return *this; } @@ -1238,9 +1463,6 @@ json sticker::to_json_impl(bool with_id) const { return j; } -sticker_pack::sticker_pack() : managed(0), sku_id(0), cover_sticker_id(0), banner_asset_id(0) { -} - sticker_pack& sticker_pack::fill_from_json_impl(nlohmann::json* j) { this->id = snowflake_not_null(j, "id"); this->sku_id = snowflake_not_null(j, "sku_id"); @@ -1275,7 +1497,12 @@ json sticker_pack::to_json_impl(bool with_id) const { j["description"] = description; j["stickers"] = json::array(); for (auto& s : stickers) { - j["stickers"].push_back(json::parse(s.second.build_json(with_id))); + try { + j["stickers"].push_back(json::parse(s.second.build_json(with_id))); + } + catch (const std::exception &e) { + /* Protection against malformed json in sticker */ + } } return j; } diff --git a/src/dpp/queues.cpp b/src/dpp/queues.cpp index 0d28de6b88..3625fadd2b 100644 --- a/src/dpp/queues.cpp +++ b/src/dpp/queues.cpp @@ -236,9 +236,46 @@ request_queue::~request_queue() out_ready.notify_one(); out_thread->join(); delete out_thread; - for (auto& ri : requests_in) { - delete ri; - } +} + +namespace +{ + +/** + * @brief Comparator for sorting a request container + */ +struct compare_request { + /** + * @brief Less_than comparator for sorting + * @param lhs Left-hand side + * @param rhs Right-hand side + * @return Whether lhs comes before rhs in strict ordering + */ + bool operator()(const std::unique_ptr& lhs, const std::unique_ptr& rhs) const noexcept { + return std::less{}(lhs->endpoint, rhs->endpoint); + }; + + /** + * @brief Less_than comparator for sorting + * @param lhs Left-hand side + * @param rhs Right-hand side + * @return Whether lhs comes before rhs in strict ordering + */ + bool operator()(const std::unique_ptr& lhs, std::string_view rhs) const noexcept { + return std::less{}(lhs->endpoint, rhs); + }; + + /** + * @brief Less_than comparator for sorting + * @param lhs Left-hand side + * @param rhs Right-hand side + * @return Whether lhs comes before rhs in strict ordering + */ + bool operator()(std::string_view lhs, const std::unique_ptr& rhs) const noexcept { + return std::less{}(lhs, rhs->endpoint); + }; +}; + } void in_thread::in_loop(uint32_t index) @@ -246,93 +283,92 @@ void in_thread::in_loop(uint32_t index) utility::set_thread_name(std::string("http_req/") + std::to_string(index)); while (!terminating) { std::mutex mtx; - std::unique_lock lock{ mtx }; + std::unique_lock lock{ mtx }; in_ready.wait_for(lock, std::chrono::seconds(1)); /* New request to be sent! */ if (!requests->globally_ratelimited) { - std::map> requests_in_copy; + std::vector requests_view; { - /* Make a safe copy within a mutex */ + /* Gather all the requests first within a mutex */ std::shared_lock lock(in_mutex); if (requests_in.empty()) { /* Nothing to copy, wait again */ continue; } - requests_in_copy = requests_in; + requests_view.reserve(requests_in.size()); + std::transform(requests_in.begin(), requests_in.end(), std::back_inserter(requests_view), [](const std::unique_ptr &r) { + return r.get(); + }); } - for (auto & bucket : requests_in_copy) { - for (auto req : bucket.second) { - - http_request_completion_t rv; - auto currbucket = buckets.find(bucket.first); - - if (currbucket != buckets.end()) { - /* There's a bucket for this request. Check its status. If the bucket says to wait, - * skip all requests in this bucket till its ok. - */ - if (currbucket->second.remaining < 1) { - uint64_t wait = (currbucket->second.retry_after ? currbucket->second.retry_after : currbucket->second.reset_after); - if ((uint64_t)time(nullptr) > currbucket->second.timestamp + wait) { - /* Time has passed, we can process this bucket again. send its request. */ - rv = req->run(creator); - } else { - if (!req->waiting) { - req->waiting = true; - } - /* Time not up yet, wait more */ - break; - } + for (auto& request_view : requests_view) { + const std::string &key = request_view->endpoint; + http_request_completion_t rv; + auto currbucket = buckets.find(key); + + if (currbucket != buckets.end()) { + /* There's a bucket for this request. Check its status. If the bucket says to wait, + * skip all requests in this bucket till its ok. + */ + if (currbucket->second.remaining < 1) { + uint64_t wait = (currbucket->second.retry_after ? currbucket->second.retry_after : currbucket->second.reset_after); + if ((uint64_t)time(nullptr) > currbucket->second.timestamp + wait) { + /* Time has passed, we can process this bucket again. send its request. */ + rv = request_view->run(creator); } else { - /* There's limit remaining, we can just run the request */ - rv = req->run(creator); + if (!request_view->waiting) { + request_view->waiting = true; + } + /* Time not up yet, wait more */ + break; } } else { - /* No bucket for this endpoint yet. Just send it, and make one from its reply */ - rv = req->run(creator); + /* There's limit remaining, we can just run the request */ + rv = request_view->run(creator); } - - bucket_t newbucket; - newbucket.limit = rv.ratelimit_limit; - newbucket.remaining = rv.ratelimit_remaining; - newbucket.reset_after = rv.ratelimit_reset_after; - newbucket.retry_after = rv.ratelimit_retry_after; - newbucket.timestamp = time(nullptr); - requests->globally_ratelimited = rv.ratelimit_global; - if (requests->globally_ratelimited) { - requests->globally_limited_for = (newbucket.retry_after ? newbucket.retry_after : newbucket.reset_after); - } - buckets[req->endpoint] = newbucket; - - /* Make a new entry in the completion list and notify */ - http_request_completion_t* hrc = new http_request_completion_t(); - *hrc = rv; - { - std::unique_lock lock(requests->out_mutex); - requests->responses_out.push(std::make_pair(hrc, req)); - } - requests->out_ready.notify_one(); + } else { + /* No bucket for this endpoint yet. Just send it, and make one from its reply */ + rv = request_view->run(creator); } - } - { - std::unique_lock lock(in_mutex); - bool again = false; - do { - again = false; - for (auto & bucket : requests_in) { - for (auto req = bucket.second.begin(); req != bucket.second.end(); ++req) { - if ((*req)->is_completed()) { - requests_in[bucket.first].erase(req); - again = true; - goto out; /* Only clean way out of a nested loop */ - } + bucket_t newbucket; + newbucket.limit = rv.ratelimit_limit; + newbucket.remaining = rv.ratelimit_remaining; + newbucket.reset_after = rv.ratelimit_reset_after; + newbucket.retry_after = rv.ratelimit_retry_after; + newbucket.timestamp = time(nullptr); + requests->globally_ratelimited = rv.ratelimit_global; + if (requests->globally_ratelimited) { + requests->globally_limited_for = (newbucket.retry_after ? newbucket.retry_after : newbucket.reset_after); + } + buckets[request_view->endpoint] = newbucket; + + /* Remove the request from the incoming requests to transfer it to completed requests */ + std::unique_ptr request; + { + /* Find the owned pointer in requests_in */ + std::scoped_lock lock1{in_mutex}; + + auto [begin, end] = std::equal_range(requests_in.begin(), requests_in.end(), key, compare_request{}); + for (auto it = begin; it != end; ++it) { + if (it->get() == request_view) { + /* Grab and remove */ + request = std::move(*it); + requests_in.erase(it); + break; } } - out:; - } while (again); + } + /* Make a new entry in the completion list and notify */ + auto hrc = std::make_unique(); + *hrc = rv; + { + std::scoped_lock lock1(requests->out_mutex); + requests->responses_out.push({std::move(request), std::move(hrc)}); + } + requests->out_ready.notify_one(); } } else { @@ -346,47 +382,59 @@ void in_thread::in_loop(uint32_t index) } } +bool request_queue::queued_deleting_request::operator<(const queued_deleting_request& other) const noexcept { + return time_to_delete < other.time_to_delete; +} + +bool request_queue::queued_deleting_request::operator<(time_t time) const noexcept { + return time_to_delete < time; +} + + void request_queue::out_loop() { utility::set_thread_name("req_callback"); while (!terminating) { std::mutex mtx; - std::unique_lock lock{ mtx }; + std::unique_lock lock{ mtx }; out_ready.wait_for(lock, std::chrono::seconds(1)); time_t now = time(nullptr); /* A request has been completed! */ - std::pair queue_head = {}; + completed_request queue_head = {}; { - std::unique_lock lock(out_mutex); + std::scoped_lock lock1(out_mutex); if (responses_out.size()) { - queue_head = responses_out.front(); + queue_head = std::move(responses_out.front()); responses_out.pop(); } } - if (queue_head.first && queue_head.second) { - queue_head.second->complete(*queue_head.first); + if (queue_head.request && queue_head.response) { + queue_head.request->complete(*queue_head.response); /* Queue deletions for 60 seconds from now */ - responses_to_delete.insert(std::make_pair(now + 60, queue_head)); + auto when = now + 60; + auto where = std::lower_bound(responses_to_delete.begin(), responses_to_delete.end(), when); + responses_to_delete.insert(where, {when, std::move(queue_head)}); } /* Check for deletable items every second regardless of select status */ - while (responses_to_delete.size() && now >= responses_to_delete.begin()->first) { - delete responses_to_delete.begin()->second.first; - delete responses_to_delete.begin()->second.second; - responses_to_delete.erase(responses_to_delete.begin()); + auto end = std::lower_bound(responses_to_delete.begin(), responses_to_delete.end(), now); + if (end != responses_to_delete.begin()) { + responses_to_delete.erase(responses_to_delete.begin(), end); } } } /* Post a http_request into the queue */ -void in_thread::post_request(http_request* req) +void in_thread::post_request(std::unique_ptr req) { { - std::unique_lock lock(in_mutex); - requests_in[req->endpoint].push_back(req); + std::scoped_lock lock(in_mutex); + + auto where = std::lower_bound(requests_in.begin(), requests_in.end(), req->endpoint, compare_request{}); + requests_in.emplace(where, std::move(req)); } in_ready.notify_one(); } @@ -410,9 +458,9 @@ inline uint32_t hash(const char *s) } /* Post a http_request into a request queue */ -request_queue& request_queue::post_request(http_request* req) +request_queue& request_queue::post_request(std::unique_ptr req) { - requests_in[hash(req->endpoint.c_str()) % in_thread_pool_size]->post_request(req); + requests_in[hash(req->endpoint.c_str()) % in_thread_pool_size]->post_request(std::move(req)); return *this; } diff --git a/src/dpp/role.cpp b/src/dpp/role.cpp index 99e87ffec1..89643f210f 100644 --- a/src/dpp/role.cpp +++ b/src/dpp/role.cpp @@ -474,7 +474,12 @@ json application_role_connection::to_json_impl(bool with_id) const { j["platform_username"] = platform_username; } if (std::holds_alternative(metadata)) { - j["metadata"] = json::parse(std::get(metadata).build_json()); + try { + j["metadata"] = json::parse(std::get(metadata).build_json()); + } + catch (const std::exception &e) { + /* Protection against malformed json in metadata */ + } } return j; } diff --git a/src/dpp/slashcommand.cpp b/src/dpp/slashcommand.cpp index 5b4b8cb9b0..77dd4bfebe 100644 --- a/src/dpp/slashcommand.cpp +++ b/src/dpp/slashcommand.cpp @@ -331,7 +331,7 @@ command_option_choice &command_option_choice::fill_from_json_impl(nlohmann::json } command_option::command_option(command_option_type t, const std::string &n, const std::string &d, bool r) : - type(t), name(n), description(d), required(r), autocomplete(false) + type(t), name(n), description(d), required(r), focused(false), autocomplete(false) { if (std::any_of(n.begin(), n.end(), [](unsigned char c){ return std::isupper(c); })) { throw dpp::logic_exception(err_command_has_caps, "Command options can not contain capital letters in the name of the option."); diff --git a/src/dpp/sslclient.cpp b/src/dpp/sslclient.cpp index 3d6577fa03..ee7f4d7af0 100644 --- a/src/dpp/sslclient.cpp +++ b/src/dpp/sslclient.cpp @@ -99,10 +99,20 @@ struct keepalive_cache_t { dpp::socket sfd; }; +/** + * @brief Custom deleter for SSL_CTX + */ +class openssl_context_deleter { +public: + void operator()(SSL_CTX* context) const noexcept { + SSL_CTX_free(context); + } +}; + /** * @brief OpenSSL context */ -thread_local SSL_CTX* openssl_context = nullptr; +thread_local std::unique_ptr openssl_context; /** * @brief Keepalive sessions, per-thread @@ -198,7 +208,7 @@ int connect_with_timeout(dpp::socket sockfd, const struct sockaddr *addr, sockle pollfd pfd = {}; pfd.fd = sockfd; pfd.events = POLLOUT; - int r = poll(&pfd, 1, 10); + int r = ::poll(&pfd, 1, 10); if (r > 0 && pfd.revents & POLLOUT) { rc = 0; } else if (r != 0 || pfd.revents & POLLERR) { @@ -213,6 +223,18 @@ int connect_with_timeout(dpp::socket sockfd, const struct sockaddr *addr, sockle #endif } +#ifndef _WIN32 +void set_signal_handler(int signal) +{ + struct sigaction sa; + sigaction(signal, nullptr, &sa); + if (sa.sa_flags == 0 && sa.sa_handler == nullptr) { + sa = {}; + sigaction(signal, &sa, nullptr); + } +} +#endif + ssl_client::ssl_client(const std::string &_hostname, const std::string &_port, bool plaintext_downgrade, bool reuse) : nonblocking(false), sfd(INVALID_SOCKET), @@ -227,11 +249,11 @@ ssl_client::ssl_client(const std::string &_hostname, const std::string &_port, b keepalive(reuse) { #ifndef WIN32 - signal(SIGALRM, SIG_IGN); + set_signal_handler(SIGALRM); + set_signal_handler(SIGXFSZ); + set_signal_handler(SIGCHLD); signal(SIGHUP, SIG_IGN); signal(SIGPIPE, SIG_IGN); - signal(SIGCHLD, SIG_IGN); - signal(SIGXFSZ, SIG_IGN); #else // Set up winsock. WSADATA wsadata; @@ -247,7 +269,7 @@ ssl_client::ssl_client(const std::string &_hostname, const std::string &_port, b pollfd pfd = {}; pfd.fd = iter->second.sfd; pfd.events = POLLOUT; - int r = poll(&pfd, 1, 1); + int r = ::poll(&pfd, 1, 1); if (time(nullptr) > (iter->second.created + 60) || r < 0 || pfd.revents & POLLERR) { make_new = true; /* This connection is dead, free its resources and make a new one */ @@ -273,13 +295,7 @@ ssl_client::ssl_client(const std::string &_hostname, const std::string &_port, b if (plaintext) { ssl = nullptr; } else { - try { - ssl = new openssl_connection(); - } - catch (std::bad_alloc&) { - delete ssl; - throw; - } + ssl = new openssl_connection(); } } try { @@ -321,21 +337,21 @@ void ssl_client::connect() const SSL_METHOD *method = TLS_client_method(); /* Create new client-method instance */ /* Create SSL context */ - openssl_context = SSL_CTX_new(method); - if (openssl_context == nullptr) { + openssl_context.reset(SSL_CTX_new(method)); + if (!openssl_context) { throw dpp::connection_exception(err_ssl_context, "Failed to create SSL client context!"); } /* Do not allow SSL 3.0, TLS 1.0 or 1.1 * https://www.packetlabs.net/posts/tls-1-1-no-longer-secure/ */ - if (!SSL_CTX_set_min_proto_version(openssl_context, TLS1_2_VERSION)) { + if (!SSL_CTX_set_min_proto_version(openssl_context.get(), TLS1_2_VERSION)) { throw dpp::connection_exception(err_ssl_version, "Failed to set minimum SSL version!"); } } /* Create SSL session */ - ssl->ssl = SSL_new(openssl_context); + ssl->ssl = SSL_new(openssl_context.get()); if (ssl->ssl == nullptr) { throw dpp::connection_exception(err_ssl_new, "SSL_new failed!"); } @@ -464,7 +480,7 @@ void ssl_client::read_loop() const int64_t now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); int poll_time = 1000 - (now % 1000); poll_time = poll_time > 400 ? 1000 : poll_time + poll_time / 3 + 1; - r = poll(pfd, sockets, now / 1000 == (int64_t)last_tick ? poll_time : 0); + r = ::poll(pfd, sockets, now / 1000 == (int64_t)last_tick ? poll_time : 0); if (r == 0) { continue; diff --git a/src/dpp/thread.cpp b/src/dpp/thread.cpp index 9c95954c23..8cfe5d618a 100644 --- a/src/dpp/thread.cpp +++ b/src/dpp/thread.cpp @@ -44,6 +44,8 @@ thread& thread::fill_from_json_impl(json* j) { set_int32_not_null(j, "total_message_sent", this->total_messages_sent); set_int8_not_null(j, "message_count", this->message_count); set_int8_not_null(j, "member_count", this->member_count); + set_bool_not_null(j, "newly_created", this->newly_created); + auto json_metadata = (*j)["thread_metadata"]; metadata.archived = bool_not_null(&json_metadata, "archived"); metadata.archive_timestamp = ts_not_null(&json_metadata, "archive_timestamp"); diff --git a/src/dpp/utility.cpp b/src/dpp/utility.cpp index 07638d1201..0b07ec0e8f 100644 --- a/src/dpp/utility.cpp +++ b/src/dpp/utility.cpp @@ -408,7 +408,7 @@ uint32_t rgb(int red, int green, int blue) { uint32_t cmyk(double c, double m, double y, double k) { int r = (int)(255 * (1 - c) * (1 - k)); int g = (int)(255 * (1 - m) * (1 - k)); - int b = (int)(255 * (1 - y) * (1 - m)); + int b = (int)(255 * (1 - y) * (1 - k)); return rgb(r, g, b); } @@ -482,83 +482,67 @@ void exec(const std::string& cmd, std::vector parameters, cmd_resul t.detach(); } -size_t utf8len(const std::string &str) -{ - size_t i = 0, iBefore = 0, count = 0; - const char* s = str.c_str(); - if (*s == 0) { - return 0; - } +size_t utf8len(std::string_view str) { + const size_t raw_len = str.length(); + size_t pos = 0; + size_t code_points = 0; - while (s[i] > 0) { -ascii: - i++; - } + while (pos != raw_len) { + const unsigned char cur = str[pos]; - count += i - iBefore; + size_t code_point_len = 1; + code_point_len += static_cast(cur >= 0b11000000); + code_point_len += static_cast(cur >= 0b11100000); + code_point_len += static_cast(cur >= 0b11110000); - while (s[i]) { - if (s[i] > 0) { - iBefore = i; - goto ascii; - } else { - switch (0xF0 & s[i]) { - case 0xE0: - i += 3; - break; - case 0xF0: - i += 4; - break; - default: - i += 2; - break; - } + if (raw_len - pos < code_point_len) { + return 0; // invalid utf8, avoid going past the end } + pos += code_point_len; - count++; + code_points += 1; } - return count; + return code_points; } -std::string utf8substr(const std::string& str, std::string::size_type start, std::string::size_type leng) -{ - if (leng == 0) { - return ""; - } - if (start == 0 && leng >= utf8len(str)) { - return str; - } - std::string::size_type i, ix, q, min = std::string::npos, max = std::string::npos; - for (q = 0, i = 0, ix = str.length(); i < ix; i++, q++) { - if (q == start) { - min = i; +std::string_view utf8subview(std::string_view str, size_t start, size_t length) { + const size_t raw_len = str.length(); + size_t pos = 0; + size_t code_points = 0; + + size_t subview_start = raw_len; + size_t subview_len = std::string_view::npos; + + while (pos != raw_len) { + if (code_points == start) { + subview_start = pos; } - if (q <= start + leng || leng == std::string::npos) { - max = i; + if (code_points == start + length) { + subview_len = pos - subview_start; + break; // no point in traversing the remainder of the string } - unsigned char c = (unsigned char)str[i]; - if (c < 0x80) { - i += 0; - } else if ((c & 0xE0) == 0xC0) { - i += 1; - } else if ((c & 0xF0) == 0xE0) { - i += 2; - } else if ((c & 0xF8) == 0xF0) { - i += 3; - } else { - return ""; //invalid utf8 + const unsigned char cur = str[pos]; + + size_t code_point_len = 1; + code_point_len += static_cast(cur >= 0b11000000); + code_point_len += static_cast(cur >= 0b11100000); + code_point_len += static_cast(cur >= 0b11110000); + + if (raw_len - pos < code_point_len) { + return ""; // invalid utf8, avoid going past the end } + pos += code_point_len; + + code_points += 1; } - if (q <= start + leng || leng == std::string::npos) { - max = i; - } - if (min == std::string::npos || max == std::string::npos) { - return ""; - } - return str.substr(min, max); + return str.substr(subview_start, subview_len); +} + +std::string utf8substr(std::string_view str, size_t start, size_t length) { + return std::string(utf8subview(str, start, length)); } std::string read_file(const std::string& filename) @@ -654,11 +638,19 @@ std::function log_error() { return [](const dpp::confirmation_callback_t& detail) { if (detail.is_error()) { if (detail.bot) { - error_info e = detail.get_error(); - detail.bot->log( - dpp::ll_error, - "Error: " + e.human_readable - ); + try { + error_info e = detail.get_error(); + detail.bot->log( + dpp::ll_error, + "Error: " + e.human_readable + ); + } + catch (const std::exception& e) { + detail.bot->log( + dpp::ll_error, + "Error: " + std::string(e.what()) + ); + } } } }; diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp index fb599462a1..369e417f40 100644 --- a/src/unittest/test.cpp +++ b/src/unittest/test.cpp @@ -188,6 +188,23 @@ Markdown lol ||spoiler|| ~~strikethrough~~ `small *code* block`\n"; }"; error_message_success = (error_message_success && error_test.get_error().human_readable == "50035: Invalid Form Body - [1].options[1].description: Must be between 1 and 100 in length. (BASE_TYPE_BAD_LENGTH)"); + error_test.http_info.body = "{\ + \"message\": \"Invalid Form Body\",\ + \"code\": 50035,\ + \"errors\": {\ + \"data\": {\ + \"poll\": {\ + \"_errors\": [\ + {\ + \"code\": \"POLL_TYPE_QUESTION_ALLOWS_TEXT_ONLY\",\ + \"message\": \"This poll type cannot include attachments, emoji or stickers with the question\"}\ + ]\ + }\ + }\ + }\ + }"; + error_message_success = (error_message_success && error_test.get_error().human_readable == "50035: Invalid Form Body - data.poll: This poll type cannot include attachments, emoji or stickers with the question (POLL_TYPE_QUESTION_ALLOWS_TEXT_ONLY)"); + set_test(ERRORS, error_message_success); set_test(MD_ESC_1, false); @@ -940,6 +957,15 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b } }); + if (!offline) { + start_test(INVALIDUTF8); + bot.message_create(dpp::message(TEST_TEXT_CHANNEL_ID, "ä\xA9ü"), [](const auto &cc) { + set_status(INVALIDUTF8, ts_success); + }); + } else { + set_status(INVALIDUTF8, ts_skipped); + } + dpp::utility::iconhash i; std::string dummyval("fcffffffffffff55acaaaaaaaaaaaa66"); i = dummyval; @@ -977,7 +1003,7 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b return; } g.remove_icon(); - bot.guild_edit(g, [&bot](const dpp::confirmation_callback_t &result) { + bot.guild_edit(g, [](const dpp::confirmation_callback_t &result) { if (result.is_error()) { set_status(GUILD_EDIT, ts_failed, "guild_edit 2 errored:\n" + result.get_error().human_readable); return; @@ -2076,7 +2102,7 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b } }); } - + set_test(THREAD_CREATE, false); if (!offline) { bot.thread_create("thread test", TEST_TEXT_CHANNEL_ID, 60, dpp::channel_type::CHANNEL_PUBLIC_THREAD, true, 60, [&](const dpp::confirmation_callback_t &event) { @@ -2088,6 +2114,99 @@ Markdown lol \\|\\|spoiler\\|\\| \\~\\~strikethrough\\~\\~ \\`small \\*code\\* b }); } + start_test(POLL_CREATE); + if (!offline) { + dpp::message poll_msg{}; + + poll_msg.set_poll(dpp::poll{} + .set_question("hello!") + .add_answer("one", dpp::unicode_emoji::one) + .add_answer("two", dpp::unicode_emoji::two) + .add_answer("three", dpp::unicode_emoji::three) + .add_answer("four") + .set_duration(48) + .set_allow_multiselect(true) + ).set_channel_id(TEST_TEXT_CHANNEL_ID); + + bot.message_create(poll_msg, [&bot, poll_msg](const dpp::confirmation_callback_t& result) { + if (result.is_error()) { + set_status(POLL_CREATE, ts_failed, result.get_error().human_readable); + return; + } + + const dpp::message& m = std::get(result.value); + + if (!m.attached_poll.has_value()) { + set_status(POLL_CREATE, ts_failed, "poll missing in received message"); + return; + } + + if (m.attached_poll->find_answer(std::numeric_limits::max()) != nullptr) { + set_status(POLL_CREATE, ts_failed, "poll::find_answer failed to return nullptr"); + return; + } + + std::array correct = {false, false, false, false}; + int i = 0; + for (const auto& [_, answer] : m.attached_poll->answers) { + if (m.attached_poll->find_answer(answer.id) != &answer.media) { + set_status(POLL_CREATE, ts_failed, "poll::find_answer failed to return valid answer"); + return; + } + if (answer.media.text == "one" && answer.media.emoji.name == dpp::unicode_emoji::one) { + if (correct[i]) { + set_status(POLL_CREATE, ts_failed, "poll answer found twice"); + return; + } + correct[i] = true; + } + if (answer.media.text == "two" && answer.media.emoji.name == dpp::unicode_emoji::two) { + if (correct[i]) { + set_status(POLL_CREATE, ts_failed, "poll answer found twice"); + return; + } + correct[i] = true; + } + if (answer.media.text == "three" && answer.media.emoji.name == dpp::unicode_emoji::three) { + if (correct[i]) { + set_status(POLL_CREATE, ts_failed, "poll answer found twice"); + return; + } + correct[i] = true; + } + if (answer.media.text == "four" && answer.media.emoji.name.empty()) { + if (correct[i]) { + set_status(POLL_CREATE, ts_failed, "poll answer found twice"); + return; + } + correct[i] = true; + bot.poll_get_answer_voters(m, answer.id, 0, 100, [m, &bot](const dpp::confirmation_callback_t& result) { + if (result.is_error()) { + set_status(POLL_CREATE, ts_failed, "poll_get_answer_voters: " + result.get_error().human_readable); + return; + } + + start_test(POLL_END); + bot.poll_end(m, [message_id = m.id, channel_id = m.channel_id, &bot](const dpp::confirmation_callback_t& result) { + if (result.is_error()) { + set_status(POLL_END, ts_failed, result.get_error().human_readable); + return; + } + set_status(POLL_END, ts_success); + bot.message_delete(message_id, channel_id); + }); + }); + } + ++i; + } + if (correct == std::array{true, true, true, true}) { + set_status(POLL_CREATE, ts_success); + } else { + set_status(POLL_CREATE, ts_failed, "failed to find the submitted answers"); + } + }); + } + set_test(MEMBER_GET, false); if (!offline) { bot.guild_get_member(TEST_GUILD_ID, TEST_USER_ID, [](const dpp::confirmation_callback_t &event){ diff --git a/src/unittest/test.h b/src/unittest/test.h index 2cdb80ac77..cb34b207da 100644 --- a/src/unittest/test.h +++ b/src/unittest/test.h @@ -149,6 +149,7 @@ DPP_TEST(FORUM_CREATION, "create a forum channel", tf_online); DPP_TEST(FORUM_CHANNEL_GET, "retrieve the created forum channel", tf_online); DPP_TEST(FORUM_CHANNEL_DELETE, "delete the created forum channel", tf_online); DPP_TEST(ERRORS, "Human readable error translation", tf_offline); +DPP_TEST(INVALIDUTF8, "Invalid UTF-8 handling", tf_online); DPP_TEST(GUILD_EDIT, "cluster::guild_edit", tf_online); DPP_TEST(GUILD_BAN_CREATE, "cluster::guild_ban_add ban three deleted discord accounts", tf_online); @@ -233,6 +234,9 @@ DPP_TEST(VOICESEND, "Send audio to voice channel", tf_online | tf_extended); // DPP_TEST(MESSAGEPIN, "Pinning a channel message", tf_online | tf_extended); DPP_TEST(MESSAGEUNPIN, "Unpinning a channel message", tf_online | tf_extended); +DPP_TEST(POLL_CREATE, "Creating a poll", tf_online); +DPP_TEST(POLL_END, "Ending a poll", tf_online); + DPP_TEST(THREAD_MEMBER_ADD, "cluster::thread_member_add", tf_online | tf_extended); DPP_TEST(THREAD_MEMBER_GET, "cluster::thread_member_get", tf_online | tf_extended); DPP_TEST(THREAD_MEMBERS_GET, "cluster::thread_members_get", tf_online | tf_extended); diff --git a/vcpkg/ports/dpp/portfile.cmake b/vcpkg/ports/dpp/portfile.cmake index daddf98ad5..af8d57e936 100644 --- a/vcpkg/ports/dpp/portfile.cmake +++ b/vcpkg/ports/dpp/portfile.cmake @@ -2,7 +2,7 @@ vcpkg_from_github( OUT_SOURCE_PATH SOURCE_PATH REPO brainboxdotcc/DPP REF "v${VERSION}" - SHA512 fcb9b8181827fc63fb2f9aff44e697d18a0bfd94714888492a63a04e0112f42f9506bfab8181e822aa5ce85e6b6a8aa44e0774baeac3e52c3f41348cbf55a76a + SHA512 4842e5e688893275e524f998bdcac1d308165a02c280f69eaa898aa8f9986a97fe687e20e3428f30777c49f1feb47905da462bbdba8c9a5ea00067e560208f91 ) vcpkg_cmake_configure( diff --git a/vcpkg/ports/dpp/vcpkg.json b/vcpkg/ports/dpp/vcpkg.json index 1f7df2cf68..5d21e83d5f 100644 --- a/vcpkg/ports/dpp/vcpkg.json +++ b/vcpkg/ports/dpp/vcpkg.json @@ -1,6 +1,6 @@ { "name": "dpp", - "version": "10.0.29", + "version": "10.0.30", "description": "D++ Extremely Lightweight C++ Discord Library.", "homepage": "https://dpp.dev/", "license": "Apache-2.0", diff --git a/vcpkg/versions/baseline.json b/vcpkg/versions/baseline.json index c3a00e491e..7e91f07b2a 100644 --- a/vcpkg/versions/baseline.json +++ b/vcpkg/versions/baseline.json @@ -6,18 +6,18 @@ }, "7zip": { "baseline": "23.01", - "port-version": 1 + "port-version": 2 }, "ableton": { "baseline": "3.0.6", "port-version": 2 }, "ableton-link": { - "baseline": "3.0.6", - "port-version": 1 + "baseline": "3.1.1", + "port-version": 0 }, "abseil": { - "baseline": "20230802.1", + "baseline": "20240116.2", "port-version": 0 }, "absent": { @@ -25,19 +25,19 @@ "port-version": 3 }, "ace": { - "baseline": "7.1.2", - "port-version": 1 + "baseline": "7.1.4", + "port-version": 0 }, "acl": { "baseline": "2.3.1", - "port-version": 1 + "port-version": 2 }, "activemq-cpp": { "baseline": "3.9.5", "port-version": 15 }, "ada-url": { - "baseline": "2.7.4", + "baseline": "2.7.7", "port-version": 0 }, "ade": { @@ -45,8 +45,8 @@ "port-version": 0 }, "adios2": { - "baseline": "2.8.3", - "port-version": 1 + "baseline": "2.9.2", + "port-version": 0 }, "advobfuscator": { "baseline": "2020-06-26", @@ -61,8 +61,8 @@ "port-version": 1 }, "aklomp-base64": { - "baseline": "2023-01-06", - "port-version": 1 + "baseline": "0.5.1", + "port-version": 0 }, "alac": { "baseline": "2017-11-03-c38887c5", @@ -77,11 +77,11 @@ "port-version": 0 }, "aliyun-oss-c-sdk": { - "baseline": "3.10.0", - "port-version": 3 + "baseline": "3.10.1", + "port-version": 0 }, "allegro5": { - "baseline": "5.2.9.0", + "baseline": "5.2.9.1", "port-version": 0 }, "alpaca": { @@ -89,20 +89,20 @@ "port-version": 0 }, "alpaka": { - "baseline": "1.0.0", + "baseline": "1.1.0", "port-version": 0 }, "alsa": { - "baseline": "1.2.10", - "port-version": 0 + "baseline": "1.2.11", + "port-version": 1 }, "amd-adl-sdk": { "baseline": "17.1", "port-version": 0 }, "amd-amf": { - "baseline": "1.4.29", - "port-version": 0 + "baseline": "1.4.33", + "port-version": 1 }, "ampl-asl": { "baseline": "2020-11-11", @@ -113,7 +113,7 @@ "port-version": 4 }, "amqpcpp": { - "baseline": "4.3.23", + "baseline": "4.3.26", "port-version": 0 }, "anari": { @@ -133,11 +133,11 @@ "port-version": 7 }, "ankurvdev-embedresource": { - "baseline": "0.0.10", + "baseline": "0.0.11", "port-version": 0 }, "annoy": { - "baseline": "1.17.2", + "baseline": "1.17.3", "port-version": 0 }, "antlr4": { @@ -153,15 +153,15 @@ "port-version": 2 }, "aom": { - "baseline": "3.7.0", - "port-version": 0 + "baseline": "3.8.1", + "port-version": 1 }, "apache-datasketches": { - "baseline": "4.1.0", + "baseline": "5.0.2", "port-version": 0 }, "approval-tests-cpp": { - "baseline": "10.12.2", + "baseline": "10.13.0", "port-version": 0 }, "apr": { @@ -172,6 +172,10 @@ "baseline": "1.6.3", "port-version": 0 }, + "apriltag": { + "baseline": "3.4.0", + "port-version": 0 + }, "apsi": { "baseline": "0.11.0", "port-version": 0 @@ -194,7 +198,7 @@ }, "argh": { "baseline": "1.3.2", - "port-version": 0 + "port-version": 1 }, "argon2": { "baseline": "20190702", @@ -221,24 +225,24 @@ "port-version": 0 }, "aricpp": { - "baseline": "1.1.2", + "baseline": "1.1.3", "port-version": 0 }, "armadillo": { - "baseline": "12.4.1", - "port-version": 0 + "baseline": "12.6.6", + "port-version": 1 }, "arpack-ng": { - "baseline": "3.9.0", - "port-version": 1 + "baseline": "3.9.1", + "port-version": 0 }, "arrayfire": { "baseline": "3.8.0", "port-version": 5 }, "arrow": { - "baseline": "14.0.1", - "port-version": 2 + "baseline": "16.0.0", + "port-version": 1 }, "arsenalgear": { "baseline": "2.1.0", @@ -249,13 +253,17 @@ "port-version": 0 }, "asio": { - "baseline": "1.28.2", + "baseline": "1.30.2", "port-version": 0 }, "asio-grpc": { - "baseline": "2.7.0", + "baseline": "3.1.0", "port-version": 0 }, + "asiochan": { + "baseline": "2022-11-25", + "port-version": 1 + }, "asiosdk": { "baseline": "2.3.3", "port-version": 7 @@ -269,13 +277,17 @@ "port-version": 1 }, "assimp": { - "baseline": "5.3.1", - "port-version": 3 + "baseline": "5.4.0", + "port-version": 0 }, "async-mqtt": { - "baseline": "3.0.0", + "baseline": "5.1.1", "port-version": 0 }, + "async-simple": { + "baseline": "1.3", + "port-version": 1 + }, "asynch": { "baseline": "2019-09-21", "port-version": 3 @@ -286,42 +298,46 @@ }, "at-spi2-atk": { "baseline": "2.38.0", - "port-version": 0 + "port-version": 1 }, "at-spi2-core": { "baseline": "2.44.1", - "port-version": 2 + "port-version": 3 }, "atk": { "baseline": "2.38.0", "port-version": 8 }, "atkmm": { - "baseline": "2.36.1", - "port-version": 2 + "baseline": "2.36.3", + "port-version": 0 }, "atl": { "baseline": "0", "port-version": 0 }, + "atliac-minitest": { + "baseline": "1.0.0", + "port-version": 0 + }, "atlmfc": { "baseline": "0", "port-version": 3 }, "atomic-queue": { - "baseline": "2021-05-03", + "baseline": "1.6.3", "port-version": 0 }, "attr": { - "baseline": "2.5.1", - "port-version": 1 + "baseline": "2.5.2", + "port-version": 0 }, "aubio": { "baseline": "2022-01-26", "port-version": 1 }, "audiofile": { - "baseline": "1.1.0", + "baseline": "1.1.1", "port-version": 0 }, "aurora": { @@ -334,10 +350,10 @@ }, "autodock-vina": { "baseline": "1.2.5", - "port-version": 1 + "port-version": 2 }, "avcpp": { - "baseline": "2.1.0", + "baseline": "2.3.0", "port-version": 0 }, "avisynthplus": { @@ -352,60 +368,64 @@ "baseline": "1.11.3", "port-version": 0 }, + "awlib": { + "baseline": "2024-04-06", + "port-version": 0 + }, "aws-c-auth": { - "baseline": "0.7.8", + "baseline": "0.7.16", "port-version": 0 }, "aws-c-cal": { - "baseline": "0.6.9", + "baseline": "0.6.10", "port-version": 0 }, "aws-c-common": { - "baseline": "0.9.10", + "baseline": "0.9.14", "port-version": 0 }, "aws-c-compression": { - "baseline": "0.2.17", + "baseline": "0.2.18", "port-version": 0 }, "aws-c-event-stream": { - "baseline": "0.3.2", + "baseline": "0.4.2", "port-version": 0 }, "aws-c-http": { - "baseline": "0.7.14", + "baseline": "0.8.1", "port-version": 0 }, "aws-c-io": { - "baseline": "0.13.36", + "baseline": "0.14.6", "port-version": 0 }, "aws-c-mqtt": { - "baseline": "0.9.10", + "baseline": "0.10.3", "port-version": 0 }, "aws-c-s3": { - "baseline": "0.4.3", + "baseline": "0.5.4", "port-version": 0 }, "aws-c-sdkutils": { - "baseline": "0.1.12", + "baseline": "0.1.15", "port-version": 0 }, "aws-checksums": { - "baseline": "0.1.17", + "baseline": "0.1.18", "port-version": 0 }, "aws-crt-cpp": { - "baseline": "0.24.8", + "baseline": "0.26.4", "port-version": 0 }, "aws-lambda-cpp": { - "baseline": "0.2.9", + "baseline": "0.2.10", "port-version": 0 }, "aws-sdk-cpp": { - "baseline": "1.11.215", + "baseline": "1.11.285", "port-version": 1 }, "azmq": { @@ -413,32 +433,36 @@ "port-version": 0 }, "azure-c-shared-utility": { - "baseline": "2023-08-07", - "port-version": 0 + "baseline": "2024-03-04", + "port-version": 1 }, "azure-core-amqp-cpp": { - "baseline": "1.0.0-beta.5", + "baseline": "1.0.0-beta.9", "port-version": 0 }, "azure-core-cpp": { - "baseline": "1.10.3", - "port-version": 2 + "baseline": "1.12.0", + "port-version": 0 }, "azure-core-tracing-opentelemetry-cpp": { "baseline": "1.0.0-beta.4", - "port-version": 1 + "port-version": 3 + }, + "azure-data-tables-cpp": { + "baseline": "1.0.0-beta.2", + "port-version": 0 }, "azure-identity-cpp": { "baseline": "1.6.0", - "port-version": 0 + "port-version": 1 }, "azure-iot-sdk-c": { - "baseline": "2023-08-07", + "baseline": "2024-03-04", "port-version": 0 }, "azure-kinect-sensor-sdk": { "baseline": "1.4.1", - "port-version": 5 + "port-version": 6 }, "azure-macro-utils-c": { "baseline": "2022-01-21", @@ -446,39 +470,39 @@ }, "azure-messaging-eventhubs-checkpointstore-blob-cpp": { "baseline": "1.0.0-beta.1", - "port-version": 0 + "port-version": 2 }, "azure-messaging-eventhubs-cpp": { - "baseline": "1.0.0-beta.4", + "baseline": "1.0.0-beta.8", "port-version": 0 }, "azure-security-attestation-cpp": { "baseline": "1.1.0", - "port-version": 1 + "port-version": 3 }, "azure-security-keyvault-administration-cpp": { - "baseline": "4.0.0-beta.3", + "baseline": "4.0.0-beta.4", "port-version": 1 }, "azure-security-keyvault-certificates-cpp": { - "baseline": "4.2.0", + "baseline": "4.2.1", "port-version": 1 }, "azure-security-keyvault-keys-cpp": { - "baseline": "4.4.0", + "baseline": "4.4.1", "port-version": 1 }, "azure-security-keyvault-secrets-cpp": { - "baseline": "4.2.0", + "baseline": "4.2.1", "port-version": 1 }, "azure-storage-blobs-cpp": { "baseline": "12.10.0", - "port-version": 0 + "port-version": 1 }, "azure-storage-common-cpp": { "baseline": "12.5.0", - "port-version": 0 + "port-version": 1 }, "azure-storage-cpp": { "baseline": "7.5.0", @@ -486,26 +510,26 @@ }, "azure-storage-files-datalake-cpp": { "baseline": "12.9.0", - "port-version": 0 + "port-version": 1 }, "azure-storage-files-shares-cpp": { "baseline": "12.8.0", - "port-version": 0 + "port-version": 1 }, "azure-storage-queues-cpp": { "baseline": "12.2.0", - "port-version": 0 + "port-version": 1 }, "azure-uamqp-c": { - "baseline": "2023-08-07", + "baseline": "2024-03-04", "port-version": 0 }, "azure-uhttp-c": { - "baseline": "2023-08-07", + "baseline": "2024-03-04", "port-version": 0 }, "azure-umqtt-c": { - "baseline": "2023-08-03", + "baseline": "2024-03-04", "port-version": 0 }, "b64": { @@ -513,11 +537,11 @@ "port-version": 2 }, "backward-cpp": { - "baseline": "1.6", + "baseline": "2023-11-24", "port-version": 1 }, "baresip-libre": { - "baseline": "3.7.0", + "baseline": "3.11.0", "port-version": 0 }, "basisu": { @@ -529,15 +553,15 @@ "port-version": 3 }, "bddisasm": { - "baseline": "1.34.10", + "baseline": "2.1.0", "port-version": 0 }, "bde": { - "baseline": "3.123.0.0", + "baseline": "3.124.0.0", "port-version": 0 }, "bdwgc": { - "baseline": "8.2.4", + "baseline": "8.2.6", "port-version": 0 }, "beast": { @@ -550,10 +574,10 @@ }, "benchmark": { "baseline": "1.8.3", - "port-version": 0 + "port-version": 3 }, "bento4": { - "baseline": "1.6.0-640", + "baseline": "1.6.0-641", "port-version": 0 }, "berkeleydb": { @@ -566,26 +590,26 @@ }, "bext-di": { "baseline": "1.3.0", - "port-version": 0 + "port-version": 1 }, "bext-mp": { "baseline": "2023-03-02", "port-version": 0 }, "bext-sml": { - "baseline": "1.1.5", + "baseline": "1.1.9", "port-version": 0 }, "bext-sml2": { - "baseline": "2023-09-20", + "baseline": "2024-02-02", "port-version": 0 }, "bext-ut": { - "baseline": "1.1.9", - "port-version": 2 + "baseline": "2.0.1", + "port-version": 0 }, "bext-wintls": { - "baseline": "0.9.7", + "baseline": "0.9.8", "port-version": 0 }, "bfgroup-lyra": { @@ -637,16 +661,16 @@ "port-version": 0 }, "blake3": { - "baseline": "1.5.0", + "baseline": "1.5.1", "port-version": 0 }, "blas": { - "baseline": "2023-03-25", + "baseline": "2023-04-14", "port-version": 0 }, "blaze": { "baseline": "3.8.2", - "port-version": 0 + "port-version": 1 }, "blend2d": { "baseline": "2023-06-16", @@ -658,7 +682,7 @@ }, "blitz": { "baseline": "2020-03-25", - "port-version": 5 + "port-version": 6 }, "bloomberg-quantum": { "baseline": "2023-02-03", @@ -673,627 +697,647 @@ "port-version": 0 }, "boinc": { - "baseline": "7.24.1", + "baseline": "8.0.0", "port-version": 0 }, "bond": { "baseline": "10.0.0", - "port-version": 1 + "port-version": 3 }, "boolinq": { "baseline": "3.0.4", "port-version": 0 }, "boost": { - "baseline": "1.83.0", - "port-version": 1 + "baseline": "1.85.0", + "port-version": 0 }, "boost-accumulators": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-algorithm": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-align": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-any": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-array": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-asio": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-assert": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-assign": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-atomic": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-beast": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-bimap": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-bind": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-build": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-callable-traits": { - "baseline": "1.83.0", + "baseline": "1.85.0", + "port-version": 0 + }, + "boost-charconv": { + "baseline": "1.85.0", "port-version": 0 }, "boost-chrono": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-circular-buffer": { - "baseline": "1.83.0", + "baseline": "1.85.0", + "port-version": 0 + }, + "boost-cmake": { + "baseline": "1.85.0", + "port-version": 0 + }, + "boost-cobalt": { + "baseline": "1.85.0", "port-version": 0 }, "boost-compat": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-compatibility": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-compute": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-concept-check": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-config": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-container": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-container-hash": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-context": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-contract": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-conversion": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-convert": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-core": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-coroutine": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-coroutine2": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-crc": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-date-time": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-describe": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-detail": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-dll": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-dynamic-bitset": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-endian": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-exception": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-fiber": { - "baseline": "1.83.0", - "port-version": 1 + "baseline": "1.85.0", + "port-version": 0 }, "boost-filesystem": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-flyweight": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-foreach": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-format": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-function": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-function-types": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-functional": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-fusion": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-geometry": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-gil": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-graph": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-graph-parallel": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-hana": { - "baseline": "1.83.0", + "baseline": "1.85.0", + "port-version": 0 + }, + "boost-headers": { + "baseline": "1.85.0", "port-version": 0 }, "boost-heap": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-histogram": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-hof": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-icl": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-integer": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-interprocess": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-interval": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-intrusive": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-io": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-iostreams": { - "baseline": "1.83.0", - "port-version": 1 + "baseline": "1.85.0", + "port-version": 0 }, "boost-iterator": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-json": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-lambda": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-lambda2": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-leaf": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-lexical-cast": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-local-function": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-locale": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-lockfree": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-log": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-logic": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-math": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-metaparse": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, - "boost-modular-build-helper": { - "baseline": "1.83.0", - "port-version": 1 - }, "boost-move": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-mp11": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-mpi": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-mpl": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-msm": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-multi-array": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-multi-index": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-multiprecision": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-mysql": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-nowide": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-numeric-conversion": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-odeint": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-optional": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-outcome": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-parameter": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-parameter-python": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-pfr": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-phoenix": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-poly-collection": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-polygon": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-pool": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-predef": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-preprocessor": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-process": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-program-options": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-property-map": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-property-map-parallel": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-property-tree": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-proto": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-ptr-container": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-python": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-qvm": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-random": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-range": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-ratio": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-rational": { - "baseline": "1.83.0", + "baseline": "1.85.0", + "port-version": 0 + }, + "boost-redis": { + "baseline": "1.85.0", "port-version": 0 }, "boost-regex": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-safe-numerics": { - "baseline": "1.83.0", + "baseline": "1.85.0", + "port-version": 0 + }, + "boost-scope": { + "baseline": "1.85.0", "port-version": 0 }, "boost-scope-exit": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-serialization": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-signals2": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-smart-ptr": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-sort": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-spirit": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-stacktrace": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-statechart": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-static-assert": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-static-string": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-stl-interfaces": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-system": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-test": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-thread": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-throw-exception": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-timer": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-tokenizer": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-tti": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-tuple": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-type-erasure": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-type-index": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-type-traits": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-typeof": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-ublas": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-uninstall": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-units": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-unordered": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-url": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-utility": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-uuid": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-variant": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-variant2": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-vcpkg-helpers": { - "baseline": "1.83.0", + "baseline": "1.84.0", "port-version": 0 }, "boost-vmd": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-wave": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-winapi": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-xpressive": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boost-yap": { - "baseline": "1.83.0", + "baseline": "1.85.0", "port-version": 0 }, "boringssl": { @@ -1301,8 +1345,8 @@ "port-version": 0 }, "botan": { - "baseline": "3.1.1", - "port-version": 1 + "baseline": "3.3.0", + "port-version": 0 }, "box2d": { "baseline": "2.4.1", @@ -1310,11 +1354,11 @@ }, "braft": { "baseline": "2021-26-04", - "port-version": 1 + "port-version": 4 }, "breakpad": { - "baseline": "2022-07-12", - "port-version": 6 + "baseline": "2023-06-01", + "port-version": 0 }, "brigand": { "baseline": "1.3.0", @@ -1326,7 +1370,7 @@ }, "brpc": { "baseline": "1.6.1", - "port-version": 0 + "port-version": 3 }, "brunocodutra-metal": { "baseline": "2.1.4", @@ -1337,7 +1381,7 @@ "port-version": 0 }, "bshoshany-thread-pool": { - "baseline": "3.5.0", + "baseline": "4.1.0", "port-version": 0 }, "bsio": { @@ -1381,7 +1425,7 @@ "port-version": 5 }, "c-ares": { - "baseline": "1.19.1", + "baseline": "1.28.1", "port-version": 0 }, "c-dbg-macro": { @@ -1401,7 +1445,7 @@ "port-version": 0 }, "cachelib": { - "baseline": "2023.05.08.00", + "baseline": "2024.05.06.00", "port-version": 0 }, "caf": { @@ -1413,15 +1457,15 @@ "port-version": 8 }, "cairo": { - "baseline": "1.17.8", - "port-version": 4 + "baseline": "1.18.0", + "port-version": 1 }, "cairomm": { "baseline": "1.17.1", "port-version": 1 }, "calceph": { - "baseline": "3.5.4", + "baseline": "4.0.0", "port-version": 0 }, "camport3": { @@ -1433,15 +1477,15 @@ "port-version": 0 }, "capnproto": { - "baseline": "1.0.1", + "baseline": "1.0.2", "port-version": 0 }, "capstone": { "baseline": "5.0.1", - "port-version": 0 + "port-version": 1 }, "cargs": { - "baseline": "1.0.3", + "baseline": "1.1.0", "port-version": 0 }, "cartographer": { @@ -1461,7 +1505,11 @@ "port-version": 2 }, "catch2": { - "baseline": "3.4.0", + "baseline": "3.6.0", + "port-version": 0 + }, + "cblas": { + "baseline": "2024-03-19", "port-version": 0 }, "cccapstone": { @@ -1478,14 +1526,14 @@ }, "cctag": { "baseline": "1.0.2", - "port-version": 5 + "port-version": 6 }, "cctz": { - "baseline": "2.3", - "port-version": 6 + "baseline": "2.4", + "port-version": 0 }, "cdt": { - "baseline": "1.3.0", + "baseline": "1.4.0", "port-version": 0 }, "celero": { @@ -1502,22 +1550,22 @@ }, "ceres": { "baseline": "2.1.0", - "port-version": 4 + "port-version": 5 }, "cfitsio": { "baseline": "3.49", "port-version": 5 }, "cgal": { - "baseline": "5.6", + "baseline": "5.6.1", "port-version": 0 }, "cgicc": { - "baseline": "3.2.19", - "port-version": 7 + "baseline": "3.2.20", + "port-version": 0 }, "cglm": { - "baseline": "0.9.1", + "baseline": "0.9.4", "port-version": 0 }, "cgltf": { @@ -1534,7 +1582,7 @@ }, "chakracore": { "baseline": "2022-11-09", - "port-version": 5 + "port-version": 7 }, "charls": { "baseline": "2.4.2", @@ -1550,7 +1598,7 @@ }, "chipmunk": { "baseline": "7.0.3", - "port-version": 6 + "port-version": 7 }, "chmlib": { "baseline": "0.40", @@ -1586,23 +1634,23 @@ }, "civetweb": { "baseline": "1.16", - "port-version": 1 + "port-version": 2 }, "cjson": { - "baseline": "1.7.16", + "baseline": "1.7.17", "port-version": 0 }, "clamav": { - "baseline": "0.103.0", - "port-version": 4 + "baseline": "0.103.11", + "port-version": 0 }, "clap-cleveraudio": { - "baseline": "1.1.10", + "baseline": "1.2.0", "port-version": 0 }, "clapack": { "baseline": "3.2.1", - "port-version": 22 + "port-version": 23 }, "clara": { "baseline": "1.1.5", @@ -1616,6 +1664,10 @@ "baseline": "1.6.1", "port-version": 0 }, + "cld3": { + "baseline": "3.0.14", + "port-version": 2 + }, "clfft": { "baseline": "2.12.2", "port-version": 6 @@ -1625,11 +1677,11 @@ "port-version": 0 }, "cli11": { - "baseline": "2.3.2", + "baseline": "2.4.1", "port-version": 0 }, "clickhouse-cpp": { - "baseline": "2.4.0", + "baseline": "2.5.1", "port-version": 0 }, "clipboardxx": { @@ -1641,7 +1693,7 @@ "port-version": 2 }, "clipper2": { - "baseline": "1.2.2", + "baseline": "1.3.0", "port-version": 1 }, "clockutils": { @@ -1664,10 +1716,6 @@ "baseline": "0.30.3", "port-version": 0 }, - "cmcstl2": { - "baseline": "2019-07-20", - "port-version": 3 - }, "cminpack": { "baseline": "1.3.8", "port-version": 4 @@ -1677,8 +1725,8 @@ "port-version": 3 }, "cnats": { - "baseline": "3.7.0", - "port-version": 1 + "baseline": "3.8.0", + "port-version": 0 }, "cnl": { "baseline": "1.1.7", @@ -1693,8 +1741,8 @@ "port-version": 1 }, "coin": { - "baseline": "4.0.0", - "port-version": 7 + "baseline": "4.0.2", + "port-version": 2 }, "coin-or-buildtools": { "baseline": "2023-02-02", @@ -1726,7 +1774,7 @@ }, "collada-dom": { "baseline": "2.5.0", - "port-version": 10 + "port-version": 11 }, "colmap": { "baseline": "2023-10-01", @@ -1761,7 +1809,7 @@ "port-version": 0 }, "configcat": { - "baseline": "3.1.1", + "baseline": "4.0.1", "port-version": 0 }, "console-bridge": { @@ -1789,7 +1837,7 @@ "port-version": 3 }, "copypp": { - "baseline": "0.2.0", + "baseline": "0.3.0", "port-version": 0 }, "coroutine": { @@ -1800,6 +1848,10 @@ "baseline": "2020.06", "port-version": 8 }, + "correlation-vector-cpp": { + "baseline": "1.0", + "port-version": 0 + }, "cpp-async": { "baseline": "1.1.0", "port-version": 0 @@ -1809,11 +1861,11 @@ "port-version": 0 }, "cpp-httplib": { - "baseline": "0.14.1", + "baseline": "0.15.3", "port-version": 0 }, "cpp-ipc": { - "baseline": "1.2.0", + "baseline": "1.3.0", "port-version": 0 }, "cpp-jwt": { @@ -1825,7 +1877,7 @@ "port-version": 9 }, "cpp-peglib": { - "baseline": "1.8.5", + "baseline": "1.8.6", "port-version": 0 }, "cpp-redis": { @@ -1845,12 +1897,12 @@ "port-version": 0 }, "cppad": { - "baseline": "20230000.0", + "baseline": "20240000.2", "port-version": 0 }, "cppcms": { "baseline": "1.2.1", - "port-version": 6 + "port-version": 7 }, "cppcodec": { "baseline": "0.2", @@ -1893,7 +1945,7 @@ "port-version": 0 }, "cppslippi": { - "baseline": "1.3.3.14", + "baseline": "1.4.3.16", "port-version": 0 }, "cpptoml": { @@ -1901,7 +1953,7 @@ "port-version": 4 }, "cpptrace": { - "baseline": "0.3.1", + "baseline": "0.5.4", "port-version": 0 }, "cppunit": { @@ -1913,7 +1965,7 @@ "port-version": 3 }, "cppwinrt": { - "baseline": "2.0.230207.1", + "baseline": "2.0.240111.5", "port-version": 0 }, "cppxaml": { @@ -1926,14 +1978,14 @@ }, "cpr": { "baseline": "1.10.5", - "port-version": 1 + "port-version": 2 }, "cpu-features": { "baseline": "0.9.0", "port-version": 0 }, "cpuid": { - "baseline": "0.6.2", + "baseline": "0.6.4", "port-version": 0 }, "cpuinfo": { @@ -1945,8 +1997,8 @@ "port-version": 2 }, "crashpad": { - "baseline": "2022-09-05", - "port-version": 4 + "baseline": "2024-04-11", + "port-version": 0 }, "crashrpt": { "baseline": "1.4.3", @@ -1969,7 +2021,7 @@ "port-version": 3 }, "crow": { - "baseline": "1.0-5", + "baseline": "1.1.0", "port-version": 0 }, "cryptopp": { @@ -1990,7 +2042,7 @@ }, "ctbignum": { "baseline": "2019-08-02", - "port-version": 3 + "port-version": 4 }, "ctemplate": { "baseline": "2020-09-14", @@ -2005,7 +2057,7 @@ "port-version": 2 }, "ctre": { - "baseline": "3.8", + "baseline": "3.8.1", "port-version": 0 }, "ctstraffic": { @@ -2025,20 +2077,20 @@ "port-version": 13 }, "cuda-api-wrappers": { - "baseline": "0.6.6", + "baseline": "0.6.9", "port-version": 0 }, "cudnn": { "baseline": "7.6.5", - "port-version": 10 + "port-version": 11 }, "cunit": { "baseline": "2.1.3", "port-version": 8 }, "curl": { - "baseline": "8.4.0", - "port-version": 0 + "baseline": "8.7.1", + "port-version": 3 }, "curlpp": { "baseline": "2018-06-15", @@ -2053,7 +2105,11 @@ "port-version": 2 }, "cwalk": { - "baseline": "1.2.7", + "baseline": "1.2.9", + "port-version": 0 + }, + "cwapi3d": { + "baseline": "30.475.1", "port-version": 0 }, "cxxgraph": { @@ -2061,24 +2117,24 @@ "port-version": 0 }, "cxxopts": { - "baseline": "3.1.1", + "baseline": "3.2.1", "port-version": 0 }, "cyclonedds": { - "baseline": "0.10.3", + "baseline": "0.10.4", "port-version": 0 }, "cyclonedds-cxx": { - "baseline": "0.10.2", - "port-version": 1 + "baseline": "0.10.4", + "port-version": 0 }, "czmq": { "baseline": "4.2.1", "port-version": 4 }, "d3d12-memory-allocator": { - "baseline": "2021-05-05", - "port-version": 1 + "baseline": "2.0.1", + "port-version": 0 }, "d3dx12": { "baseline": "may2021", @@ -2086,7 +2142,7 @@ }, "darknet": { "baseline": "2022-03-06", - "port-version": 3 + "port-version": 4 }, "darts-clone": { "baseline": "1767ab87cffe", @@ -2097,27 +2153,31 @@ "port-version": 3 }, "dataframe": { - "baseline": "2.1.0", + "baseline": "3.1.0", "port-version": 0 }, "date": { "baseline": "3.0.1", "port-version": 5 }, + "datraw": { + "baseline": "1.0.9", + "port-version": 0 + }, "dav1d": { - "baseline": "1.3.0", - "port-version": 1 + "baseline": "1.4.0", + "port-version": 0 }, "daw-header-libraries": { - "baseline": "2.96.1", + "baseline": "2.106.0", "port-version": 0 }, "daw-json-link": { - "baseline": "3.20.1", + "baseline": "3.24.0", "port-version": 0 }, "daw-utf-range": { - "baseline": "2.2.3", + "baseline": "2.2.4", "port-version": 0 }, "daxa": { @@ -2142,11 +2202,11 @@ }, "dbus": { "baseline": "1.15.8", - "port-version": 2 + "port-version": 4 }, "dcmtk": { - "baseline": "3.6.7", - "port-version": 6 + "baseline": "3.6.8", + "port-version": 5 }, "debug-assert": { "baseline": "1.3.3", @@ -2166,42 +2226,46 @@ }, "devil": { "baseline": "1.8.0", - "port-version": 11 + "port-version": 13 }, "dimcli": { - "baseline": "7.1.0", + "baseline": "7.2.0", "port-version": 0 }, "directx-dxc": { - "baseline": "2023-08-14", + "baseline": "2024-03-29", "port-version": 0 }, "directx-headers": { - "baseline": "1.610.2", + "baseline": "1.613.0", "port-version": 0 }, - "directxmath": { - "baseline": "2022-12-12", + "directx12-agility": { + "baseline": "1.613.0", "port-version": 0 }, + "directxmath": { + "baseline": "2024-02-14", + "port-version": 1 + }, "directxmesh": { - "baseline": "2023-10-28", + "baseline": "2024-02-21", "port-version": 0 }, "directxsdk": { "baseline": "jun10", - "port-version": 7 + "port-version": 8 }, "directxtex": { - "baseline": "2023-10-28", + "baseline": "2024-03-06", "port-version": 0 }, "directxtk": { - "baseline": "2023-10-28", + "baseline": "2024-02-21", "port-version": 0 }, "directxtk12": { - "baseline": "2023-10-28", + "baseline": "2024-02-21", "port-version": 0 }, "dirent": { @@ -2214,10 +2278,10 @@ }, "discord-rpc": { "baseline": "3.4.0", - "port-version": 3 + "port-version": 4 }, "discordcoreapi": { - "baseline": "2.0.3", + "baseline": "2.0.6", "port-version": 0 }, "discount": { @@ -2238,15 +2302,19 @@ }, "dlib": { "baseline": "19.24", - "port-version": 3 + "port-version": 4 + }, + "dlpack": { + "baseline": "0.8", + "port-version": 0 }, "dmlc": { "baseline": "2022-06-22", "port-version": 0 }, "docopt": { - "baseline": "2018-11-01", - "port-version": 3 + "baseline": "2022-03-15", + "port-version": 1 }, "doctest": { "baseline": "2.4.11", @@ -2265,11 +2333,15 @@ "port-version": 1 }, "dpp": { - "baseline": "10.0.29", + "baseline": "10.0.30", "port-version": 0 }, "draco": { - "baseline": "1.5.6", + "baseline": "1.5.7", + "port-version": 0 + }, + "drekar-launch-process-cpp": { + "baseline": "0.1.0", "port-version": 0 }, "drlibs": { @@ -2277,7 +2349,7 @@ "port-version": 0 }, "drogon": { - "baseline": "1.9.1", + "baseline": "1.9.4", "port-version": 0 }, "dstorage": { @@ -2302,7 +2374,7 @@ }, "duktape": { "baseline": "2.7.0", - "port-version": 0 + "port-version": 1 }, "dumb": { "baseline": "2.0.3", @@ -2310,7 +2382,7 @@ }, "dv-processing": { "baseline": "1.7.9", - "port-version": 0 + "port-version": 1 }, "dx": { "baseline": "1.0.1", @@ -2318,7 +2390,7 @@ }, "dxsdk-d3dx": { "baseline": "9.29.952.8", - "port-version": 6 + "port-version": 7 }, "dxut": { "baseline": "11.31", @@ -2358,15 +2430,15 @@ }, "easyloggingpp": { "baseline": "9.97.1", - "port-version": 0 + "port-version": 1 }, "eathread": { "baseline": "1.32.09", "port-version": 5 }, "ebml": { - "baseline": "1.4.4", - "port-version": 1 + "baseline": "1.4.5", + "port-version": 0 }, "ecal": { "baseline": "5.12.0", @@ -2389,7 +2461,7 @@ "port-version": 0 }, "edflib": { - "baseline": "1.24", + "baseline": "1.25", "port-version": 0 }, "edlib": { @@ -2413,12 +2485,12 @@ "port-version": 0 }, "egl-registry": { - "baseline": "2022-09-20", + "baseline": "2024-01-25", "port-version": 0 }, "eigen3": { "baseline": "3.4.0", - "port-version": 3 + "port-version": 4 }, "elements": { "baseline": "2022-12-07", @@ -2434,7 +2506,7 @@ }, "embree3": { "baseline": "3.13.5", - "port-version": 2 + "port-version": 3 }, "enet": { "baseline": "1.3.17", @@ -2442,7 +2514,7 @@ }, "enkits": { "baseline": "1.11", - "port-version": 1 + "port-version": 2 }, "ensmallen": { "baseline": "2.19.1", @@ -2453,7 +2525,7 @@ "port-version": 5 }, "entt": { - "baseline": "3.12.2", + "baseline": "3.13.2", "port-version": 0 }, "epsilon": { @@ -2469,12 +2541,12 @@ "port-version": 1 }, "etcd-cpp-apiv3": { - "baseline": "0.15.3", + "baseline": "0.15.4", "port-version": 0 }, "etl": { - "baseline": "20.38.0", - "port-version": 0 + "baseline": "20.38.10", + "port-version": 1 }, "eve": { "baseline": "2023.2.15", @@ -2482,19 +2554,19 @@ }, "eventpp": { "baseline": "0.1.3", - "port-version": 0 + "port-version": 1 }, "evpp": { "baseline": "0.7.0", - "port-version": 7 + "port-version": 8 }, "exiv2": { "baseline": "0.28.1", - "port-version": 0 + "port-version": 1 }, "expat": { - "baseline": "2.5.0", - "port-version": 3 + "baseline": "2.6.2", + "port-version": 0 }, "expected-lite": { "baseline": "0.6.3", @@ -2505,7 +2577,7 @@ "port-version": 2 }, "ezc3d": { - "baseline": "1.5.0", + "baseline": "1.5.7", "port-version": 0 }, "ezfoundation": { @@ -2513,7 +2585,7 @@ "port-version": 0 }, "faad2": { - "baseline": "2.10.1", + "baseline": "2.11.1", "port-version": 0 }, "fadbad": { @@ -2526,7 +2598,7 @@ }, "fakeit": { "baseline": "2.4.0", - "port-version": 1 + "port-version": 2 }, "fameta-counter": { "baseline": "2021-02-13", @@ -2545,7 +2617,7 @@ "port-version": 2 }, "fast-float": { - "baseline": "5.2.0", + "baseline": "6.1.1", "port-version": 0 }, "fastcdr": { @@ -2561,11 +2633,11 @@ "port-version": 4 }, "fastgltf": { - "baseline": "0.6.1", - "port-version": 1 + "baseline": "0.7.1", + "port-version": 0 }, "fastio": { - "baseline": "2023-07-06", + "baseline": "2023-11-06", "port-version": 0 }, "fastlz": { @@ -2580,6 +2652,10 @@ "baseline": "2.7.0", "port-version": 5 }, + "faudio": { + "baseline": "24.03", + "port-version": 0 + }, "fawdlstty-libfv": { "baseline": "0.0.8", "port-version": 0 @@ -2589,7 +2665,7 @@ "port-version": 0 }, "fbthrift": { - "baseline": "2023.10.02.00", + "baseline": "2024.05.06.00", "port-version": 0 }, "fcl": { @@ -2598,18 +2674,18 @@ }, "fdk-aac": { "baseline": "2.0.2", - "port-version": 2 + "port-version": 3 }, "fdlibm": { "baseline": "5.3", "port-version": 7 }, "ffmpeg": { - "baseline": "6.1", - "port-version": 1 + "baseline": "6.1.1", + "port-version": 3 }, "ffnvcodec": { - "baseline": "11.1.5.3", + "baseline": "12.1.14.0", "port-version": 0 }, "fftw3": { @@ -2633,7 +2709,7 @@ "port-version": 0 }, "fizz": { - "baseline": "2023.10.02.00", + "baseline": "2024.05.06.00", "port-version": 0 }, "flagpp": { @@ -2669,15 +2745,15 @@ "port-version": 0 }, "flatbuffers": { - "baseline": "23.5.26", - "port-version": 1 + "baseline": "24.3.25", + "port-version": 0 }, "flatbush": { "baseline": "1.2.0", "port-version": 0 }, "flecs": { - "baseline": "3.2.9", + "baseline": "3.2.11", "port-version": 0 }, "flint": { @@ -2685,15 +2761,15 @@ "port-version": 0 }, "fltk": { - "baseline": "1.3.8", - "port-version": 5 + "baseline": "1.3.9", + "port-version": 0 }, "fluidlite": { "baseline": "2023-04-18", "port-version": 0 }, "fluidsynth": { - "baseline": "2.3.4", + "baseline": "2.3.5", "port-version": 0 }, "flux": { @@ -2713,11 +2789,11 @@ "port-version": 2 }, "fmt": { - "baseline": "10.1.1", - "port-version": 0 + "baseline": "10.2.1", + "port-version": 2 }, "folly": { - "baseline": "2023.10.02.00", + "baseline": "2024.05.06.00", "port-version": 0 }, "font-chef": { @@ -2752,10 +2828,6 @@ "baseline": "2021-02-21", "port-version": 2 }, - "fplus": { - "baseline": "0.2.20-p0", - "port-version": 0 - }, "freealut": { "baseline": "1.1.0", "port-version": 4 @@ -2766,14 +2838,14 @@ }, "freeimage": { "baseline": "3.18.0", - "port-version": 25 + "port-version": 26 }, "freeopcua": { "baseline": "20190125", "port-version": 7 }, "freerdp": { - "baseline": "2.11.2", + "baseline": "3.4.0", "port-version": 1 }, "freetds": { @@ -2781,12 +2853,12 @@ "port-version": 2 }, "freetype": { - "baseline": "2.12.1", - "port-version": 4 + "baseline": "2.13.2", + "port-version": 1 }, "freetype-gl": { "baseline": "2022-01-17", - "port-version": 2 + "port-version": 3 }, "freexl": { "baseline": "2.0.0", @@ -2801,8 +2873,8 @@ "port-version": 0 }, "frugally-deep": { - "baseline": "0.15.24", - "port-version": 0 + "baseline": "0.15.31", + "port-version": 1 }, "fruit": { "baseline": "3.7.1", @@ -2817,7 +2889,11 @@ "port-version": 0 }, "function2": { - "baseline": "4.2.3", + "baseline": "4.2.4", + "port-version": 0 + }, + "functionalplus": { + "baseline": "0.2.24", "port-version": 0 }, "functions-framework-cpp": { @@ -2834,11 +2910,11 @@ }, "g2o": { "baseline": "2020-02-07", - "port-version": 4 + "port-version": 6 }, "g3log": { - "baseline": "2.3", - "port-version": 1 + "baseline": "2.4", + "port-version": 0 }, "gainput": { "baseline": "1.0.0", @@ -2881,11 +2957,11 @@ "port-version": 0 }, "gdal": { - "baseline": "3.8.1", + "baseline": "3.8.5", "port-version": 0 }, "gdcm": { - "baseline": "3.0.22", + "baseline": "3.0.23", "port-version": 0 }, "gdcm2": { @@ -2894,7 +2970,7 @@ }, "gdk-pixbuf": { "baseline": "2.42.10", - "port-version": 2 + "port-version": 6 }, "gemmlowp": { "baseline": "2021-09-28", @@ -2914,15 +2990,15 @@ }, "geos": { "baseline": "3.11.3", - "port-version": 0 + "port-version": 1 }, "geotrans": { "baseline": "3.9", "port-version": 1 }, "getdns": { - "baseline": "1.7.0", - "port-version": 3 + "baseline": "1.7.3", + "port-version": 0 }, "getopt": { "baseline": "0", @@ -2933,12 +3009,12 @@ "port-version": 0 }, "gettext": { - "baseline": "0.21.1", - "port-version": 3 + "baseline": "0.22.5", + "port-version": 0 }, "gettext-libintl": { - "baseline": "0.21.1", - "port-version": 1 + "baseline": "0.22.5", + "port-version": 0 }, "gettimeofday": { "baseline": "2017-10-14", @@ -2957,16 +3033,16 @@ "port-version": 3 }, "giflib": { - "baseline": "5.2.1", - "port-version": 3 + "baseline": "5.2.2", + "port-version": 0 }, "ginkgo": { "baseline": "1.7.0", "port-version": 0 }, "gklib": { - "baseline": "2022-07-27", - "port-version": 2 + "baseline": "2023-03-27", + "port-version": 0 }, "gl2ps": { "baseline": "1.4.2", @@ -2974,14 +3050,14 @@ }, "gl3w": { "baseline": "2018-05-31", - "port-version": 4 + "port-version": 5 }, "glad": { "baseline": "0.1.36", "port-version": 0 }, "glaze": { - "baseline": "1.9.2", + "baseline": "2.6.1", "port-version": 0 }, "glbinding": { @@ -2993,23 +3069,27 @@ "port-version": 3 }, "glfw3": { - "baseline": "3.3.8", - "port-version": 3 + "baseline": "3.4", + "port-version": 0 }, "gli": { "baseline": "2021-07-06", "port-version": 2 }, "glib": { - "baseline": "2.78.1", + "baseline": "2.78.4", + "port-version": 1 + }, + "glib-networking": { + "baseline": "2.78.0", "port-version": 0 }, "glibmm": { - "baseline": "2.76.0", - "port-version": 1 + "baseline": "2.78.1", + "port-version": 0 }, "glm": { - "baseline": "0.9.9.8", + "baseline": "1.0.1", "port-version": 2 }, "globjects": { @@ -3017,19 +3097,19 @@ "port-version": 6 }, "glog": { - "baseline": "0.6.0", - "port-version": 3 + "baseline": "0.7.0", + "port-version": 1 }, "gloo": { "baseline": "20201203", - "port-version": 2 + "port-version": 3 }, "glpk": { "baseline": "5.0", - "port-version": 2 + "port-version": 3 }, "glslang": { - "baseline": "13.1.1", + "baseline": "14.2.0", "port-version": 0 }, "glui": { @@ -3041,23 +3121,23 @@ "port-version": 6 }, "gmmlib": { - "baseline": "22.3.12", + "baseline": "22.3.17", "port-version": 0 }, "gmp": { - "baseline": "6.2.1", - "port-version": 21 + "baseline": "6.3.0", + "port-version": 0 }, "gmsh": { - "baseline": "4.11.1", + "baseline": "4.12.2", "port-version": 0 }, "gobject-introspection": { "baseline": "1.72.0", - "port-version": 6 + "port-version": 8 }, "google-cloud-cpp": { - "baseline": "2.19.0", + "baseline": "2.24.0", "port-version": 0 }, "google-cloud-cpp-common": { @@ -3081,7 +3161,7 @@ "port-version": 1 }, "gpgme": { - "baseline": "1.22.0", + "baseline": "1.23.2", "port-version": 0 }, "gpgmm": { @@ -3102,7 +3182,7 @@ }, "graphicsmagick": { "baseline": "1.3.41", - "port-version": 0 + "port-version": 1 }, "graphite2": { "baseline": "1.3.14", @@ -3113,8 +3193,8 @@ "port-version": 4 }, "graphviz": { - "baseline": "9.0.0", - "port-version": 2 + "baseline": "10.0.1", + "port-version": 1 }, "greatest": { "baseline": "1.5.0", @@ -3122,7 +3202,7 @@ }, "grpc": { "baseline": "1.51.1", - "port-version": 1 + "port-version": 3 }, "grppi": { "baseline": "0.4.0", @@ -3146,15 +3226,15 @@ }, "gstreamer": { "baseline": "1.22.5", - "port-version": 5 + "port-version": 8 }, "gtest": { "baseline": "1.14.0", - "port-version": 0 + "port-version": 1 }, "gtk": { "baseline": "4.10.5", - "port-version": 1 + "port-version": 2 }, "gtk3": { "baseline": "3.24.38", @@ -3170,26 +3250,26 @@ }, "gts": { "baseline": "0.7.6", - "port-version": 8 + "port-version": 9 }, "gtsam": { "baseline": "4.2a9", - "port-version": 0 + "port-version": 1 }, "guetzli": { "baseline": "2020-09-14", "port-version": 2 }, "guile": { - "baseline": "3.0.8", - "port-version": 1 + "baseline": "3.0.9", + "port-version": 0 }, "guilite": { "baseline": "2022-05-05", "port-version": 0 }, "gul14": { - "baseline": "2.9.2", + "baseline": "2.11.2", "port-version": 0 }, "gumbo": { @@ -3257,24 +3337,24 @@ "port-version": 0 }, "h5py-lzf": { - "baseline": "2019-12-04", - "port-version": 3 + "baseline": "2022-05-24", + "port-version": 0 }, "halide": { - "baseline": "16.0.0", - "port-version": 1 + "baseline": "17.0.1", + "port-version": 0 }, "happly": { "baseline": "2021-03-19", "port-version": 0 }, "hareflow": { - "baseline": "0.1.0", - "port-version": 1 + "baseline": "0.1.1", + "port-version": 0 }, "harfbuzz": { - "baseline": "8.2.1", - "port-version": 3 + "baseline": "8.4.0", + "port-version": 1 }, "hash-library": { "baseline": "8", @@ -3304,8 +3384,12 @@ "baseline": "15", "port-version": 0 }, + "hello-imgui": { + "baseline": "1.4.2", + "port-version": 1 + }, "hexl": { - "baseline": "1.2.4", + "baseline": "1.2.5", "port-version": 0 }, "hffix": { @@ -3321,25 +3405,29 @@ "port-version": 0 }, "highfive": { - "baseline": "2.7.1", - "port-version": 1 + "baseline": "2.9.0", + "port-version": 0 }, "highs": { "baseline": "1.6.0", "port-version": 1 }, "highway": { - "baseline": "1.0.7", + "baseline": "1.1.0", "port-version": 0 }, "hikogui": { "baseline": "0.8.1", - "port-version": 0 + "port-version": 2 }, "hiredis": { "baseline": "1.2.0", "port-version": 0 }, + "hjson-cpp": { + "baseline": "2.4.1", + "port-version": 0 + }, "hnswlib": { "baseline": "0.8.0", "port-version": 0 @@ -3350,7 +3438,7 @@ }, "hpx": { "baseline": "1.9.1", - "port-version": 0 + "port-version": 1 }, "http-parser": { "baseline": "2.9.4", @@ -3362,10 +3450,10 @@ }, "hunspell": { "baseline": "1.7.2", - "port-version": 0 + "port-version": 1 }, "hwloc": { - "baseline": "2.9.3", + "baseline": "2.10.0", "port-version": 0 }, "hyperscan": { @@ -3381,12 +3469,12 @@ "port-version": 1 }, "iceoryx": { - "baseline": "2.0.3", + "baseline": "2.0.5", "port-version": 0 }, "icu": { - "baseline": "73.1", - "port-version": 2 + "baseline": "74.2", + "port-version": 1 }, "ideviceinstaller": { "baseline": "2023-07-21", @@ -3397,7 +3485,7 @@ "port-version": 0 }, "idyntree": { - "baseline": "10.0.0", + "baseline": "12.1.0", "port-version": 0 }, "if97": { @@ -3413,8 +3501,8 @@ "port-version": 4 }, "ignition-cmake2": { - "baseline": "2.16.0", - "port-version": 2 + "baseline": "2.17.1", + "port-version": 0 }, "ignition-common1": { "baseline": "1.1.1", @@ -3481,7 +3569,7 @@ "port-version": 0 }, "igraph": { - "baseline": "0.10.8", + "baseline": "0.10.12", "port-version": 0 }, "iir1": { @@ -3501,20 +3589,20 @@ "port-version": 0 }, "imageinfo": { - "baseline": "2023-01-31", + "baseline": "2024-02-21", "port-version": 0 }, "imath": { - "baseline": "3.1.9", - "port-version": 1 + "baseline": "3.1.11", + "port-version": 0 }, "imgui": { - "baseline": "1.90", + "baseline": "1.90.2", "port-version": 0 }, "imgui-node-editor": { "baseline": "0.9.3", - "port-version": 0 + "port-version": 1 }, "imgui-sfml": { "baseline": "2.6", @@ -3541,15 +3629,15 @@ "port-version": 0 }, "influxdb-cxx": { - "baseline": "0.7.1", - "port-version": 1 + "baseline": "0.7.2", + "port-version": 0 }, "infoware": { "baseline": "2023-04-12", "port-version": 0 }, "inih": { - "baseline": "57", + "baseline": "58", "port-version": 0 }, "iniparser": { @@ -3580,6 +3668,10 @@ "baseline": "2020-09-14", "port-version": 5 }, + "iowa-hills-dsp": { + "baseline": "0.1.0", + "port-version": 0 + }, "irrlicht": { "baseline": "1.8.5", "port-version": 0 @@ -3602,7 +3694,7 @@ }, "itk": { "baseline": "5.3rc02", - "port-version": 0 + "port-version": 1 }, "itpp": { "baseline": "4.3.1", @@ -3613,8 +3705,8 @@ "port-version": 0 }, "ixwebsocket": { - "baseline": "11.4.4", - "port-version": 2 + "baseline": "11.4.5", + "port-version": 0 }, "jack2": { "baseline": "1.9.22", @@ -3629,7 +3721,7 @@ "port-version": 1 }, "jasper": { - "baseline": "4.1.0", + "baseline": "4.2.1", "port-version": 0 }, "jbig2dec": { @@ -3644,6 +3736,10 @@ "baseline": "5.3.0", "port-version": 1 }, + "jhasse-poly2tri": { + "baseline": "2023-12-27", + "port-version": 0 + }, "jinja2cpplight": { "baseline": "2018-05-08", "port-version": 3 @@ -3653,8 +3749,8 @@ "port-version": 1 }, "joltphysics": { - "baseline": "4.0.0", - "port-version": 0 + "baseline": "5.0.0", + "port-version": 1 }, "josuttis-jthread": { "baseline": "2020-07-21", @@ -3665,11 +3761,11 @@ "port-version": 2 }, "json-c": { - "baseline": "2022-06-26", - "port-version": 3 + "baseline": "2023-08-12", + "port-version": 0 }, "json-dto": { - "baseline": "0.3.1", + "baseline": "0.3.3", "port-version": 0 }, "json-rpc-cxx": { @@ -3677,12 +3773,12 @@ "port-version": 0 }, "json-schema-validator": { - "baseline": "2.2.0", - "port-version": 0 + "baseline": "2.3.0", + "port-version": 2 }, "json-spirit": { "baseline": "4.1.0", - "port-version": 4 + "port-version": 5 }, "json11": { "baseline": "2017-06-20", @@ -3690,26 +3786,30 @@ }, "json5-parser": { "baseline": "1.0.0", - "port-version": 5 + "port-version": 6 }, "jsoncons": { - "baseline": "0.171.0", + "baseline": "0.175.0", "port-version": 0 }, "jsoncpp": { "baseline": "1.9.5", - "port-version": 2 + "port-version": 4 }, "jsonifier": { - "baseline": "0.9.92", + "baseline": "0.9.95", "port-version": 0 }, "jsonnet": { "baseline": "0.20.0", "port-version": 0 }, + "juce": { + "baseline": "7.0.12", + "port-version": 0 + }, "jwt-cpp": { - "baseline": "0.6.0", + "baseline": "0.7.0", "port-version": 0 }, "jxrlib": { @@ -3721,19 +3821,15 @@ "port-version": 1 }, "kangaru": { - "baseline": "4.3.1", + "baseline": "4.3.2", "port-version": 0 }, "kcp": { "baseline": "1.7", "port-version": 0 }, - "kd-soap": { - "baseline": "2.1.1", - "port-version": 1 - }, "kdalgorithms": { - "baseline": "1.2", + "baseline": "1.3", "port-version": 0 }, "kdbindings": { @@ -3741,12 +3837,16 @@ "port-version": 0 }, "kddockwidgets": { - "baseline": "1.5.0", + "baseline": "2.0.0", + "port-version": 0 + }, + "kdsoap": { + "baseline": "2.2.0", "port-version": 0 }, "kealib": { - "baseline": "1.5.2", - "port-version": 1 + "baseline": "1.5.3", + "port-version": 0 }, "keccak-tiny": { "baseline": "2014-09-08", @@ -3754,6 +3854,10 @@ }, "kenlm": { "baseline": "20230531", + "port-version": 1 + }, + "kerbal": { + "baseline": "2024.4.1", "port-version": 0 }, "keystone": { @@ -3913,8 +4017,8 @@ "port-version": 0 }, "kfr": { - "baseline": "5.0.1", - "port-version": 1 + "baseline": "6.0.2", + "port-version": 0 }, "kinectsdk1": { "baseline": "1.8", @@ -3929,7 +4033,7 @@ "port-version": 0 }, "kissnet": { - "baseline": "2023-02-04", + "baseline": "2024-01-20", "port-version": 0 }, "klein": { @@ -3941,13 +4045,17 @@ "port-version": 1 }, "krabsetw": { - "baseline": "4.3.1", + "baseline": "4.3.2", "port-version": 0 }, - "ktx": { - "baseline": "4.3.0-alpha3", + "krb5": { + "baseline": "1.21.2", "port-version": 0 }, + "ktx": { + "baseline": "4.3.1", + "port-version": 1 + }, "kubazip": { "baseline": "0.2.6", "port-version": 0 @@ -3973,24 +4081,24 @@ "port-version": 0 }, "lapack": { - "baseline": "2022-02-22", - "port-version": 2 + "baseline": "2023-06-10", + "port-version": 0 }, "lapack-reference": { "baseline": "3.11.0", - "port-version": 1 + "port-version": 6 }, "lastools": { "baseline": "2.0.2+20230206", "port-version": 1 }, "laszip": { - "baseline": "3.4.3", - "port-version": 1 + "baseline": "3.4.4", + "port-version": 0 }, "launch-darkly-server": { "baseline": "2.8.6", - "port-version": 1 + "port-version": 2 }, "lazy-importer": { "baseline": "2023-08-03", @@ -4018,15 +4126,15 @@ }, "lensfun": { "baseline": "0.3.4", - "port-version": 1 + "port-version": 2 }, "leptonica": { - "baseline": "1.83.1", + "baseline": "1.84.1", "port-version": 0 }, "lerc": { - "baseline": "4.0", - "port-version": 1 + "baseline": "4.0.4", + "port-version": 0 }, "lest": { "baseline": "1.35.1", @@ -4054,7 +4162,7 @@ }, "libadwaita": { "baseline": "1.3.2", - "port-version": 1 + "port-version": 2 }, "libaes-siv": { "baseline": "2020-10-15", @@ -4065,15 +4173,15 @@ "port-version": 9 }, "libalkimia": { - "baseline": "8.1.70", - "port-version": 2 + "baseline": "8.1.72", + "port-version": 0 }, "libao": { "baseline": "1.2.2", "port-version": 5 }, "libarchive": { - "baseline": "3.6.2", + "baseline": "3.7.2", "port-version": 0 }, "libass": { @@ -4081,19 +4189,19 @@ "port-version": 0 }, "libassert": { - "baseline": "1.2.2", + "baseline": "2.0.2", "port-version": 0 }, "libassuan": { - "baseline": "2.5.6", + "baseline": "2.5.7", "port-version": 0 }, "libatomic-ops": { - "baseline": "7.8.0", + "baseline": "7.8.2", "port-version": 0 }, "libavif": { - "baseline": "1.0.1", + "baseline": "1.0.4", "port-version": 0 }, "libb2": { @@ -4101,20 +4209,20 @@ "port-version": 6 }, "libbacktrace": { - "baseline": "2021-03-14", - "port-version": 1 + "baseline": "2023-11-30", + "port-version": 0 }, "libbf": { "baseline": "1.0.0", "port-version": 4 }, "libbson": { - "baseline": "1.25.1", - "port-version": 1 + "baseline": "1.27.1", + "port-version": 0 }, "libcaer": { "baseline": "3.3.15", - "port-version": 0 + "port-version": 1 }, "libcanberra": { "baseline": "0.30", @@ -4122,10 +4230,10 @@ }, "libcap": { "baseline": "2.69", - "port-version": 2 + "port-version": 5 }, "libcbor": { - "baseline": "0.10.2", + "baseline": "0.11.0", "port-version": 0 }, "libcds": { @@ -4149,7 +4257,7 @@ "port-version": 0 }, "libcoro": { - "baseline": "0.9", + "baseline": "0.11.1", "port-version": 0 }, "libcorrect": { @@ -4181,7 +4289,7 @@ "port-version": 0 }, "libdatachannel": { - "baseline": "0.19.4", + "baseline": "0.20.3", "port-version": 0 }, "libdatrie": { @@ -4189,31 +4297,31 @@ "port-version": 1 }, "libdc1394": { - "baseline": "2.2.6", - "port-version": 1 + "baseline": "2.2.7", + "port-version": 0 }, "libde265": { - "baseline": "1.0.14", + "baseline": "1.0.15", "port-version": 0 }, "libdeflate": { - "baseline": "1.19", - "port-version": 1 + "baseline": "1.20", + "port-version": 0 }, "libdisasm": { "baseline": "0.23", - "port-version": 10 + "port-version": 11 }, "libdivide": { "baseline": "5.0", "port-version": 1 }, "libdjinterop": { - "baseline": "0.20.1", + "baseline": "0.20.3", "port-version": 0 }, "libdmx": { - "baseline": "1.1.4", + "baseline": "1.1.5", "port-version": 0 }, "libdshowcapture": { @@ -4221,15 +4329,15 @@ "port-version": 3 }, "libdwarf": { - "baseline": "0.8.0", - "port-version": 0 + "baseline": "0.9.1", + "port-version": 1 }, "libe57": { "baseline": "1.1.332", "port-version": 4 }, "libe57format": { - "baseline": "3.0.0", + "baseline": "3.1.1", "port-version": 0 }, "libebur128": { @@ -4237,13 +4345,17 @@ "port-version": 2 }, "libenvpp": { - "baseline": "1.3.0", + "baseline": "1.4.0", "port-version": 0 }, "libepoxy": { "baseline": "1.5.10", "port-version": 2 }, + "liberasurecode": { + "baseline": "1.6.3", + "port-version": 0 + }, "libev": { "baseline": "4.33", "port-version": 2 @@ -4253,11 +4365,11 @@ "port-version": 0 }, "libeventheader-decode": { - "baseline": "1.2.1", + "baseline": "1.3.3", "port-version": 0 }, "libeventheader-tracepoint": { - "baseline": "1.2.1", + "baseline": "1.3.3", "port-version": 0 }, "libevhtp": { @@ -4266,38 +4378,42 @@ }, "libexif": { "baseline": "0.6.24", - "port-version": 1 + "port-version": 3 }, "libfabric": { "baseline": "1.13.2", "port-version": 2 }, "libffi": { - "baseline": "3.4.4", - "port-version": 6 + "baseline": "3.4.6", + "port-version": 0 }, "libfido2": { - "baseline": "1.13.0", + "baseline": "1.14.0", "port-version": 0 }, "libflac": { "baseline": "1.4.3", - "port-version": 0 + "port-version": 2 }, "libfontenc": { "baseline": "1.1.4", "port-version": 0 }, + "libfork": { + "baseline": "3.7.1", + "port-version": 0 + }, "libfort": { "baseline": "0.4.2", "port-version": 1 }, "libfreenect2": { "baseline": "0.2.1", - "port-version": 0 + "port-version": 1 }, "libfs": { - "baseline": "1.0.8", + "baseline": "1.0.9", "port-version": 0 }, "libftdi": { @@ -4308,33 +4424,37 @@ "baseline": "1.5", "port-version": 4 }, + "libfuse": { + "baseline": "3.16.2", + "port-version": 0 + }, "libgcrypt": { "baseline": "1.10.2", "port-version": 0 }, "libgd": { "baseline": "2.3.3", - "port-version": 2 + "port-version": 3 }, "libgeotiff": { "baseline": "1.7.1", "port-version": 3 }, "libgig": { - "baseline": "4.3.0", + "baseline": "4.4.1", "port-version": 0 }, "libgit2": { - "baseline": "1.6.4", - "port-version": 1 + "baseline": "1.8.0", + "port-version": 0 }, "libgme": { "baseline": "0.6.3", "port-version": 0 }, "libgnutls": { - "baseline": "3.8.1", - "port-version": 1 + "baseline": "3.8.5", + "port-version": 0 }, "libgo": { "baseline": "3.1", @@ -4345,8 +4465,8 @@ "port-version": 0 }, "libgpiod": { - "baseline": "2.0.2", - "port-version": 1 + "baseline": "2.1", + "port-version": 0 }, "libgpod": { "baseline": "2019-08-29", @@ -4362,26 +4482,26 @@ }, "libgwenhywfar": { "baseline": "5.6.0", - "port-version": 4 + "port-version": 5 }, "libgxps": { "baseline": "0.3.2", - "port-version": 2 + "port-version": 3 }, "libharu": { "baseline": "2.4.4", - "port-version": 0 + "port-version": 1 }, "libhdfs3": { "baseline": "2019-11-05", - "port-version": 5 + "port-version": 6 }, "libheif": { - "baseline": "1.17.5", - "port-version": 0 + "baseline": "1.17.6", + "port-version": 1 }, "libhsplasma": { - "baseline": "2023-05-08", + "baseline": "2024-03-07", "port-version": 0 }, "libhv": { @@ -4402,12 +4522,16 @@ }, "libiconv": { "baseline": "1.17", - "port-version": 1 + "port-version": 3 }, "libics": { "baseline": "1.6.6", "port-version": 0 }, + "libid3tag": { + "baseline": "0.16.3", + "port-version": 0 + }, "libideviceactivation": { "baseline": "2023-05-01", "port-version": 1 @@ -4434,23 +4558,23 @@ }, "libirecovery": { "baseline": "2023-05-13", - "port-version": 1 + "port-version": 2 }, "libjpeg-turbo": { - "baseline": "3.0.1", + "baseline": "3.0.2", "port-version": 0 }, "libjuice": { - "baseline": "1.3.1", - "port-version": 0 + "baseline": "1.3.4", + "port-version": 1 }, "libjxl": { - "baseline": "0.8.2", - "port-version": 1 + "baseline": "0.10.2", + "port-version": 2 }, "libkeyfinder": { - "baseline": "2.2.6", - "port-version": 1 + "baseline": "2.2.8", + "port-version": 0 }, "libkml": { "baseline": "1.3.0", @@ -4458,7 +4582,7 @@ }, "liblas": { "baseline": "1.8.1", - "port-version": 13 + "port-version": 14 }, "liblbfgs": { "baseline": "1.10", @@ -4477,8 +4601,8 @@ "port-version": 1 }, "liblo": { - "baseline": "0.31", - "port-version": 4 + "baseline": "0.32", + "port-version": 0 }, "liblrc": { "baseline": "1.0.0", @@ -4492,28 +4616,32 @@ "baseline": "3.3.2", "port-version": 0 }, + "liblzf": { + "baseline": "3.6", + "port-version": 1 + }, "liblzma": { "baseline": "5.4.4", "port-version": 0 }, "libmad": { - "baseline": "0.15.1", - "port-version": 13 + "baseline": "0.16.4", + "port-version": 3 }, "libmagic": { "baseline": "5.45", - "port-version": 1 + "port-version": 2 }, "libmariadb": { "baseline": "3.3.1", "port-version": 3 }, "libmaxminddb": { - "baseline": "1.7.1", + "baseline": "1.9.1", "port-version": 0 }, "libmediainfo": { - "baseline": "23.10", + "baseline": "24.3", "port-version": 0 }, "libmesh": { @@ -4525,8 +4653,12 @@ "port-version": 2 }, "libmicrohttpd": { - "baseline": "0.9.77", - "port-version": 2 + "baseline": "1.0.1", + "port-version": 1 + }, + "libmidi2": { + "baseline": "0.10", + "port-version": 0 }, "libmikmod": { "baseline": "3.3.11.1", @@ -4542,15 +4674,15 @@ }, "libmodplug": { "baseline": "0.8.9.0", - "port-version": 10 + "port-version": 11 }, "libmorton": { "baseline": "0.2.12", "port-version": 0 }, "libmount": { - "baseline": "2.38", - "port-version": 2 + "baseline": "2.40", + "port-version": 0 }, "libmpeg2": { "baseline": "0.5.1", @@ -4565,20 +4697,24 @@ "port-version": 0 }, "libmupdf": { - "baseline": "1.22.1", - "port-version": 1 + "baseline": "1.23.11", + "port-version": 0 }, "libmysql": { "baseline": "8.0.34", - "port-version": 0 + "port-version": 1 }, "libnice": { "baseline": "0.1.21", - "port-version": 1 + "port-version": 2 }, "libnice-gst": { "baseline": "0.1.21", - "port-version": 3 + "port-version": 4 + }, + "libnick": { + "baseline": "2024.3.1", + "port-version": 0 }, "libnoise": { "baseline": "1.0.0", @@ -4621,28 +4757,36 @@ "port-version": 1 }, "libopenmpt": { - "baseline": "0.6.12", + "baseline": "0.7.4", "port-version": 0 }, "libopensp": { "baseline": "1.5.2", - "port-version": 2 + "port-version": 3 }, "libopnmidi": { "baseline": "1.5.1", - "port-version": 1 + "port-version": 2 }, "libopusenc": { "baseline": "0.2.1", "port-version": 3 }, + "liborigin": { + "baseline": "3.0.2", + "port-version": 1 + }, + "libosdp": { + "baseline": "3.0.5", + "port-version": 0 + }, "libosip2": { "baseline": "5.3.1", "port-version": 0 }, "libosmium": { "baseline": "2.20.0", - "port-version": 0 + "port-version": 1 }, "libosmscout": { "baseline": "1.1.1", @@ -4665,7 +4809,7 @@ "port-version": 2 }, "libphonenumber": { - "baseline": "8.13.23", + "baseline": "8.13.31", "port-version": 0 }, "libplist": { @@ -4677,19 +4821,19 @@ "port-version": 1 }, "libpng": { - "baseline": "1.6.40", - "port-version": 0 + "baseline": "1.6.43", + "port-version": 1 }, "libpopt": { "baseline": "1.16", "port-version": 16 }, "libpq": { - "baseline": "16.0", + "baseline": "16.2", "port-version": 1 }, "libpqxx": { - "baseline": "7.8.1", + "baseline": "7.9.0", "port-version": 0 }, "libprotobuf-mutator": { @@ -4700,13 +4844,17 @@ "baseline": "0.4.18", "port-version": 3 }, + "libpsl": { + "baseline": "0.21.5", + "port-version": 0 + }, "libqcow": { "baseline": "20221124", "port-version": 1 }, "libqglviewer": { "baseline": "2.9.1", - "port-version": 1 + "port-version": 3 }, "libqrencode": { "baseline": "4.1.1", @@ -4717,27 +4865,27 @@ "port-version": 0 }, "librabbitmq": { - "baseline": "0.11.0", - "port-version": 2 + "baseline": "0.14.0", + "port-version": 0 }, "libraqm": { "baseline": "0.10.1", "port-version": 0 }, "libraw": { - "baseline": "0.21.1", - "port-version": 2 + "baseline": "0.21.2", + "port-version": 0 }, "librdkafka": { "baseline": "2.3.0", "port-version": 0 }, "libredwg": { - "baseline": "0.12.5.5178", - "port-version": 1 + "baseline": "0.13.3", + "port-version": 0 }, "libremidi": { - "baseline": "4.2.4", + "baseline": "4.3.0", "port-version": 0 }, "libressl": { @@ -4765,8 +4913,8 @@ "port-version": 1 }, "libsass": { - "baseline": "3.6.5", - "port-version": 1 + "baseline": "3.6.6", + "port-version": 0 }, "libsbml": { "baseline": "5.20.2", @@ -4777,12 +4925,12 @@ "port-version": 0 }, "libsecret": { - "baseline": "0.20.4", - "port-version": 2 + "baseline": "0.21.4", + "port-version": 0 }, "libsercomm": { "baseline": "1.3.2", - "port-version": 0 + "port-version": 1 }, "libsigcpp": { "baseline": "3.6.0", @@ -4817,8 +4965,8 @@ "port-version": 2 }, "libsodium": { - "baseline": "1.0.18", - "port-version": 9 + "baseline": "1.0.19", + "port-version": 2 }, "libsonic": { "baseline": "0.2.0", @@ -4828,13 +4976,17 @@ "baseline": "2.0.0", "port-version": 7 }, + "libsoup": { + "baseline": "3.4.4", + "port-version": 0 + }, "libspatialindex": { "baseline": "1.9.3", "port-version": 3 }, "libspatialite": { "baseline": "5.1.0", - "port-version": 0 + "port-version": 1 }, "libspnav": { "baseline": "0.2.3", @@ -4849,12 +5001,12 @@ "port-version": 13 }, "libsrt": { - "baseline": "1.5.0", - "port-version": 3 + "baseline": "1.5.3", + "port-version": 0 }, "libsrtp": { "baseline": "2.5.0", - "port-version": 0 + "port-version": 1 }, "libssh": { "baseline": "0.10.5", @@ -4877,8 +5029,8 @@ "port-version": 0 }, "libsystemd": { - "baseline": "254", - "port-version": 0 + "baseline": "255", + "port-version": 2 }, "libtar": { "baseline": "1.2.20", @@ -4913,23 +5065,23 @@ "port-version": 0 }, "libtorch": { - "baseline": "1.12.1", - "port-version": 3 + "baseline": "2.1.2", + "port-version": 2 }, "libtorrent": { - "baseline": "2.0.9", + "baseline": "2.0.10", "port-version": 0 }, "libtracepoint": { - "baseline": "1.2.1", + "baseline": "1.3.3", "port-version": 0 }, "libtracepoint-control": { - "baseline": "1.2.1", + "baseline": "1.3.3", "port-version": 0 }, "libtracepoint-decode": { - "baseline": "1.2.1", + "baseline": "1.3.3", "port-version": 0 }, "libu2f-server": { @@ -4949,28 +5101,28 @@ "port-version": 3 }, "libunibreak": { - "baseline": "5.1", - "port-version": 0 + "baseline": "6.1", + "port-version": 1 }, "libunifex": { - "baseline": "0.3.0", + "baseline": "0.4.0", "port-version": 0 }, "libunistring": { - "baseline": "1.1", - "port-version": 3 + "baseline": "1.2", + "port-version": 0 }, "libunwind": { - "baseline": "1.7.2", + "baseline": "1.8.1", "port-version": 0 }, "liburing": { - "baseline": "2.5", + "baseline": "2.6", "port-version": 0 }, "libusb": { - "baseline": "1.0.26.11791", - "port-version": 5 + "baseline": "1.0.27", + "port-version": 1 }, "libusb-win32": { "baseline": "1.2.6.0", @@ -4989,13 +5141,17 @@ "port-version": 1 }, "libuvc": { - "baseline": "2020-11-24", - "port-version": 4 + "baseline": "0.0.7", + "port-version": 0 }, "libvault": { "baseline": "0.56.0", "port-version": 0 }, + "libvhdi": { + "baseline": "20231127", + "port-version": 0 + }, "libvmdk": { "baseline": "20221124", "port-version": 0 @@ -5006,7 +5162,7 @@ }, "libvpx": { "baseline": "1.13.1", - "port-version": 0 + "port-version": 3 }, "libwandio": { "baseline": "4.2.1", @@ -5017,8 +5173,8 @@ "port-version": 1 }, "libwebp": { - "baseline": "1.3.2", - "port-version": 0 + "baseline": "1.4.0", + "port-version": 1 }, "libwebsockets": { "baseline": "4.3.2", @@ -5026,7 +5182,7 @@ }, "libx11": { "baseline": "1.8.1", - "port-version": 1 + "port-version": 2 }, "libxau": { "baseline": "1.0.9", @@ -5042,11 +5198,11 @@ }, "libxcrypt": { "baseline": "4.4.36", - "port-version": 0 + "port-version": 1 }, "libxcvt": { "baseline": "0.1.2", - "port-version": 0 + "port-version": 1 }, "libxdamage": { "baseline": "1.1.5", @@ -5058,7 +5214,7 @@ }, "libxdiff": { "baseline": "0.23", - "port-version": 3 + "port-version": 4 }, "libxdmcp": { "baseline": "1.1.3", @@ -5101,8 +5257,8 @@ "port-version": 2 }, "libxml2": { - "baseline": "2.11.6", - "port-version": 1 + "baseline": "2.11.7", + "port-version": 0 }, "libxmlmm": { "baseline": "0.6.0", @@ -5122,7 +5278,7 @@ }, "libxpm": { "baseline": "3.5.16", - "port-version": 0 + "port-version": 1 }, "libxpresent": { "baseline": "1.0.0", @@ -5146,11 +5302,11 @@ }, "libxslt": { "baseline": "1.1.37", - "port-version": 2 + "port-version": 3 }, "libxt": { - "baseline": "1.2.1", - "port-version": 1 + "baseline": "1.3.0", + "port-version": 0 }, "libxtst": { "baseline": "1.2.4", @@ -5177,15 +5333,15 @@ "port-version": 0 }, "libzim": { - "baseline": "8.2.0", - "port-version": 2 + "baseline": "9.0.0", + "port-version": 0 }, "libzip": { "baseline": "1.10.1", "port-version": 0 }, "libzippp": { - "baseline": "7.0-1.10.1", + "baseline": "7.1-1.10.1", "port-version": 0 }, "licensepp": { @@ -5204,10 +5360,6 @@ "baseline": "2.2", "port-version": 0 }, - "linenoise-ng": { - "baseline": "4754bee2d8eb3", - "port-version": 3 - }, "linmath": { "baseline": "2022-07-30", "port-version": 0 @@ -5217,19 +5369,19 @@ "port-version": 0 }, "litehtml": { - "baseline": "0.6.0", - "port-version": 2 + "baseline": "0.9.0", + "port-version": 0 }, "live555": { - "baseline": "2023-11-08", - "port-version": 0 + "baseline": "2023-11-30", + "port-version": 1 }, "llfio": { "baseline": "2023-11-06", "port-version": 0 }, "llgi": { - "baseline": "2023-11-04", + "baseline": "2023-12-19", "port-version": 0 }, "llgl": { @@ -5237,12 +5389,16 @@ "port-version": 0 }, "llhttp": { - "baseline": "9.1.3", + "baseline": "9.2.0", + "port-version": 0 + }, + "llnl-units": { + "baseline": "0.9.1", "port-version": 0 }, "llvm": { "baseline": "17.0.2", - "port-version": 2 + "port-version": 5 }, "lmdb": { "baseline": "0.9.31", @@ -5269,16 +5425,16 @@ "port-version": 0 }, "log4cxx": { - "baseline": "1.1.0", - "port-version": 1 + "baseline": "1.2.0", + "port-version": 0 }, "loguru": { "baseline": "2.1.0", "port-version": 3 }, "lpeg": { - "baseline": "1.0.2", - "port-version": 4 + "baseline": "1.1.0", + "port-version": 0 }, "ltla-aarand": { "baseline": "2023-03-19", @@ -5329,20 +5485,24 @@ "port-version": 5 }, "luasec": { - "baseline": "1.3.1", - "port-version": 0 + "baseline": "1.3.2", + "port-version": 2 }, "luasocket": { "baseline": "3.1.0", - "port-version": 0 + "port-version": 1 }, "luminoengine": { "baseline": "0.10.1", "port-version": 1 }, + "lunarg-vulkantools": { + "baseline": "1.3.280.0", + "port-version": 0 + }, "lunasvg": { - "baseline": "2.3.8", - "port-version": 1 + "baseline": "2.3.9", + "port-version": 0 }, "luv": { "baseline": "1.44.2", @@ -5356,6 +5516,10 @@ "baseline": "1.9.4", "port-version": 1 }, + "lzav": { + "baseline": "3.13", + "port-version": 0 + }, "lzfse": { "baseline": "1.0", "port-version": 5 @@ -5380,6 +5544,10 @@ "baseline": "2019-09-02", "port-version": 3 }, + "magma": { + "baseline": "2.7.2", + "port-version": 0 + }, "magnum": { "baseline": "2020.06", "port-version": 17 @@ -5433,12 +5601,12 @@ "port-version": 0 }, "mapnik": { - "baseline": "2023-06-12", - "port-version": 2 + "baseline": "2024-04-18", + "port-version": 0 }, "marble": { - "baseline": "22.04.0", - "port-version": 2 + "baseline": "24.02.0", + "port-version": 0 }, "marisa-trie": { "baseline": "0.2.6+20200926", @@ -5453,7 +5621,7 @@ "port-version": 0 }, "materialx": { - "baseline": "1.38.8", + "baseline": "1.38.9", "port-version": 0 }, "mathc": { @@ -5473,15 +5641,15 @@ "port-version": 2 }, "matplotplusplus": { - "baseline": "1.2.0", - "port-version": 1 + "baseline": "1.2.1", + "port-version": 0 }, "matroska": { "baseline": "1.7.1", "port-version": 2 }, "mbedtls": { - "baseline": "2.28.5", + "baseline": "2.28.7", "port-version": 0 }, "mchehab-zbar": { @@ -5494,7 +5662,7 @@ }, "mdl-sdk": { "baseline": "2021.1.2", - "port-version": 4 + "port-version": 5 }, "mdns": { "baseline": "1.4.3", @@ -5518,15 +5686,15 @@ }, "mesa": { "baseline": "23.2.1", - "port-version": 0 + "port-version": 1 }, "meschach": { "baseline": "1.2b", "port-version": 6 }, "meshoptimizer": { - "baseline": "0.19", - "port-version": 1 + "baseline": "0.20", + "port-version": 0 }, "metis": { "baseline": "2022-07-27", @@ -5566,7 +5734,7 @@ }, "mimalloc": { "baseline": "2.1.2", - "port-version": 0 + "port-version": 2 }, "minc": { "baseline": "2.4.03", @@ -5577,11 +5745,11 @@ "port-version": 4 }, "miniaudio": { - "baseline": "0.11.19", + "baseline": "0.11.21", "port-version": 0 }, "minifb": { - "baseline": "2023-02-03", + "baseline": "2023-09-21", "port-version": 0 }, "minimp3": { @@ -5589,8 +5757,8 @@ "port-version": 0 }, "minio-cpp": { - "baseline": "0.1.1", - "port-version": 1 + "baseline": "0.2.0", + "port-version": 0 }, "miniply": { "baseline": "2022-09-15", @@ -5605,7 +5773,7 @@ "port-version": 0 }, "miniupnpc": { - "baseline": "2.2.5", + "baseline": "2.2.6", "port-version": 0 }, "miniz": { @@ -5613,11 +5781,11 @@ "port-version": 0 }, "minizip": { - "baseline": "1.3", - "port-version": 1 + "baseline": "1.3.1", + "port-version": 0 }, "minizip-ng": { - "baseline": "4.0.2", + "baseline": "4.0.5", "port-version": 0 }, "mio": { @@ -5625,7 +5793,7 @@ "port-version": 0 }, "mlpack": { - "baseline": "4.2.0", + "baseline": "4.3.0", "port-version": 0 }, "mman": { @@ -5653,15 +5821,15 @@ "port-version": 2 }, "mongo-c-driver": { - "baseline": "1.25.1", - "port-version": 1 + "baseline": "1.27.1", + "port-version": 0 }, "mongo-cxx-driver": { - "baseline": "3.9.0", + "baseline": "3.10.1", "port-version": 0 }, "mongoose": { - "baseline": "7.12", + "baseline": "7.13", "port-version": 0 }, "monkeys-audio": { @@ -5693,12 +5861,12 @@ "port-version": 0 }, "mp-units": { - "baseline": "2.0.0", + "baseline": "2.1.0", "port-version": 0 }, "mp3lame": { "baseline": "3.100", - "port-version": 11 + "port-version": 13 }, "mpark-patterns": { "baseline": "2019-10-03", @@ -5718,7 +5886,7 @@ }, "mpg123": { "baseline": "1.31.3", - "port-version": 3 + "port-version": 4 }, "mpi": { "baseline": "1", @@ -5752,6 +5920,10 @@ "baseline": "4.0.0", "port-version": 1 }, + "ms-ifc-sdk": { + "baseline": "0.43.1", + "port-version": 0 + }, "ms-quic": { "baseline": "1.2.0", "port-version": 0 @@ -5788,13 +5960,17 @@ "baseline": "1.0.2", "port-version": 5 }, + "mtlt": { + "baseline": "1.0.0", + "port-version": 0 + }, "mujoco": { "baseline": "2.3.2", "port-version": 1 }, "mujs": { - "baseline": "1.3.2", - "port-version": 1 + "baseline": "1.3.4", + "port-version": 0 }, "munit": { "baseline": "2019-04-06", @@ -5813,19 +5989,19 @@ "port-version": 7 }, "mvfst": { - "baseline": "2023.10.02.00", + "baseline": "2024.05.06.00", "port-version": 0 }, "mygui": { "baseline": "3.4.3", - "port-version": 0 + "port-version": 1 }, "mysql-connector-cpp": { "baseline": "8.0.32", "port-version": 1 }, "nameof": { - "baseline": "0.10.3", + "baseline": "0.10.4", "port-version": 0 }, "nana": { @@ -5840,6 +6016,10 @@ "baseline": "4.3.11", "port-version": 0 }, + "nanobind": { + "baseline": "1.9.2", + "port-version": 0 + }, "nanodbc": { "baseline": "2.13.0", "port-version": 8 @@ -5852,13 +6032,17 @@ "baseline": "2019-09-23", "port-version": 5 }, + "nanojsonc": { + "baseline": "1.0.0", + "port-version": 0 + }, "nanomsg": { - "baseline": "1.2.0", + "baseline": "1.2.1", "port-version": 1 }, "nanopb": { - "baseline": "0.4.7", - "port-version": 2 + "baseline": "0.4.8", + "port-version": 0 }, "nanoprintf": { "baseline": "0.3.4", @@ -5873,7 +6057,7 @@ "port-version": 3 }, "nanosvg": { - "baseline": "2022-12-04", + "baseline": "2023-12-29", "port-version": 0 }, "nanovg": { @@ -5893,20 +6077,20 @@ "port-version": 2 }, "ncnn": { - "baseline": "20231027", - "port-version": 0 + "baseline": "20240102", + "port-version": 1 }, "ncurses": { "baseline": "6.4", - "port-version": 1 + "port-version": 2 }, "ndis-driver-library": { "baseline": "1.2.0", "port-version": 0 }, "neargye-semver": { - "baseline": "0.3.0", - "port-version": 1 + "baseline": "0.3.1", + "port-version": 0 }, "ned14-internal-quickcpplib": { "baseline": "2023-11-22", @@ -5918,26 +6102,30 @@ }, "netcdf-c": { "baseline": "4.8.1", - "port-version": 4 + "port-version": 5 }, "netcdf-cxx4": { "baseline": "4.3.1", "port-version": 5 }, + "netgen": { + "baseline": "6.2.2401", + "port-version": 1 + }, "nethost": { - "baseline": "8.0.0", + "baseline": "8.0.3", "port-version": 0 }, "nettle": { - "baseline": "3.8.1", - "port-version": 1 + "baseline": "3.9.1", + "port-version": 0 }, "networkdirect-sdk": { "baseline": "2.0.1", "port-version": 4 }, "nghttp2": { - "baseline": "1.58.0", + "baseline": "1.61.0", "port-version": 0 }, "nghttp2-asio": { @@ -5953,7 +6141,7 @@ "port-version": 0 }, "ngtcp2": { - "baseline": "1.1.0", + "baseline": "1.2.0", "port-version": 0 }, "nifly": { @@ -5974,7 +6162,7 @@ }, "nlopt": { "baseline": "2.7.1", - "port-version": 0 + "port-version": 1 }, "nmap": { "baseline": "7.70", @@ -5985,8 +6173,8 @@ "port-version": 1 }, "nng": { - "baseline": "1.5.2", - "port-version": 1 + "baseline": "1.7.3", + "port-version": 0 }, "nngpp": { "baseline": "1.3.0", @@ -5997,12 +6185,12 @@ "port-version": 3 }, "node-addon-api": { - "baseline": "6.1.0", + "baseline": "7.0.0", "port-version": 0 }, "node-api-headers": { - "baseline": "1.0.0", - "port-version": 1 + "baseline": "1.1.0", + "port-version": 0 }, "nodesoup": { "baseline": "2023-06-12", @@ -6025,8 +6213,8 @@ "port-version": 4 }, "nss": { - "baseline": "3.87", - "port-version": 2 + "baseline": "3.99", + "port-version": 0 }, "nsync": { "baseline": "1.26.0", @@ -6041,7 +6229,7 @@ "port-version": 1 }, "nu-book-zxing-cpp": { - "baseline": "2.1.0", + "baseline": "2.2.1", "port-version": 0 }, "nuklear": { @@ -6049,12 +6237,12 @@ "port-version": 0 }, "numactl": { - "baseline": "2.0.16", + "baseline": "2.0.18", "port-version": 0 }, "numcpp": { "baseline": "2.12.1", - "port-version": 0 + "port-version": 1 }, "nuspell": { "baseline": "5.1.4", @@ -6133,8 +6321,8 @@ "port-version": 0 }, "octomap": { - "baseline": "1.9.8", - "port-version": 1 + "baseline": "1.10.0", + "port-version": 0 }, "ode": { "baseline": "0.16.4", @@ -6149,12 +6337,12 @@ "port-version": 0 }, "ogre": { - "baseline": "14.0.1", - "port-version": 2 + "baseline": "14.2.2", + "port-version": 0 }, "ogre-next": { "baseline": "2.3.3", - "port-version": 0 + "port-version": 3 }, "ois": { "baseline": "1.5.1", @@ -6165,15 +6353,15 @@ "port-version": 2 }, "ompl": { - "baseline": "1.5.1", - "port-version": 5 + "baseline": "1.6.0", + "port-version": 0 }, "omplapp": { "baseline": "1.5.1", "port-version": 5 }, "onednn": { - "baseline": "3.3", + "baseline": "3.4", "port-version": 0 }, "oniguruma": { @@ -6182,7 +6370,7 @@ }, "onnx": { "baseline": "1.15.0", - "port-version": 0 + "port-version": 1 }, "onnx-optimizer": { "baseline": "0.3.18", @@ -6201,20 +6389,24 @@ "port-version": 0 }, "open62541": { - "baseline": "1.3.8", - "port-version": 1 + "baseline": "1.3.9", + "port-version": 0 + }, + "open62541pp": { + "baseline": "0.12.0", + "port-version": 0 }, "openal-soft": { "baseline": "1.23.1", "port-version": 0 }, "openblas": { - "baseline": "0.3.25", + "baseline": "0.3.27", "port-version": 0 }, "opencascade": { - "baseline": "7.7.2", - "port-version": 2 + "baseline": "7.8.1", + "port-version": 0 }, "opencc": { "baseline": "1.1.6", @@ -6233,8 +6425,8 @@ "port-version": 1 }, "opencsg": { - "baseline": "1.4.2", - "port-version": 4 + "baseline": "1.6.0", + "port-version": 0 }, "openctm": { "baseline": "1.0.3", @@ -6242,79 +6434,83 @@ }, "opencv": { "baseline": "4.8.0", - "port-version": 0 + "port-version": 1 }, "opencv2": { "baseline": "2.4.13.7", - "port-version": 19 + "port-version": 20 }, "opencv3": { "baseline": "3.4.18", - "port-version": 12 + "port-version": 14 }, "opencv4": { "baseline": "4.8.0", - "port-version": 12 + "port-version": 19 }, "opendnp3": { "baseline": "3.1.1", "port-version": 1 }, "openexr": { - "baseline": "3.1.8", - "port-version": 0 + "baseline": "3.2.3", + "port-version": 1 }, "openfbx": { "baseline": "2022-07-18", "port-version": 0 }, - "opengl": { - "baseline": "2022-12-04", + "openfx": { + "baseline": "1.4", + "port-version": 0 + }, + "opengl": { + "baseline": "2022-12-04", "port-version": 3 }, "opengl-registry": { - "baseline": "2022-09-29", + "baseline": "2024-02-10", "port-version": 1 }, "openh264": { "baseline": "2021-03-16", - "port-version": 3 + "port-version": 4 }, "openigtlink": { "baseline": "3.0", "port-version": 4 }, "openimageio": { - "baseline": "2.4.14.0", + "baseline": "2.5.8.0", "port-version": 3 }, "openjpeg": { - "baseline": "2.5.0", + "baseline": "2.5.2", "port-version": 1 }, "openldap": { - "baseline": "2.5.13", - "port-version": 1 + "baseline": "2.5.17", + "port-version": 0 }, "openmama": { "baseline": "6.3.2", "port-version": 3 }, "openmesh": { - "baseline": "9.0", - "port-version": 1 + "baseline": "10.0", + "port-version": 0 }, "openmpi": { "baseline": "4.1.6", - "port-version": 0 + "port-version": 1 }, "openmvg": { "baseline": "2.0", - "port-version": 9 + "port-version": 10 }, "openmvs": { "baseline": "2.1.0", - "port-version": 2 + "port-version": 5 }, "openni2": { "baseline": "2.2.0.33", @@ -6326,11 +6522,11 @@ }, "openslide": { "baseline": "3.4.1", - "port-version": 3 + "port-version": 4 }, "openssl": { - "baseline": "3.1.4", - "port-version": 1 + "baseline": "3.3.0", + "port-version": 0 }, "openssl-unix": { "baseline": "deprecated", @@ -6346,14 +6542,10 @@ }, "opensubdiv": { "baseline": "3.5.0", - "port-version": 0 + "port-version": 2 }, "opentelemetry-cpp": { - "baseline": "1.12.0", - "port-version": 1 - }, - "opentelemetry-fluentd": { - "baseline": "2.0.0", + "baseline": "1.14.2", "port-version": 1 }, "opentracing": { @@ -6362,14 +6554,14 @@ }, "openturns": { "baseline": "1.20", - "port-version": 0 + "port-version": 2 }, "openvdb": { - "baseline": "10.0.0", - "port-version": 6 + "baseline": "11.0.0", + "port-version": 0 }, "openvino": { - "baseline": "2023.2.0", + "baseline": "2024.1.0", "port-version": 0 }, "openvpn3": { @@ -6377,7 +6569,7 @@ "port-version": 2 }, "openvr": { - "baseline": "1.23.7", + "baseline": "2.5.1", "port-version": 0 }, "openxr-loader": { @@ -6393,11 +6585,11 @@ "port-version": 3 }, "optional-lite": { - "baseline": "3.5.0", - "port-version": 1 + "baseline": "3.6.0", + "port-version": 0 }, "opus": { - "baseline": "1.4", + "baseline": "1.5.1", "port-version": 0 }, "opusfile": { @@ -6405,7 +6597,7 @@ "port-version": 1 }, "orc": { - "baseline": "1.9.1", + "baseline": "2.0.0", "port-version": 0 }, "orocos-kdl": { @@ -6414,7 +6606,7 @@ }, "osg": { "baseline": "3.6.5", - "port-version": 22 + "port-version": 23 }, "osg-qt": { "baseline": "Qt5", @@ -6433,7 +6625,7 @@ "port-version": 0 }, "outcome": { - "baseline": "2.2.7", + "baseline": "2.2.8", "port-version": 0 }, "p-ranav-csv": { @@ -6450,7 +6642,7 @@ }, "paho-mqtt": { "baseline": "1.3.13", - "port-version": 0 + "port-version": 1 }, "paho-mqttpp3": { "baseline": "1.3.2", @@ -6466,14 +6658,14 @@ }, "pangolin": { "baseline": "0.8", - "port-version": 2 + "port-version": 3 }, "pangomm": { "baseline": "2.50.1", "port-version": 3 }, "parallel-hashmap": { - "baseline": "1.3.11", + "baseline": "1.3.12", "port-version": 0 }, "parallelstl": { @@ -6481,8 +6673,8 @@ "port-version": 3 }, "paraview": { - "baseline": "5.11.0", - "port-version": 4 + "baseline": "5.12.0", + "port-version": 0 }, "parmetis": { "baseline": "2022-07-27", @@ -6513,16 +6705,16 @@ "port-version": 0 }, "pcl": { - "baseline": "1.13.1", - "port-version": 1 + "baseline": "1.14.1", + "port-version": 0 }, "pcre": { "baseline": "8.45", - "port-version": 5 + "port-version": 6 }, "pcre2": { - "baseline": "10.42", - "port-version": 1 + "baseline": "10.43", + "port-version": 0 }, "pdal": { "baseline": "2.5.3", @@ -6541,8 +6733,8 @@ "port-version": 2 }, "pe-parse": { - "baseline": "2.1.0", - "port-version": 1 + "baseline": "2.1.1", + "port-version": 0 }, "pegtl": { "baseline": "3.2.7", @@ -6552,6 +6744,10 @@ "baseline": "2.8.3", "port-version": 3 }, + "perfetto": { + "baseline": "45.0", + "port-version": 0 + }, "pffft": { "baseline": "2021-10-09", "port-version": 1 @@ -6593,7 +6789,7 @@ "port-version": 2 }, "pipewire": { - "baseline": "0.3.83", + "baseline": "1.0.4", "port-version": 0 }, "pistache": { @@ -6605,11 +6801,11 @@ "port-version": 1 }, "pixman": { - "baseline": "0.42.2", - "port-version": 2 + "baseline": "0.43.4", + "port-version": 0 }, "pkgconf": { - "baseline": "2.1.0", + "baseline": "2.2.0", "port-version": 0 }, "plasma-wayland-protocols": { @@ -6621,7 +6817,7 @@ "port-version": 1 }, "plf-colony": { - "baseline": "7.3.1", + "baseline": "7.41", "port-version": 0 }, "plf-hive": { @@ -6636,6 +6832,10 @@ "baseline": "2019-08-10", "port-version": 2 }, + "plf-queue": { + "baseline": "2.2", + "port-version": 0 + }, "plf-stack": { "baseline": "2019-08-10", "port-version": 2 @@ -6664,6 +6864,10 @@ "baseline": "1.12.0", "port-version": 2 }, + "pmp-library": { + "baseline": "3.0.0", + "port-version": 0 + }, "pngpp": { "baseline": "0.2.10", "port-version": 2 @@ -6676,28 +6880,28 @@ "baseline": "2023-09-25", "port-version": 0 }, + "pocketpy": { + "baseline": "1.4.5", + "port-version": 0 + }, "poco": { - "baseline": "1.12.5.1", + "baseline": "1.13.3", "port-version": 0 }, "podofo": { - "baseline": "0.10.2", + "baseline": "0.10.3", "port-version": 0 }, "poissonrecon": { "baseline": "2021-09-26", "port-version": 0 }, - "poly2tri": { - "baseline": "2020-07-21", - "port-version": 3 - }, "polyclipping": { "baseline": "6.4.2", "port-version": 12 }, "polyhook2": { - "baseline": "2023-08-11", + "baseline": "2024-02-08", "port-version": 0 }, "polymorphic-value": { @@ -6709,8 +6913,8 @@ "port-version": 5 }, "poppler": { - "baseline": "23.11.0", - "port-version": 0 + "baseline": "24.3.0", + "port-version": 1 }, "popsift": { "baseline": "0.9", @@ -6722,7 +6926,7 @@ }, "portable-snippets": { "baseline": "2019-09-20", - "port-version": 3 + "port-version": 4 }, "portaudio": { "baseline": "19.7", @@ -6730,7 +6934,7 @@ }, "portmidi": { "baseline": "2.0.4", - "port-version": 2 + "port-version": 3 }, "portsmf": { "baseline": "239", @@ -6756,24 +6960,28 @@ "baseline": "2023-10-16", "port-version": 0 }, + "pravila00-enumflag": { + "baseline": "2024-04-12", + "port-version": 0 + }, "pravila00-make-vector": { "baseline": "2023-04-10", "port-version": 0 }, "presentmon": { - "baseline": "1.7.0", - "port-version": 2 + "baseline": "1.10.0", + "port-version": 0 }, "proj": { - "baseline": "9.3.1", + "baseline": "9.4.0", "port-version": 0 }, - "proj4": { - "baseline": "8.9.9", - "port-version": 1 + "projectm-eval": { + "baseline": "1.0.0", + "port-version": 0 }, "prometheus-cpp": { - "baseline": "1.1.0", + "baseline": "1.2.4", "port-version": 0 }, "promise-cpp": { @@ -6782,7 +6990,7 @@ }, "protobuf": { "baseline": "3.21.12", - "port-version": 0 + "port-version": 2 }, "protobuf-c": { "baseline": "1.4.1", @@ -6797,15 +7005,15 @@ "port-version": 0 }, "proxsuite": { - "baseline": "0.5.0", + "baseline": "0.6.4", "port-version": 0 }, "proxy": { - "baseline": "1.1.1", + "baseline": "2.4.0", "port-version": 0 }, "proxygen": { - "baseline": "2023.10.02.00", + "baseline": "2024.05.06.00", "port-version": 0 }, "psimd": { @@ -6817,8 +7025,8 @@ "port-version": 1 }, "ptex": { - "baseline": "2.3.2", - "port-version": 4 + "baseline": "2.4.2", + "port-version": 0 }, "pthread": { "baseline": "3.0.0", @@ -6844,13 +7052,21 @@ "baseline": "1.14", "port-version": 0 }, + "pulsar-client-cpp": { + "baseline": "3.4.2", + "port-version": 2 + }, + "pulseaudio": { + "baseline": "17.0", + "port-version": 0 + }, "pulzed-mini": { "baseline": "0.9.14", "port-version": 0 }, "pybind11": { - "baseline": "2.11.1", - "port-version": 0 + "baseline": "2.12.0", + "port-version": 1 }, "pystring": { "baseline": "1.1.4", @@ -6861,12 +7077,12 @@ "port-version": 7 }, "python3": { - "baseline": "3.11.5", + "baseline": "3.11.8", "port-version": 2 }, "qca": { "baseline": "2.3.7", - "port-version": 0 + "port-version": 1 }, "qcoro": { "baseline": "0.10.0", @@ -6882,7 +7098,7 @@ }, "qhull": { "baseline": "8.0.2", - "port-version": 4 + "port-version": 5 }, "qnnpack": { "baseline": "2021-02-26", @@ -6901,255 +7117,255 @@ "port-version": 1 }, "qscintilla": { - "baseline": "2.13.4", - "port-version": 2 + "baseline": "2.14.1", + "port-version": 1 }, "qt": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qt-advanced-docking-system": { - "baseline": "4.2.1", + "baseline": "4.3.0", "port-version": 0 }, "qt3d": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qt5": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 2 }, "qt5-3d": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-activeqt": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-androidextras": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-base": { - "baseline": "5.15.11", + "baseline": "5.15.13", "port-version": 1 }, "qt5-canvas3d": { "baseline": "0", - "port-version": 2 + "port-version": 3 }, "qt5-charts": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-connectivity": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-datavis3d": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-declarative": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-doc": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-gamepad": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-graphicaleffects": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-imageformats": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 2 }, "qt5-location": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-macextras": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-modularscripts": { "baseline": "deprecated", "port-version": 1 }, "qt5-mqtt": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-multimedia": { - "baseline": "5.15.11", + "baseline": "5.15.13", "port-version": 1 }, "qt5-networkauth": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-purchasing": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-quickcontrols": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-quickcontrols2": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-remoteobjects": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-script": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-scxml": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-sensors": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-serialbus": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-serialport": { - "baseline": "5.15.11", + "baseline": "5.15.13", "port-version": 0 }, "qt5-speech": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-svg": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-tools": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-translations": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-virtualkeyboard": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-wayland": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-webchannel": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-webengine": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 3 }, "qt5-webglplugin": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-websockets": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-webview": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-winextras": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 2 }, "qt5-x11extras": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5-xmlpatterns": { - "baseline": "5.15.11", - "port-version": 0 + "baseline": "5.15.13", + "port-version": 1 }, "qt5compat": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtactiveqt": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtapplicationmanager": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtbase": { - "baseline": "6.6.1", - "port-version": 1 + "baseline": "6.7.0", + "port-version": 0 }, "qtcharts": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtcoap": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtconnectivity": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtdatavis3d": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtdeclarative": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtdeviceutilities": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtdoc": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtgraphs": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtgrpc": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qthttpserver": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtimageformats": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtinterfaceframework": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtkeychain": { @@ -7158,122 +7374,122 @@ }, "qtkeychain-qt6": { "baseline": "0.14.1", - "port-version": 0 + "port-version": 1 }, "qtlanguageserver": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtlocation": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtlottie": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtmqtt": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtmultimedia": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtnetworkauth": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtopcua": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtpositioning": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtquick3d": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtquick3dphysics": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtquickcontrols2": { "baseline": "deprecated", - "port-version": 0 + "port-version": 1 }, "qtquickeffectmaker": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtquicktimeline": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtremoteobjects": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtscxml": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtsensors": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtserialbus": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtserialport": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtshadertools": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtspeech": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtsvg": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qttools": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qttranslations": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtvirtualkeyboard": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtwayland": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtwebchannel": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtwebengine": { - "baseline": "6.6.1", - "port-version": 1 + "baseline": "6.7.0", + "port-version": 0 }, "qtwebsockets": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "qtwebview": { - "baseline": "6.6.1", + "baseline": "6.7.0", "port-version": 0 }, "quadtree": { @@ -7281,7 +7497,7 @@ "port-version": 0 }, "quantlib": { - "baseline": "1.32", + "baseline": "1.34", "port-version": 0 }, "quaternions": { @@ -7294,23 +7510,23 @@ }, "quickfast": { "baseline": "1.5", - "port-version": 3 + "port-version": 4 }, "quickfix": { "baseline": "1.15.1", "port-version": 9 }, "quill": { - "baseline": "3.5.0", + "baseline": "3.8.0", "port-version": 0 }, "quirc": { - "baseline": "1.1", - "port-version": 3 + "baseline": "1.2", + "port-version": 0 }, "qwt": { - "baseline": "6.2.0+20220616", - "port-version": 1 + "baseline": "6.3.0", + "port-version": 0 }, "qwtw": { "baseline": "3.1.0", @@ -7338,27 +7554,27 @@ }, "range-v3": { "baseline": "0.12.0", - "port-version": 1 + "port-version": 2 }, "range-v3-vs2015": { "baseline": "20151130-vcpkg5", "port-version": 2 }, "rapidcheck": { - "baseline": "2023-01-13", + "baseline": "2023-12-14", "port-version": 0 }, "rapidcsv": { - "baseline": "8.64", + "baseline": "8.80", "port-version": 0 }, "rapidfuzz": { - "baseline": "2.0.0", + "baseline": "3.0.2", "port-version": 0 }, "rapidjson": { "baseline": "2023-07-17", - "port-version": 0 + "port-version": 1 }, "rapidxml": { "baseline": "1.13", @@ -7382,18 +7598,18 @@ }, "rbdl": { "baseline": "3.3.0", - "port-version": 5 + "port-version": 6 }, "rbdl-orb": { "baseline": "3.2.0", "port-version": 2 }, "re2": { - "baseline": "2023-07-01", - "port-version": 0 + "baseline": "2024-04-01", + "port-version": 2 }, "reactiveplusplus": { - "baseline": "0.2.3", + "baseline": "2.0.0", "port-version": 0 }, "readerwriterqueue": { @@ -7422,7 +7638,7 @@ }, "realsense2": { "baseline": "2.54.2", - "port-version": 1 + "port-version": 2 }, "recast": { "baseline": "deprecated", @@ -7430,14 +7646,14 @@ }, "recastnavigation": { "baseline": "1.6.0", - "port-version": 0 + "port-version": 1 }, "recycle": { "baseline": "6.0.0", "port-version": 0 }, "redis-plus-plus": { - "baseline": "1.3.10", + "baseline": "1.3.12", "port-version": 0 }, "refl-cpp": { @@ -7449,7 +7665,7 @@ "port-version": 0 }, "rendergraph": { - "baseline": "1.3.0", + "baseline": "1.4.1", "port-version": 0 }, "replxx": { @@ -7477,7 +7693,7 @@ "port-version": 0 }, "restinio": { - "baseline": "0.7.0", + "baseline": "0.7.2", "port-version": 0 }, "rexo": { @@ -7486,7 +7702,7 @@ }, "rhash": { "baseline": "1.4.4", - "port-version": 0 + "port-version": 1 }, "rhasheq": { "baseline": "2023-06-17", @@ -7514,14 +7730,14 @@ }, "rmlui": { "baseline": "5.1", - "port-version": 0 + "port-version": 1 }, "rmqcpp": { "baseline": "1.0.0", "port-version": 0 }, "roaring": { - "baseline": "0.9.6", + "baseline": "3.0.1", "port-version": 0 }, "robin-hood-hashing": { @@ -7529,11 +7745,19 @@ "port-version": 0 }, "robin-map": { - "baseline": "1.2.1", + "baseline": "1.2.2", + "port-version": 0 + }, + "robotraconteur": { + "baseline": "1.2.0", + "port-version": 1 + }, + "robotraconteur-companion": { + "baseline": "0.3.1", "port-version": 0 }, "rocksdb": { - "baseline": "8.5.3", + "baseline": "9.1.0", "port-version": 0 }, "rpclib": { @@ -7542,7 +7766,7 @@ }, "rply": { "baseline": "1.1.4", - "port-version": 3 + "port-version": 4 }, "rsasynccpp": { "baseline": "0.0.7", @@ -7566,22 +7790,26 @@ }, "rsocket": { "baseline": "2021.08.30.00", - "port-version": 2 + "port-version": 4 }, "rtabmap": { - "baseline": "0.21.0", - "port-version": 3 + "baseline": "0.21.4.1", + "port-version": 1 + }, + "rtabmap-res-tool": { + "baseline": "0.21.4.1", + "port-version": 0 }, "rtaudio": { "baseline": "6.0.1", - "port-version": 0 + "port-version": 1 }, "rtlsdr": { "baseline": "2020-04-16", "port-version": 4 }, "rtmfp-cpp": { - "baseline": "1.4.0-20230213.18168ec", + "baseline": "1.5.1", "port-version": 0 }, "rtmidi": { @@ -7590,11 +7818,11 @@ }, "rttr": { "baseline": "0.9.6+20210811", - "port-version": 0 + "port-version": 1 }, "rubberband": { "baseline": "3.3.0", - "port-version": 0 + "port-version": 1 }, "rxcpp": { "baseline": "4.1.1", @@ -7617,20 +7845,20 @@ "port-version": 9 }, "s2geometry": { - "baseline": "0.10.0", + "baseline": "0.11.1", "port-version": 0 }, "s2n": { - "baseline": "1.3.56", + "baseline": "1.4.8", "port-version": 0 }, "safeint": { - "baseline": "3.0.26", + "baseline": "3.0.28", "port-version": 0 }, "sail": { - "baseline": "0.9.0", - "port-version": 0 + "baseline": "0.9.4", + "port-version": 1 }, "sajson": { "baseline": "2018-09-21", @@ -7681,8 +7909,8 @@ "port-version": 0 }, "scnlib": { - "baseline": "1.1.2", - "port-version": 0 + "baseline": "2.0.2", + "port-version": 2 }, "scope-guard": { "baseline": "1.1.0", @@ -7701,28 +7929,28 @@ "port-version": 3 }, "sdbus-cpp": { - "baseline": "1.3.0", - "port-version": 1 + "baseline": "1.5.0", + "port-version": 0 }, "sdformat10": { "baseline": "10.0.0", - "port-version": 3 + "port-version": 4 }, "sdformat13": { - "baseline": "13.5.0", - "port-version": 1 + "baseline": "13.6.0", + "port-version": 0 }, "sdformat6": { "baseline": "6.2.0", - "port-version": 6 + "port-version": 7 }, "sdformat9": { "baseline": "9.8.0", - "port-version": 1 + "port-version": 2 }, "sdl1": { "baseline": "1.2.15", - "port-version": 19 + "port-version": 20 }, "sdl1-mixer": { "baseline": "2023-03-25", @@ -7733,20 +7961,20 @@ "port-version": 6 }, "sdl2": { - "baseline": "2.28.5", - "port-version": 1 + "baseline": "2.30.1", + "port-version": 0 }, "sdl2-gfx": { "baseline": "1.0.4", "port-version": 11 }, "sdl2-image": { - "baseline": "2.6.3", - "port-version": 1 + "baseline": "2.8.2", + "port-version": 2 }, "sdl2-mixer": { - "baseline": "2.6.3", - "port-version": 2 + "baseline": "2.8.0", + "port-version": 3 }, "sdl2-mixer-ext": { "baseline": "2.6.0", @@ -7757,7 +7985,7 @@ "port-version": 3 }, "sdl2-ttf": { - "baseline": "2.20.2", + "baseline": "2.22.0", "port-version": 1 }, "sdl2pp": { @@ -7770,7 +7998,7 @@ }, "seal": { "baseline": "4.1.1", - "port-version": 1 + "port-version": 2 }, "seasocks": { "baseline": "1.4.6", @@ -7782,14 +8010,14 @@ }, "selene": { "baseline": "0.3.1", - "port-version": 6 + "port-version": 7 }, "sentencepiece": { - "baseline": "0.1.99", - "port-version": 1 + "baseline": "0.2.0", + "port-version": 0 }, "sentry-native": { - "baseline": "0.6.7", + "baseline": "0.7.2", "port-version": 0 }, "septag-dmon": { @@ -7825,15 +8053,15 @@ "port-version": 0 }, "sfsexp": { - "baseline": "1.3.1", - "port-version": 1 + "baseline": "1.4.1", + "port-version": 0 }, "shader-slang": { - "baseline": "0.27.20", + "baseline": "2024.1.12", "port-version": 0 }, "shaderc": { - "baseline": "2023.7", + "baseline": "2023.8", "port-version": 0 }, "shaderwriter": { @@ -7841,11 +8069,11 @@ "port-version": 0 }, "shapelib": { - "baseline": "1.5.0", - "port-version": 4 + "baseline": "1.6.0", + "port-version": 0 }, "shiftmedia-libgcrypt": { - "baseline": "1.10.1-1", + "baseline": "1.10.3-1", "port-version": 0 }, "shiftmedia-libgnutls": { @@ -7854,7 +8082,7 @@ }, "shiftmedia-libgpg-error": { "baseline": "1.45", - "port-version": 0 + "port-version": 1 }, "shiva": { "baseline": "1.0", @@ -7862,7 +8090,7 @@ }, "shogun": { "baseline": "6.1.4", - "port-version": 9 + "port-version": 10 }, "si": { "baseline": "2.5.1", @@ -7881,8 +8109,8 @@ "port-version": 5 }, "simage": { - "baseline": "1.8.2", - "port-version": 2 + "baseline": "1.8.3", + "port-version": 0 }, "simbody": { "baseline": "2023-01-10", @@ -7890,18 +8118,22 @@ }, "simd": { "baseline": "5.3.128", - "port-version": 0 + "port-version": 1 }, "simde": { - "baseline": "0.7.6", + "baseline": "0.8.2", "port-version": 0 }, "simdjson": { - "baseline": "3.6.2", + "baseline": "3.8.0", "port-version": 0 }, "simdutf": { - "baseline": "3.2.16", + "baseline": "5.2.5", + "port-version": 0 + }, + "simonbrunel-qtpromise": { + "baseline": "0.7.0", "port-version": 0 }, "simple-fft": { @@ -7913,7 +8145,7 @@ "port-version": 0 }, "simpleini": { - "baseline": "4.19", + "baseline": "4.22", "port-version": 0 }, "simsimd": { @@ -7929,8 +8161,8 @@ "port-version": 0 }, "skia": { - "baseline": "0.38.2", - "port-version": 1 + "baseline": "124", + "port-version": 0 }, "skyr-url": { "baseline": "1.13.0", @@ -7972,6 +8204,10 @@ "baseline": "0", "port-version": 2 }, + "snitch": { + "baseline": "1.2.4", + "port-version": 0 + }, "snowhouse": { "baseline": "5.0.0", "port-version": 2 @@ -7981,7 +8217,7 @@ "port-version": 0 }, "sobjectizer": { - "baseline": "5.8.1.1", + "baseline": "5.8.2", "port-version": 0 }, "soci": { @@ -7989,16 +8225,16 @@ "port-version": 3 }, "socket-io-client": { - "baseline": "2023-02-14", + "baseline": "2023-11-11", "port-version": 0 }, "sockpp": { - "baseline": "0.8.1", + "baseline": "1.0.0", "port-version": 0 }, "soem": { "baseline": "2023-06-09", - "port-version": 1 + "port-version": 2 }, "soil": { "baseline": "2021-04-22", @@ -8033,19 +8269,19 @@ "port-version": 2 }, "soundtouch": { - "baseline": "2.3.2", - "port-version": 1 + "baseline": "2.3.3", + "port-version": 0 }, "soxr": { "baseline": "0.1.3", - "port-version": 7 + "port-version": 8 }, "spaceland": { "baseline": "7.8.2", "port-version": 8 }, "span-lite": { - "baseline": "0.10.3", + "baseline": "0.11.0", "port-version": 0 }, "sparsehash": { @@ -8061,8 +8297,8 @@ "port-version": 0 }, "spdk": { - "baseline": "19.01.1", - "port-version": 3 + "baseline": "24.01", + "port-version": 0 }, "spdk-dpdk": { "baseline": "2018-11-24", @@ -8077,7 +8313,7 @@ "port-version": 3 }, "spdlog": { - "baseline": "1.12.0", + "baseline": "1.14.1", "port-version": 0 }, "spectra": { @@ -8098,22 +8334,22 @@ }, "spirit-po": { "baseline": "1.1.2", - "port-version": 3 + "port-version": 4 }, "spirv-cross": { - "baseline": "2021-01-15", - "port-version": 2 + "baseline": "1.3.280.0", + "port-version": 0 }, "spirv-headers": { - "baseline": "1.3.246.1", + "baseline": "1.3.280.0", "port-version": 0 }, "spirv-reflect": { - "baseline": "1.3.236.0", - "port-version": 0 + "baseline": "1.3.280.0", + "port-version": 1 }, "spirv-tools": { - "baseline": "2023.2", + "baseline": "1.3.280.0", "port-version": 0 }, "spout2": { @@ -8129,19 +8365,19 @@ "port-version": 3 }, "sqlcipher": { - "baseline": "4.5.4", + "baseline": "4.5.6", "port-version": 0 }, "sqlite-modern-cpp": { - "baseline": "3.2-936cd0c8", - "port-version": 2 + "baseline": "2023-12-03", + "port-version": 0 }, "sqlite-orm": { "baseline": "1.8.2", "port-version": 1 }, "sqlite3": { - "baseline": "3.43.2", + "baseline": "3.45.3", "port-version": 0 }, "sqlitecpp": { @@ -8149,8 +8385,8 @@ "port-version": 0 }, "sqlpp11": { - "baseline": "0.61", - "port-version": 3 + "baseline": "0.64", + "port-version": 0 }, "sqlpp11-connector-mysql": { "baseline": "0.61", @@ -8165,8 +8401,8 @@ "port-version": 0 }, "sratom": { - "baseline": "0.6.4", - "port-version": 2 + "baseline": "0.6.16", + "port-version": 0 }, "srell": { "baseline": "3.010", @@ -8177,7 +8413,7 @@ "port-version": 0 }, "sse2neon": { - "baseline": "1.6.0", + "baseline": "1.7.0", "port-version": 0 }, "stackwalker": { @@ -8229,15 +8465,19 @@ "port-version": 2 }, "string-theory": { - "baseline": "3.6", + "baseline": "3.8", "port-version": 0 }, "string-view-lite": { "baseline": "1.7.0", "port-version": 1 }, + "stringzilla": { + "baseline": "3.7.0", + "port-version": 0 + }, "strong-type": { - "baseline": "12", + "baseline": "14", "port-version": 0 }, "stronk": { @@ -8246,10 +8486,10 @@ }, "strtk": { "baseline": "2020-09-14", - "port-version": 3 + "port-version": 4 }, "stx": { - "baseline": "0.0.3", + "baseline": "1.0.5", "port-version": 0 }, "stxxl": { @@ -8265,7 +8505,7 @@ "port-version": 0 }, "superlu": { - "baseline": "6.0.0", + "baseline": "6.0.1", "port-version": 0 }, "swenson-sort": { @@ -8273,7 +8513,7 @@ "port-version": 0 }, "symengine": { - "baseline": "0.11.1", + "baseline": "0.11.2", "port-version": 0 }, "systemc": { @@ -8293,7 +8533,7 @@ "port-version": 6 }, "taglib": { - "baseline": "1.13.1", + "baseline": "2.0", "port-version": 1 }, "talib": { @@ -8361,7 +8601,7 @@ "port-version": 0 }, "tesseract": { - "baseline": "5.3.3", + "baseline": "5.3.4", "port-version": 0 }, "tfhe": { @@ -8369,7 +8609,7 @@ "port-version": 5 }, "tgbot-cpp": { - "baseline": "1.7.2", + "baseline": "1.7.3", "port-version": 0 }, "tgc": { @@ -8378,26 +8618,26 @@ }, "tgui": { "baseline": "1.1.0", - "port-version": 0 + "port-version": 1 }, "theia": { "baseline": "0.8", - "port-version": 9 + "port-version": 10 }, "think-cell-range": { "baseline": "2023.1", - "port-version": 0 + "port-version": 1 }, "thomasmonkman-filewatch": { "baseline": "2023-01-16", - "port-version": 1 + "port-version": 2 }, "thor": { "baseline": "2022-04-16", "port-version": 0 }, "thorvg": { - "baseline": "0.11.3", + "baseline": "0.13.2", "port-version": 0 }, "threadpool": { @@ -8405,16 +8645,16 @@ "port-version": 3 }, "thrift": { - "baseline": "0.19.0", + "baseline": "0.20.0", "port-version": 0 }, "tidy-html5": { "baseline": "5.8.0", - "port-version": 0 + "port-version": 1 }, "tiff": { "baseline": "4.6.0", - "port-version": 1 + "port-version": 4 }, "tinkerforge": { "baseline": "2.1.25", @@ -8449,7 +8689,7 @@ "port-version": 3 }, "tinydir": { - "baseline": "1.2.5", + "baseline": "1.2.6", "port-version": 0 }, "tinyexif": { @@ -8461,7 +8701,7 @@ "port-version": 2 }, "tinyexr": { - "baseline": "1.0.5", + "baseline": "1.0.8", "port-version": 0 }, "tinyfiledialogs": { @@ -8473,7 +8713,7 @@ "port-version": 0 }, "tinygltf": { - "baseline": "2.8.17", + "baseline": "2.8.21", "port-version": 0 }, "tinynpy": { @@ -8481,19 +8721,19 @@ "port-version": 6 }, "tinyobjloader": { - "baseline": "2.0.0-rc9", + "baseline": "2.0.0rc13", "port-version": 0 }, "tinyorm": { - "baseline": "0.36.5", - "port-version": 2 + "baseline": "0.37.3", + "port-version": 0 }, "tinyply": { "baseline": "2.3.4", "port-version": 0 }, "tinyspline": { - "baseline": "0.4.0", + "baseline": "0.6.0", "port-version": 0 }, "tinythread": { @@ -8506,7 +8746,7 @@ }, "tinyutf8": { "baseline": "4.4.3", - "port-version": 0 + "port-version": 1 }, "tinyxml": { "baseline": "2.6.2", @@ -8537,23 +8777,23 @@ "port-version": 1 }, "tlx": { - "baseline": "0.5.20191212", - "port-version": 4 + "baseline": "0.6.1", + "port-version": 0 }, "tmx": { - "baseline": "1.2.0", - "port-version": 2 + "baseline": "1.4.0", + "port-version": 0 }, "tmxlite": { - "baseline": "1.3.0", - "port-version": 1 + "baseline": "1.4.4", + "port-version": 0 }, "tmxparser": { "baseline": "2019-10-14", "port-version": 0 }, "toml11": { - "baseline": "3.7.1", + "baseline": "3.8.1", "port-version": 0 }, "tomlplusplus": { @@ -8566,14 +8806,14 @@ }, "tracy": { "baseline": "0.10.0", - "port-version": 1 + "port-version": 2 }, "transwarp": { - "baseline": "2.2.2", + "baseline": "2.2.3", "port-version": 0 }, "trantor": { - "baseline": "1.5.15", + "baseline": "1.5.18", "port-version": 0 }, "tre": { @@ -8594,7 +8834,7 @@ }, "treehopper": { "baseline": "1.11.3", - "port-version": 8 + "port-version": 9 }, "triangle": { "baseline": "1.6", @@ -8605,16 +8845,20 @@ "port-version": 0 }, "trompeloeil": { - "baseline": "45", + "baseline": "47", + "port-version": 0 + }, + "try-catcher": { + "baseline": "1.0.1", "port-version": 0 }, "tsl-hopscotch-map": { - "baseline": "2.3.0", - "port-version": 3 + "baseline": "2.3.1", + "port-version": 0 }, "tsl-ordered-map": { - "baseline": "1.0.0", - "port-version": 3 + "baseline": "1.1.0", + "port-version": 0 }, "tsl-sparse-map": { "baseline": "0.6.2", @@ -8633,8 +8877,8 @@ "port-version": 3 }, "tvision": { - "baseline": "2021-08-10", - "port-version": 1 + "baseline": "2024-02-28", + "port-version": 0 }, "tweeny": { "baseline": "3.2.0", @@ -8645,8 +8889,8 @@ "port-version": 3 }, "type-safe": { - "baseline": "0.2.2", - "port-version": 1 + "baseline": "0.2.3", + "port-version": 0 }, "uchardet": { "baseline": "0.0.8", @@ -8661,7 +8905,7 @@ "port-version": 1 }, "uni-algo": { - "baseline": "1.0.0", + "baseline": "1.2.0", "port-version": 0 }, "unicorn": { @@ -8674,7 +8918,7 @@ }, "units": { "baseline": "2.3.3", - "port-version": 0 + "port-version": 1 }, "unittest-cpp": { "baseline": "2.0.0", @@ -8685,7 +8929,7 @@ "port-version": 2 }, "unordered-dense": { - "baseline": "4.1.2", + "baseline": "4.4.0", "port-version": 0 }, "unqlite": { @@ -8693,8 +8937,8 @@ "port-version": 2 }, "unrar": { - "baseline": "6.1.7", - "port-version": 3 + "baseline": "7.0.7", + "port-version": 0 }, "upb": { "baseline": "2022-06-21", @@ -8705,7 +8949,7 @@ "port-version": 0 }, "urdfdom-headers": { - "baseline": "1.1.0", + "baseline": "1.1.1", "port-version": 0 }, "urho3d": { @@ -8718,34 +8962,38 @@ }, "usbmuxd": { "baseline": "2023-07-21", - "port-version": 0 + "port-version": 1 }, "usd": { - "baseline": "23.5", - "port-version": 3 + "baseline": "24.5", + "port-version": 0 }, "usearch": { "baseline": "2.3.2", "port-version": 0 }, "usockets": { - "baseline": "0.8.6", + "baseline": "0.8.8", "port-version": 1 }, "usrsctp": { "baseline": "0.9.5.0", - "port-version": 2 + "port-version": 3 + }, + "utf8-range": { + "baseline": "2023-11-09", + "port-version": 0 }, "utf8h": { "baseline": "2021-11-18", "port-version": 1 }, "utf8proc": { - "baseline": "2.7.0", - "port-version": 1 + "baseline": "2.9.0", + "port-version": 0 }, "utfcpp": { - "baseline": "4.0.2", + "baseline": "4.0.5", "port-version": 0 }, "utfz": { @@ -8757,11 +9005,11 @@ "port-version": 0 }, "uthenticode": { - "baseline": "1.0.6", - "port-version": 2 + "baseline": "2.0.1", + "port-version": 0 }, "uvatlas": { - "baseline": "2023-10-31", + "baseline": "2024-02-21", "port-version": 0 }, "uvw": { @@ -8769,7 +9017,7 @@ "port-version": 0 }, "uwebsockets": { - "baseline": "20.47.0", + "baseline": "20.62.0", "port-version": 0 }, "v-hacd": { @@ -8778,10 +9026,10 @@ }, "v8": { "baseline": "9.1.269.39", - "port-version": 6 + "port-version": 7 }, "valijson": { - "baseline": "1.0.1", + "baseline": "1.0.2", "port-version": 0 }, "value-ptr-lite": { @@ -8790,7 +9038,7 @@ }, "vamp-sdk": { "baseline": "2.10", - "port-version": 4 + "port-version": 5 }, "variant-lite": { "baseline": "2.0.0", @@ -8804,8 +9052,12 @@ "baseline": "2022.02", "port-version": 0 }, + "vcpkg-boost": { + "baseline": "2024-04-25", + "port-version": 0 + }, "vcpkg-cmake": { - "baseline": "2023-05-04", + "baseline": "2024-04-18", "port-version": 0 }, "vcpkg-cmake-config": { @@ -8813,11 +9065,11 @@ "port-version": 1 }, "vcpkg-cmake-get-vars": { - "baseline": "2023-03-02", + "baseline": "2023-12-31", "port-version": 0 }, "vcpkg-get-python-packages": { - "baseline": "2023-07-28", + "baseline": "2024-01-24", "port-version": 0 }, "vcpkg-gfortran": { @@ -8825,28 +9077,28 @@ "port-version": 3 }, "vcpkg-gn": { - "baseline": "2021-11-16", - "port-version": 3 + "baseline": "2024-02-22", + "port-version": 0 }, "vcpkg-msbuild": { "baseline": "2023-08-08", "port-version": 0 }, "vcpkg-pkgconfig-get-modules": { - "baseline": "2023-09-06", + "baseline": "2024-04-03", "port-version": 0 }, "vcpkg-qmake": { "baseline": "2023-03-22", - "port-version": 0 + "port-version": 1 }, "vcpkg-tool-bazel": { "baseline": "5.2.0", "port-version": 0 }, "vcpkg-tool-gn": { - "baseline": "2022-04-16", - "port-version": 1 + "baseline": "2024-02-22", + "port-version": 0 }, "vcpkg-tool-gyp-next": { "baseline": "2022-10-15", @@ -8857,8 +9109,8 @@ "port-version": 1 }, "vcpkg-tool-meson": { - "baseline": "0.63", - "port-version": 0 + "baseline": "1.3.2", + "port-version": 2 }, "vcpkg-tool-mozbuild": { "baseline": "4.0.2", @@ -8880,6 +9132,14 @@ "baseline": "2.02.00", "port-version": 0 }, + "veigar": { + "baseline": "1.0", + "port-version": 0 + }, + "velodyne-decoder": { + "baseline": "3.0.0", + "port-version": 1 + }, "verdict": { "baseline": "1.4.0", "port-version": 0 @@ -8901,13 +9161,17 @@ "port-version": 0 }, "vk-bootstrap": { - "baseline": "0.7", + "baseline": "1.3.279", "port-version": 1 }, "vkfft": { "baseline": "1.2.31", "port-version": 0 }, + "vladimirshaleev-ipaddress": { + "baseline": "1.0.1", + "port-version": 0 + }, "vlfeat": { "baseline": "2020-07-10", "port-version": 3 @@ -8917,7 +9181,7 @@ "port-version": 1 }, "volk": { - "baseline": "1.3.250", + "baseline": "1.3.280.0", "port-version": 0 }, "vowpal-wabbit": { @@ -8929,43 +9193,67 @@ "port-version": 2 }, "vsg": { - "baseline": "1.0.9", + "baseline": "1.1.2", + "port-version": 0 + }, + "vsgimgui": { + "baseline": "0.1.0", "port-version": 0 }, "vsgxchange": { "baseline": "1.0.5", - "port-version": 0 + "port-version": 1 }, "vtk": { - "baseline": "9.2.0-pv5.11.0", - "port-version": 10 + "baseline": "9.3.0-pv5.12.0", + "port-version": 3 }, "vtk-dicom": { "baseline": "0.8.14", "port-version": 2 }, "vtk-m": { - "baseline": "1.9.0", - "port-version": 2 + "baseline": "2.1.0", + "port-version": 0 }, "vulkan": { - "baseline": "1.1.82.1", - "port-version": 6 + "baseline": "2023-12-17", + "port-version": 0 }, "vulkan-headers": { - "baseline": "1.3.260", + "baseline": "1.3.280.0", "port-version": 0 }, "vulkan-hpp": { "baseline": "deprecated", "port-version": 0 }, + "vulkan-loader": { + "baseline": "1.3.280.0", + "port-version": 0 + }, "vulkan-memory-allocator": { "baseline": "3.0.1", - "port-version": 3 + "port-version": 4 }, "vulkan-memory-allocator-hpp": { "baseline": "3.0.1.1", + "port-version": 1 + }, + "vulkan-sdk-components": { + "baseline": "1.3.280.0", + "port-version": 0 + }, + "vulkan-tools": { + "baseline": "1.3.280.0", + "port-version": 0 + }, + "vulkan-utility-libraries": { + "baseline": "1.3.280.0", + "port-version": 0 + }, + "vulkan-validationlayers": { + "baseline": "1.3.280.0", "port-version": 0 }, "vvenc": { @@ -8974,18 +9262,18 @@ }, "vxl": { "baseline": "2.0.2", - "port-version": 4 + "port-version": 6 }, "wampcc": { "baseline": "2019-09-04", "port-version": 5 }, "wangle": { - "baseline": "2023.10.02.00", + "baseline": "2024.05.06.00", "port-version": 0 }, "wasmedge": { - "baseline": "0.12.1", + "baseline": "0.13.5", "port-version": 1 }, "wavelib": { @@ -8994,7 +9282,7 @@ }, "wavpack": { "baseline": "5.6.0", - "port-version": 0 + "port-version": 1 }, "wayland": { "baseline": "1.21.0", @@ -9013,7 +9301,7 @@ "port-version": 3 }, "webview2": { - "baseline": "1.0.2088.41", + "baseline": "1.0.2277.86", "port-version": 0 }, "wepoll": { @@ -9029,7 +9317,7 @@ "port-version": 2 }, "wil": { - "baseline": "2023-10-28", + "baseline": "2024-01-22", "port-version": 0 }, "wildmidi": { @@ -9053,7 +9341,7 @@ "port-version": 0 }, "winreg": { - "baseline": "6.1.0", + "baseline": "6.2.0", "port-version": 0 }, "winsock2": { @@ -9081,8 +9369,8 @@ "port-version": 0 }, "wolfssl": { - "baseline": "5.6.4", - "port-version": 1 + "baseline": "5.7.0", + "port-version": 0 }, "wolftpm": { "baseline": "2.7.0", @@ -9105,8 +9393,8 @@ "port-version": 0 }, "wt": { - "baseline": "4.9.1", - "port-version": 2 + "baseline": "4.10.4", + "port-version": 1 }, "wtl": { "baseline": "10.0.10320", @@ -9121,16 +9409,16 @@ "port-version": 0 }, "wxwidgets": { - "baseline": "3.2.3", - "port-version": 0 + "baseline": "3.2.4", + "port-version": 2 }, "wyhash": { - "baseline": "2023-01-25", + "baseline": "2023-12-03", "port-version": 0 }, "x-plane": { - "baseline": "3.0.3", - "port-version": 2 + "baseline": "4.0.1", + "port-version": 0 }, "x264": { "baseline": "0.164.3107", @@ -9141,7 +9429,7 @@ "port-version": 0 }, "x86-simd-sort": { - "baseline": "3.0", + "baseline": "4.0", "port-version": 0 }, "xapian": { @@ -9150,7 +9438,7 @@ }, "xaudio2redist": { "baseline": "1.2.11", - "port-version": 1 + "port-version": 2 }, "xbitmaps": { "baseline": "1.1.2", @@ -9174,7 +9462,7 @@ }, "xcb-proto": { "baseline": "1.14.1", - "port-version": 1 + "port-version": 2 }, "xcb-render-util": { "baseline": "0.3.10", @@ -9186,7 +9474,7 @@ }, "xcb-util-errors": { "baseline": "1.0.1", - "port-version": 0 + "port-version": 1 }, "xcb-util-m4": { "baseline": "2022-01-24", @@ -9197,8 +9485,8 @@ "port-version": 1 }, "xerces-c": { - "baseline": "3.2.4", - "port-version": 3 + "baseline": "3.2.5", + "port-version": 0 }, "xeus": { "baseline": "0.24.3", @@ -9217,11 +9505,11 @@ "port-version": 0 }, "xmlsec": { - "baseline": "1.3.1", - "port-version": 2 + "baseline": "1.3.3", + "port-version": 0 }, "xnnpack": { - "baseline": "2022-02-17", + "baseline": "2022-12-22", "port-version": 0 }, "xorg-macros": { @@ -9249,11 +9537,11 @@ "port-version": 2 }, "xsimd": { - "baseline": "12.0.0", + "baseline": "12.1.1", "port-version": 0 }, "xtensor": { - "baseline": "0.24.7", + "baseline": "0.25.0", "port-version": 0 }, "xtensor-blas": { @@ -9269,7 +9557,7 @@ "port-version": 1 }, "xtl": { - "baseline": "0.7.5", + "baseline": "0.7.7", "port-version": 0 }, "xtrans": { @@ -9289,8 +9577,8 @@ "port-version": 1 }, "yara": { - "baseline": "4.3.2", - "port-version": 1 + "baseline": "4.5.0", + "port-version": 0 }, "yas": { "baseline": "7.1.0", @@ -9313,19 +9601,19 @@ "port-version": 0 }, "yoga": { - "baseline": "2.0.0", + "baseline": "3.0.2", "port-version": 0 }, "yomm2": { - "baseline": "1.4.0", - "port-version": 1 + "baseline": "1.5.1", + "port-version": 0 }, "yyjson": { "baseline": "0.8.0", "port-version": 0 }, "z3": { - "baseline": "4.12.2", + "baseline": "4.13.0", "port-version": 0 }, "z4kn4fein-semver": { @@ -9341,7 +9629,7 @@ "port-version": 4 }, "zeromq": { - "baseline": "2023-06-20", + "baseline": "4.3.5", "port-version": 1 }, "zfp": { @@ -9361,7 +9649,7 @@ "port-version": 3 }, "zlib": { - "baseline": "1.3", + "baseline": "1.3.1", "port-version": 0 }, "zlib-ng": { @@ -9369,8 +9657,8 @@ "port-version": 0 }, "zlmediakit": { - "baseline": "2023-08-12", - "port-version": 0 + "baseline": "2024-03-30", + "port-version": 1 }, "zoe": { "baseline": "3.0", @@ -9393,8 +9681,8 @@ "port-version": 0 }, "zstd": { - "baseline": "1.5.5", - "port-version": 2 + "baseline": "1.5.6", + "port-version": 0 }, "zstr": { "baseline": "1.0.7", @@ -9434,15 +9722,15 @@ }, "zydis": { "baseline": "4.0.0", - "port-version": 1 + "port-version": 2 }, "zyre": { "baseline": "2019-07-07", "port-version": 5 }, "zziplib": { - "baseline": "0.13.72", - "port-version": 3 + "baseline": "0.13.73", + "port-version": 0 } } } diff --git a/vcpkg/versions/d-/dpp.json b/vcpkg/versions/d-/dpp.json index 57360900c7..d5b64f737f 100644 --- a/vcpkg/versions/d-/dpp.json +++ b/vcpkg/versions/d-/dpp.json @@ -1,5 +1,10 @@ { "versions": [ + { + "git-tree": "2224384b8c94dc8993bee072c9f506ef17e6eef4", + "version": "10.0.30", + "port-version": 0 + }, { "git-tree": "57e513b7c5b9b43418e0be4bdbb739359878baaa", "version": "10.0.29",