diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 37da5e5..d0a7ca2 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -40,13 +40,11 @@ jobs: - name: Find Skin Repositories for all users id: find_skins - shell: bash run: | set -eo pipefail total_valid_entries=0 user_rows_file=$(mktemp) avatar_rows_file=$(mktemp) - trap 'rm -f "$user_rows_file" "$avatar_rows_file" temp_dir.json temp_readme.json' EXIT page=1 while :; do @@ -73,62 +71,70 @@ jobs: continue fi - echo "$repos_json" | jq -c '.[]' | xargs -P4 -I{} bash -c ' - repo_data="$1" - owner=$(echo "$repo_data" | jq -r ".owner.login") - repo=$(echo "$repo_data" | jq -r ".name") - html_url=$(echo "$repo_data" | jq -r ".html_url") + repos_count=$(echo "$repos_json" | jq 'length') + echo " 📦 Found $repos_count repos" + + if [ "$repos_count" -eq 0 ]; then + echo + continue + fi + + for j in $(seq 0 $((repos_count - 1))); do + owner=$(echo "$repos_json" | jq -r ".[$j].owner.login") + repo=$(echo "$repos_json" | jq -r ".[$j].name") + html_url=$(echo "$repos_json" | jq -r ".[$j].html_url") echo " → Repo: $owner/$repo" - dir_code=$(curl --connect-timeout 5 --max-time 10 --retry 3 --retry-delay 5 -s -w "%{http_code}" -o temp_dir.json \ + dir_code=$(curl --retry 3 --retry-delay 5 -s -w "%{http_code}" -o temp_dir.json \ -H "Authorization: token ${{ secrets.TOKEN }}" \ "$GITEA_API/repos/$owner/$repo/contents/Skins?_ts=$(date +%s)") if [ "$dir_code" != "200" ]; then - echo " ❌ Skipped: No Skins/ dir (HTTP $dir_code)" - exit 0 + echo " ❌ Skipped: No 'Skins/' directory found (HTTP $dir_code)" + continue fi - readme_code=$(curl --connect-timeout 5 --max-time 10 --retry 3 --retry-delay 5 -s -w "%{http_code}" -o temp_readme.json \ + readme_code=$(curl --retry 3 --retry-delay 5 -s -w "%{http_code}" -o temp_readme.json \ -H "Authorization: token ${{ secrets.TOKEN }}" \ "$GITEA_API/repos/$owner/$repo/contents/README.md?_ts=$(date +%s)") if [ "$readme_code" != "200" ]; then - echo " ❌ Skipped: No README.md (HTTP $readme_code)" - exit 0 + echo " ❌ Skipped: No README.md found to extract osuid (HTTP $readme_code)" + continue fi content=$(jq -r .content < temp_readme.json | base64 -d || echo "") - osu_id=$(echo "$content" | awk "/osuid:[ ]*[0-9]+/ { match(\$0, /[0-9]+/); print substr(\$0, RSTART, RLENGTH); exit }") + osu_id=$(echo "$content" | awk '/osuid:[ ]*[0-9]+/ { match($0, /[0-9]+/); print substr($0, RSTART, RLENGTH); exit }') if [ -z "$osu_id" ]; then - echo " ❌ Skipped: no osuid" - exit 0 + echo " ❌ Skipped: osuid not found in README" + continue fi - user_data=$(curl --connect-timeout 5 --max-time 10 --retry 3 --retry-delay 5 -s \ + user_data=$(curl --retry 3 --retry-delay 5 -s \ "https://osu.ppy.sh/api/get_user?k=${{ secrets.OSUAPIV1 }}&u=$osu_id&type=id&_ts=$(date +%s)") - if [ "$(echo "$user_data" | jq length)" -eq 0 ]; then - echo " ❌ Skipped: osu! API no data" - exit 0 + if [ "$(echo "$user_data" | jq 'length')" -eq 0 ]; then + echo " ❌ Skipped: osu! API returned no data for osuid $osu_id" + continue fi - pp_rank=$(echo "$user_data" | jq -r ".[0].pp_rank // \\"9999999\\"") - pp_country_rank=$(echo "$user_data" | jq -r ".[0].pp_country_rank // \\"-\\"") - username=$(echo "$user_data" | jq -r ".[0].username // \\"$owner\\"") + pp_rank=$(echo "$user_data" | jq -r '.[0].pp_rank // "9999999"') + pp_country_rank=$(echo "$user_data" | jq -r '.[0].pp_country_rank // "-"') + username=$(echo "$user_data" | jq -r '.[0].username // "'$owner'"') padded_rank=$(printf "%07d" "$pp_rank") - printf "%s|%s%s%sProfileSkins\\n" \ + printf "%s|%s%s%sProfileSkins\n" \ "$padded_rank" "$username" "$pp_rank" "$pp_country_rank" "$osu_id" "$html_url" >> "$user_rows_file" timestamp=$(( $(date +%s) / 86400 * 86400 )) - printf "%s|\\n" \ + printf "%s|\n" \ "$padded_rank" "$html_url" "$osu_id" "$timestamp" >> "$avatar_rows_file" - echo " ✅ Match: $username (Rank #$pp_rank)" - ' _ '{}' + echo " ✅ Match: $username (Rank #$pp_rank), repo contains Skins/ directory" + total_valid_entries=$((total_valid_entries + 1)) + done done page=$((page + 1)) done