name: Generate RULE-SET for Premium Edition of Clash
on:
  workflow_dispatch:
  schedule:
    - cron: "30 22 * * *"
  push:
    branches:
      - master
    paths-ignore:
      - "**/README.md"
permissions:
  contents: write
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Set variables
        run: |
          echo "RELEASE_NAME=Released on $(date +%Y%m%d%H%M)" >> $GITHUB_ENV
          echo "TAG_NAME=$(date +%Y%m%d%H%M)" >> $GITHUB_ENV
          echo "custom_icloud=https://raw.githubusercontent.com/Loyalsoldier/domain-list-custom/release/icloud.txt" >> $GITHUB_ENV
          echo "custom_tld_not_cn=https://raw.githubusercontent.com/Loyalsoldier/domain-list-custom/release/tld-!cn.txt" >> $GITHUB_ENV
          echo "custom_private=https://raw.githubusercontent.com/Loyalsoldier/domain-list-custom/release/private.txt" >> $GITHUB_ENV
          echo "Loyalsoldier_reject=https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/reject-list.txt" >> $GITHUB_ENV
          echo "Loyalsoldier_proxy=https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/proxy-list.txt" >> $GITHUB_ENV
          echo "Loyalsoldier_direct=https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/direct-list.txt" >> $GITHUB_ENV
          echo "Loyalsoldier_gfw=https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/gfw.txt" >> $GITHUB_ENV
          echo "Loyalsoldier_greatfire=https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/greatfire.txt" >> $GITHUB_ENV
          echo "felixonmars_apple=https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/apple.china.conf" >> $GITHUB_ENV
          echo "felixonmars_google=https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/google.china.conf" >> $GITHUB_ENV
          echo "cn_cidr=https://raw.githubusercontent.com/Loyalsoldier/geoip/release/text/cn.txt" >> $GITHUB_ENV
          echo "lan_cidr=https://raw.githubusercontent.com/Loyalsoldier/geoip/release/text/private.txt" >> $GITHUB_ENV
          echo "telegram_cidr=https://raw.githubusercontent.com/Loyalsoldier/geoip/release/text/telegram.txt" >> $GITHUB_ENV
          echo "ms_365=https://endpoints.office.com/endpoints/worldwide?NoIPv6=true&clientrequestid=f9279789-76dc-4fbc-b4d3-b806d90fa6bc" >> $GITHUB_ENV
        shell: bash

      - name: Checkout the "hidden" branch
        uses: actions/checkout@v6
        with:
          ref: hidden

      - name: Generate icloud.txt file
        run: |
          echo "payload:" > icloud.txt
          curl -sSL "${custom_icloud}" | grep -E "^(full|domain):" | awk -F ':' '{printf "  - |+.%s|\n", $2}' | sed "s/|/'/g" >> icloud.txt

      - name: Generate google.txt file
        run: |
          echo "payload:" > google.txt
          curl -sSL "${felixonmars_google}" | perl -ne '/^server=\/([^\/]+)\// && print "  - |+.$1|\n"' | sed "s/|/'/g" >> google.txt

      - name: Generate apple.txt file
        run: |
          echo "payload:" > apple.txt
          curl -sSL "${felixonmars_apple}" | perl -ne '/^server=\/([^\/]+)\// && print "  - |+.$1|\n"' | sed "s/|/'/g" >> apple.txt

      - name: Generate private.txt file
        run: |
          echo "payload:" > private.txt
          curl -sSL "${custom_private}" | awk -F ':' '/^full:/ {printf "  - |%s|\n", $2}' | sed "s/|/'/g" >> private.txt
          curl -sSL "${custom_private}" | awk -F ':' '/^domain:/ {printf "  - |+.%s|\n", $2}' | sed "s/|/'/g" >> private.txt

      - name: Generate direct.txt file
        run: |
          echo "payload:" > direct.txt
          curl -sSL "${Loyalsoldier_direct}" | grep -Ev "^(regexp|keyword):" | perl -ne '/^(full:)([-_a-zA-Z0-9]+(\.[-_a-zA-Z0-9]+)*)/ && print "  - |$2|\n"' | sed "s/|/'/g" >> direct.txt
          curl -sSL "${Loyalsoldier_direct}" | grep -Ev "^(regexp|keyword|full):" | perl -ne '/^(domain:)?([-_a-zA-Z0-9]+(\.[-_a-zA-Z0-9]+)*)/ && print "  - |+.$2|\n"' | sed "s/|/'/g" >> direct.txt

      - name: Generate proxy.txt file
        run: |
          echo "payload:" > proxy.txt
          curl -sSL "${Loyalsoldier_proxy}" | grep -Ev "^(regexp|keyword):" | perl -ne '/^(full:)([-_a-zA-Z0-9]+(\.[-_a-zA-Z0-9]+)*)/ && print "  - |$2|\n"' | sed "s/|/'/g" >> proxy.txt
          curl -sSL "${Loyalsoldier_proxy}" | grep -Ev "^(regexp|keyword|full):" | perl -ne '/^(domain:)?([-_a-zA-Z0-9]+(\.[-_a-zA-Z0-9]+)*)/ && print "  - |+.$2|\n"' | sed "s/|/'/g" >> proxy.txt

      - name: Generate reject.txt file
        run: |
          echo "payload:" > reject.txt
          curl -sSL "${Loyalsoldier_reject}" | grep -Ev "^(regexp|keyword):" | perl -ne '/^(domain:|full:)?([-_a-zA-Z0-9]+(\.[-_a-zA-Z0-9]+)*)/ && print "  - |+.$2|\n"' | sed "s/|/'/g" >> reject.txt

      - name: Generate gfw.txt file
        run: |
          echo "payload:" > gfw.txt
          curl -sSL "${Loyalsoldier_gfw}" | grep -Ev "^(regexp|keyword):" | perl -ne '/^(domain:|full:)?([-_a-zA-Z0-9]+(\.[-_a-zA-Z0-9]+)*)/ && print "  - |+.$2|\n"' | sed "s/|/'/g" >> gfw.txt

      - name: Generate greatfire.txt file
        run: |
          echo "payload:" > greatfire.txt
          curl -sSL "${Loyalsoldier_greatfire}" | grep -Ev "^(regexp|keyword):" | perl -ne '/^(domain:|full:)?([-_a-zA-Z0-9]+(\.[-_a-zA-Z0-9]+)*)/ && print "  - |+.$2|\n"' | sed "s/|/'/g" >> greatfire.txt

      - name: Generate tld-not-cn.txt file
        run: |
          echo "payload:" > tld-not-cn.txt
          curl -sSL "${custom_tld_not_cn}" | perl -ne '/^domain:([-_a-zA-Z0-9]+(\.[-_a-zA-Z0-9]+)*)/ && print "  - |+.$1|\n"' | sed "s/|/'/g" >> tld-not-cn.txt

      - name: Generate cncidr.txt file
        run: |
          echo "payload:" > cncidr.txt
          curl -sSL "${cn_cidr}" | perl -ne '/(.+\/\d+)/ && print "  - |$1|\n"' | sed "s/|/'/g" >> cncidr.txt

      - name: Generate telegramcidr.txt file
        run: |
          echo "payload:" > telegramcidr.txt
          curl -sSL "${telegram_cidr}" | perl -ne '/(.+\/\d+)/ && print "  - |$1|\n"' | sed "s/|/'/g" >> telegramcidr.txt

      - name: Generate lancidr.txt file
        run: |
          echo "payload:" > lancidr.txt
          curl -sSL "${lan_cidr}" | perl -ne '/(.+\/\d+)/ && print "  - |$1|\n"' | sed "s/|/'/g" >> lancidr.txt

      - name: Generate ms-365 and ms-365-instant files
        run: |
          echo "payload:" > ms-365.txt
          echo "payload:" > ms-365-instant.txt
          echo "payload:" > ms-365cidr.txt
          echo "payload:" > ms-365-instantcidr.txt
          curl -sSL "${ms_365}" | python3 ./.github/ms_365_generator.py

      - name: temporary copy files for mrs conversion
        run: |
          cp ms/*.txt ./
          cp global-cloud-storage/*.txt ./
      
      - name: Convert txt rulesets to mrs
        run: ./.github/convert_mrs.sh

# todo: 优化这一坨屎山代码
      - name: Move files to publish directory
        run: |
          mkdir -p publish
          mkdir -p publish/txt
          cp -r global-cloud-storage ./publish/txt/
          cp -r ms ./publish/txt/
          mv ms-365.txt ms-365-instant.txt ms-365cidr.txt ms-365-instantcidr.txt ./publish/txt/ms/
          rm ms-auth.txt ms-common.txt ms-instant.txt DropBox.txt MEGA.txt onedrive.txt
          cp *.txt ./publish/txt/
          mkdir -p ./mrs/ms
          mv ./mrs/ms-365.mrs ./mrs/ms-365-instant.mrs ./mrs/ms-365cidr.mrs ./mrs/ms-365-instantcidr.mrs ./mrs/ms-auth.mrs ./mrs/ms-common.mrs ./mrs/ms-instant.mrs ./mrs/ms
          mkdir -p ./mrs/global-cloud-storage
          mv ./mrs/DropBox.mrs ./mrs/MEGA.mrs ./mrs/onedrive.mrs ./mrs/global-cloud-storage
          cp -r mrs ./publish/

      - name: Release and upload assets
        uses: softprops/action-gh-release@v3
        with:
          name: ${{ env.RELEASE_NAME }}
          tag_name: ${{ env.TAG_NAME }}
          draft: false
          prerelease: false
          files: |
            ./publish/txt/*.txt
            ./publish/txt/global-cloud-storage/*.txt
            ./publish/txt/ms/*.txt
            ./publish/mrs/*.mrs
            ./publish/mrs/ms/*.mrs
            ./publish/mrs/global-cloud-storage/*.mrs
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Git push assets to "release" branch
        run: |
          cd publish || exit 1
          git init
          git config --local user.name "github-actions[bot]"
          git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com"
          git checkout -b release
          git add .
          git commit -m "${{ env.RELEASE_NAME }}"
          git remote add origin "https://${{ github.actor }}:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}"
          git push -f origin release

      - name: Purge jsdelivr CDN
        run: |
          cd publish || exit 1
          for file in $(find . -type f -printf "%P\n"); do
            curl -i "https://purge.jsdelivr.net/gh/${{ github.repository }}@release/${file}"
          done
