name: Generate v2ray routing rules

on:
  workflow_dispatch:
    inputs:
      PRE_RELEASE:
        description: "Set as pre-release"
        required: false
        type: boolean
        default: false
  schedule:
    - cron: "40 4 * * *"

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Iran-v2ray-rules repository
        uses: actions/checkout@v4

      - name: Checkout geolite2 branch
        uses: actions/checkout@v4
        with:
          ref: geolite2
          path: geolite2

      - name: Checkout ip2location branch
        uses: actions/checkout@v4
        with:
          ref: ip2location
          path: ip2location
      
      - name: Checkout redundant branch
        uses: actions/checkout@v4
        with:
          ref: redundant
          path: redundant

      - name: Checkout ito.gov.ir-Mirror repository
        uses: actions/checkout@v4
        with:
          repository: Chocolate4U/ito.gov.ir-Mirror
          path: ito.gov.ir-Mirror
      
      - name: Checkout domain-list-community repository
        uses: actions/checkout@v4
        with:
          repository: v2fly/domain-list-community
          path: v2ray-geosite

      - name: Checkout ipranges repository
        uses: actions/checkout@v4
        with:
          repository: lord-alfred/ipranges
          path: ipranges

      - name: Download geo-tools
        run: gh release download -p "*.tar.gz" --repo Chocolate4U/geo-tools
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Set ENV variables
        run: |
          echo "RELEASE_NAME=$(date +%Y%m%d%H%M)" >> $GITHUB_ENV
          echo "TAG_NAME=$(date +%Y%m%d%H%M)" >> $GITHUB_ENV
          echo "RELEASE_DATE=$(date +'%A %F %T %Z')" >> $GITHUB_ENV

      - name: Install dependencies
        run: |
          sudo apt-get update
          sudo apt-get install dos2unix idn2

      - name: Create domains and release directories
        run: mkdir domains release

      - name: Get messengers IP list
        run: awk -F"," '{print $2}' ./ito.gov.ir-Mirror/data/Messengers.csv | sed -e '/IP\|\"/d' -e '/^$/d' -e '1d' > messengers-ip.txt

      - name: Get domestic CDNs IP list
        run: |
          chmod +x ./scripts/generate-domestic-cdn-ips.sh
          ./scripts/generate-domestic-cdn-ips.sh
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Generate ir domains list
        run: |
          chmod +x ./scripts/generate-ir-domains.sh
          ./scripts/generate-ir-domains.sh
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Generate ad domains list
        run: |
          chmod +x ./scripts/generate-ad-domains.sh
          ./scripts/generate-ad-domains.sh
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Generate malware list
        run: |
          chmod +x ./scripts/generate-malware-domains-ips.sh
          ./scripts/generate-malware-domains-ips.sh
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Generate phishing list
        run: |
          chmod +x ./scripts/generate-phishing-domains-ips.sh
          ./scripts/generate-phishing-domains-ips.sh
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Generate cryptominers domains list
        run: |
          chmod +x ./scripts/generate-cryptominer-domains.sh
          ./scripts/generate-cryptominer-domains.sh
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Generate Social Media domains list
        run: |
          chmod +x ./scripts/generate-social-media-domains.sh
          ./scripts/generate-social-media-domains.sh
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Generate nsfw domains list
        run: |
          chmod +x ./scripts/generate-nsfw-domains.sh
          ./scripts/generate-nsfw-domains.sh
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Generate sanctioned domains list
        run: |
          chmod +x ./scripts/generate-sanctioned-domains.sh
          ./scripts/generate-sanctioned-domains.sh
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Generate geoip files
        run: |
          tar -xvzf geoip.tar.gz
          rm -rf ip2location/.git
          ./geoip convert -c config.json
          cp output/dat/geoip.dat output/dat/geoip-lite.dat output/dat/security-ip.dat output/dat/geoip-services.dat release
          cp output/maxmind/Country.mmdb output/maxmind/Country-lite.mmdb output/maxmind/Security-ip.mmdb output/maxmind/Services.mmdb release
          cp -fpPR output/text release

      - name: Verify *.mmdb files
        run: |
          tar -xvzf mmdbverify.tar.gz
          ./mmdbverify -file release/Country.mmdb
          ./mmdbverify -file release/Country-lite.mmdb
          ./mmdbverify -file release/Security-ip.mmdb
          ./mmdbverify -file release/Services.mmdb

      - name: Generate geosite.dat, geosite-lite.dat and security.dat files
        run: |
          tar -xvzf geosite.tar.gz

          cp ./domains/ir.txt ./v2ray-geosite/data/ir
          cp ./domains/ir-lite.txt ./v2ray-geosite/data/category-ir
          cp ./domains/ads.txt ./v2ray-geosite/data/ads
          cp ./domains/category-ads-all.txt ./v2ray-geosite/data/category-ads-all
          cp ./domains/malware.txt ./v2ray-geosite/data/malware
          cp ./domains/phishing.txt ./v2ray-geosite/data/phishing
          cp ./domains/cryptominers.txt ./v2ray-geosite/data/cryptominers
          cp ./domains/social.txt ./v2ray-geosite/data/social
          cp ./domains/nsfw.txt ./v2ray-geosite/data/nsfw
          cp ./domains/sanctioned.txt ./v2ray-geosite/data/sanctioned

          ./geosite --datapath=./v2ray-geosite/data --outputdir=./release --outputname=geosite.dat --exportlists=ir,category-ir,ads,category-ads-all,malware,phishing,cryptominers,social,nsfw,sanctioned

          mkdir datalite
          cp ./domains/ir.txt datalite/ir
          cp ./domains/ir-lite.txt datalite/category-ir
          cp ./domains/ads.txt datalite/ads
          ./geosite --datapath=datalite --outputdir=./release --outputname=geosite-lite.dat
          cp ./release/category-ir.txt ./release/ir-lite.txt

          mkdir security
          cp ./domains/category-ads-all.txt security/category-ads-all
          cp ./domains/malware.txt security/malware
          cp ./domains/phishing.txt security/phishing
          cp ./domains/cryptominers.txt security/cryptominers
          ./geosite --datapath=security --outputdir=./release --outputname=security.dat

      - name: Generate sha256sum
        run: |
          sha256sum release/geoip.dat > release/geoip.dat.sha256sum
          sha256sum release/geoip-lite.dat > release/geoip-lite.dat.sha256sum
          sha256sum release/security-ip.dat > release/security-ip.dat.sha256sum
          sha256sum release/geoip-services.dat > release/geoip-services.dat.sha256sum
          sha256sum release/Country.mmdb > release/Country.mmdb.sha256sum
          sha256sum release/Country-lite.mmdb > release/Country-lite.mmdb.sha256sum
          sha256sum release/Security-ip.mmdb > release/Security-ip.mmdb.sha256sum
          sha256sum release/Services.mmdb > release/Services.mmdb.sha256sum
          sha256sum release/geosite.dat > release/geosite.dat.sha256sum
          sha256sum release/geosite-lite.dat > release/geosite-lite.dat.sha256sum
          sha256sum release/security.dat > release/security.dat.sha256sum

      - name: Generate Release Notes
        run: |
          echo "* Updated on ${{ env.RELEASE_DATE }}" > RELEASE_NOTES

      - name: Push assets to release branch
        if: ${{ !inputs.PRE_RELEASE }}
        run: |
          cd release || 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 cache
        if: ${{ !inputs.PRE_RELEASE }}
        run: |
          cd release || exit 1
          for file in $(ls); do
            curl -i "https://purge.jsdelivr.net/gh/${{ github.repository }}@release/${file}"
          done

      - name: Release and upload assets
        uses: softprops/action-gh-release@v2
        with:
          name: ${{ env.RELEASE_NAME }}
          tag_name: ${{ env.TAG_NAME }}
          body_path: RELEASE_NOTES
          draft: false
          prerelease: ${{ inputs.PRE_RELEASE }}
          files: |
            release/*.dat
            release/*.mmdb
            release/*.sha256sum
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Clean older releases
        if: ${{ !inputs.PRE_RELEASE }}
        uses: dev-drprasad/delete-older-releases@v0.3.4
        with:
          keep_latest: 7
          delete_tags: true
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
