name: Build Modules on: workflow_call: inputs: from_ci: type: boolean required: false default: true workflow_dispatch: jobs: run: permissions: write-all runs-on: ubuntu-latest steps: - uses: actions/setup-java@v4 with: distribution: "zulu" java-version: "17" - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 submodules: true - name: Update config if: ${{ inputs.from_ci }} run: | if git checkout origin/update build.md; then UPDATE_CFG=$(./build.sh config.toml --config-update) if [ "$UPDATE_CFG" ]; then echo "$UPDATE_CFG" > config.json fi fi - name: Get next version code id: next_ver_code env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | TAG=$(gh release list -L 1 | awk -F '\t' '{print $3}') if [ -z "$TAG" ]; then TAG=0; fi echo "NEXT_VER_CODE=$((TAG + 1))" >> $GITHUB_OUTPUT - name: Build modules/APKs run: if [ -f "config.json" ]; then ./build.sh config.json; else ./build.sh config.toml; fi env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_REPOSITORY: $GITHUB_REPOSITORY NEXT_VER_CODE: ${{ steps.next_ver_code.outputs.NEXT_VER_CODE }} - name: Get output id: get_output run: | DELIM="$(openssl rand -hex 8)" echo "BUILD_LOG<<${DELIM}" >> "$GITHUB_OUTPUT" cat build.md >> "$GITHUB_OUTPUT" echo "${DELIM}" >> "$GITHUB_OUTPUT" cp -f build.md build.tmp - name: Upload modules to release uses: svenstaro/upload-release-action@v2 with: body: ${{ steps.get_output.outputs.BUILD_LOG }} repo_token: ${{ secrets.GITHUB_TOKEN }} file: ./build/* release_name: ReVanced tag: ${{ steps.next_ver_code.outputs.NEXT_VER_CODE }} file_glob: true overwrite: true - name: Update changelog and Magisk update json id: update_config run: | git checkout -f update || git switch --discard-changes --orphan update cp -f build.tmp build.md get_update_json() { echo "{ \"version\": \"$1\", \"versionCode\": ${{ steps.next_ver_code.outputs.NEXT_VER_CODE }}, \"zipUrl\": \"$2\", \"changelog\": \"https://raw.githubusercontent.com/$GITHUB_REPOSITORY/update/build.md\" }" } cd build || { echo "build folder not found"; exit 1; } for OUTPUT in *magisk*.zip; do [ "$OUTPUT" = "*magisk*.zip" ] && continue ZIP_S=$(unzip -p "$OUTPUT" module.prop) if ! UPDATE_JSON=$(echo "$ZIP_S" | grep updateJson); then continue; fi UPDATE_JSON="${UPDATE_JSON##*/}" VER=$(echo "$ZIP_S" | grep version=) VER="${VER##*=}" DLURL="$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/releases/download/${{ steps.next_ver_code.outputs.NEXT_VER_CODE }}/${OUTPUT}" get_update_json "$VER" "$DLURL" >"../$UPDATE_JSON" done cd .. find . -name "*-update.json" | grep . || : >dummy-update.json - uses: stefanzweifel/git-auto-commit-action@v5 with: branch: update skip_checkout: true file_pattern: build.md *-update.json commit_message: Bump version ${{ steps.next_ver_code.outputs.NEXT_VER_CODE }} - name: Report to Telegram env: TG_TOKEN: ${{ secrets.TG_TOKEN }} if: env.TG_TOKEN != null run: | cd build || { echo "build folder not found"; exit 1; } TG_CHAT="-1002417137882" NL=$'\n' APKS="" MODULES="" for OUTPUT in *; do DL_URL="$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/releases/download/${{ steps.next_ver_code.outputs.NEXT_VER_CODE }}/${OUTPUT}" if [[ $OUTPUT = *.apk ]]; then APKS+="${NL}📦[${OUTPUT}](${DL_URL})" elif [[ $OUTPUT = *.zip ]]; then MODULES+="${NL}📦[${OUTPUT}](${DL_URL})" fi done MODULES=${MODULES#"$NL"} APKS=${APKS#"$NL"} BODY="$(sed 's/^\* \*\*/↪ \*\*/g; s/^\* `/↪ \*\*/g; s/`/\*/g; s/^\* /\↪/g; s/\*\*/\*/g; s/###//g; s/^- /↪ /g; /^==/d;' ../build.md)" MSG="*New build!* ${BODY} *▼ Download Links:* Modules: ${MODULES} APKs: ${APKS} " echo "'$MSG'" MSG=${MSG:0:9450} POST="https://api.telegram.org/bot${TG_TOKEN}/sendMessage" curl -X POST --data-urlencode "parse_mode=Markdown" --data-urlencode "disable_web_page_preview=true" --data-urlencode "text=${MSG}" --data-urlencode "chat_id=${TG_CHAT}" "$POST" - name: Report to Discord env: DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} if: env.DISCORD_WEBHOOK_URL != null run: | cd build || { echo "build folder not found"; exit 1; } NL=$'\n' APKS="" MODULES="" for OUTPUT in *; do DL_URL="$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/releases/download/${{ steps.next_ver_code.outputs.NEXT_VER_CODE }}/${OUTPUT}" if [[ $OUTPUT = *.apk ]]; then APKS+="${NL}- [${OUTPUT}](${DL_URL})" elif [[ $OUTPUT = *.zip ]]; then MODULES+="${NL}- [${OUTPUT}](${DL_URL})" fi done MODULES=${MODULES#"$NL"} APKS=${APKS#"$NL"} BODY="$(sed 's/^\* \*\*/- \*\*/g; s/^\* `/- \*\*/g; s/`/\*/g; s/^\* /\-/g; s/\*\*/\*/g; s/###//g; s/^- /- /g; /^==/d;' ../build.md)" MSG="**New build is ready!** ${BODY} **Download Links:** **Modules:** ${MODULES} **APKs:** ${APKS} " # Function to split messages properly by ensuring correct Markdown formatting send_discord_message() { local message="$1" while [ ${#message} -gt 0 ]; do # Attempt to find a safe split point within 2000 characters local chunk="${message:0:2000}" local cutoff=$(echo "$chunk" | awk '{print length($0) - length($NF)}') # Find last space/newline within chunk if [ $cutoff -gt 0 ] && [ $cutoff -lt 2000 ]; then # Use safe cutoff point if available chunk="${message:0:$cutoff}" message="${message:$cutoff}" else # Default to cutting at the 2000-character limit chunk="${message:0:2000}" message="${message:2000}" fi # Remove leading/trailing whitespace in the chunk and message chunk=$(echo "$chunk" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') message=$(echo "$message" | sed 's/^[[:space:]]*//') # Send the chunk to Discord curl -X POST -H "Content-Type: application/json" \ -d "$(jq -n --arg content "$chunk" '{content: $content}')" \ "$DISCORD_WEBHOOK_URL" done } send_discord_message "$MSG"