Skip to content

Update usercount shield in READMEs, then sync to adamlui/ai-apps + adamlui/userscripts #17

Update usercount shield in READMEs, then sync to adamlui/ai-apps + adamlui/userscripts

Update usercount shield in READMEs, then sync to adamlui/ai-apps + adamlui/userscripts #17

name: Update usercount/clones shields in READMEs, sync to adamlui/chatgpt-apps + adamlui/userscripts
on:
schedule:
- cron: "42 5 * * 0,2,4" # every Sun/Tue/Thu @ 6:23a
jobs:
update-usercount-clones-shields:
runs-on: ubuntu-latest
steps:
- name: Checkout adamlui/chatgpt-auto-refresh
uses: actions/checkout@v4
with:
token: ${{ secrets.REPO_SYNC_PAT }}
repository: adamlui/chatgpt-auto-refresh
path: adamlui/chatgpt-auto-refresh
- name: Checkout adamlui/chatgpt-apps
uses: actions/checkout@v4
with:
token: ${{ secrets.REPO_SYNC_PAT }}
repository: adamlui/chatgpt-apps
path: adamlui/chatgpt-apps
- name: Checkout adamlui/userscripts
uses: actions/checkout@v4
with:
token: ${{ secrets.REPO_SYNC_PAT }}
repository: adamlui/userscripts
path: adamlui/userscripts
- name: Fetch/sum user + clone counts
id: get-stats
run: |
expand_num() { # expand nums abbreviated w/ 'k' or 'm' suffix to integers
local num=$(echo "$1" | tr '[:upper:]' '[:lower:]') # convert to lowercase
if [[ $num =~ k$ ]] ; then
num="${num%k}" # remove 'k' suffix
num=$(awk "BEGIN { printf \"%.0f\", $num * 1000 }") # multiply by 1000
elif [[ $num =~ m$ ]] ; then
num="${num%m}" # remove 'm' suffix
num=$(awk "BEGIN { printf \"%.0f\", $num * 1000000 }") # multiply by 1000000
fi ; echo "$num"
}
format_total() {
local num=$1 ; first_digit="${num:0:1}" second_digit="${num:1:1}"
second_digit_rounded=$(( second_digit < 5 ? 0 : 5 ))
if (( num >= 1000000000 )) ; then # 1B+ w/ one decimal place
formatted_num="$(( num / 1000000000 ))"
remainder=$(( (num % 1000000000) / 100000000 ))
if (( remainder != 0 )) ; then formatted_num+=".$remainder" ; fi
formatted_num+="B+"
elif (( num >= 10000000 )) ; then # abbr 10,000,000+ to 999,000,000+
formatted_num=$(printf "%'.f+" $((( num / 1000000 ) * 1000000 )))
elif (( num >= 1000000 )) ; then # abbr 1,000,000+ to 9,900,000+
formatted_num="${first_digit},${second_digit}00,000+"
elif (( num >= 100000 )) ; then # abbr 100,000+ to 950,000+
formatted_num="${first_digit}${second_digit_rounded}0,000+"
elif (( num >= 10000 )) ; then # abbr 10,000+ to 90,000+
formatted_num="${first_digit}0,000+"
elif (( num >= 1000 )) ; then # abbr 1K to 9.9K
formatted_num="$(( num / 1000 ))"
remainder=$(( (num % 1000) / 100 ))
if (( remainder != 0 )) ; then formatted_num+=".$remainder" ; fi
formatted_num+="K"
else formatted_num="$num" ; fi # preserve <1K as is
echo "$formatted_num"
}
# Fetch Greasy Fork total user count
base_url="https://img.shields.io/greasyfork/dt/"
script_id="466789"
gf_users=$(curl -s "$base_url$script_id" |
sed -n 's/.*<title>installs: \([0-9.k]\+\)*<\/title>.*/\1/Ip')
gf_users=$(expand_num "$gf_users")
echo "Greasy Fork users: $gf_users"
# Fetch/calculate git clone count
biweekly_clones=$(curl -sSL \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.REPO_SYNC_PAT }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
"https://api.github.com/repos/adamlui/chatgpt-auto-refresh/traffic/clones" |
sed -n -E '0,/.*"count": ([0-9]+).*/ s//\1/p')
total_clones=$((biweekly_clones * 2))
echo "Biweekly git clones: $biweekly_clones"
echo -e "\n-----\nTotal monthly git clones: $total_clones\n-----\n"
# Format totals
formatted_total_users=$(format_total "$gf_users")
echo "Formatted total users: $formatted_total_users"
formatted_total_clones=$(format_total "$total_clones")
echo "Formatted total monthly git clones: $formatted_total_clones"
# Expose as outputs for update step next
echo "total_users=$formatted_total_users" >> $GITHUB_OUTPUT
echo "total_clones=$formatted_total_clones" >> $GITHUB_OUTPUT
- name: Update README shields
id: update-shields
run: |
cd ${{ github.workspace }}/adamlui/chatgpt-auto-refresh
total_users="${{ steps.get-stats.outputs.total_users }}"
total_clones="${{ steps.get-stats.outputs.total_clones }}"
# Update usercount shields
if [ "$total_users" == "0" ] ; then echo "Error getting total usercount"
else # perform update
for readme in $(find . -name "README.md") ; do
old_readme=$(<"$readme")
sed -i -E "s|(badge/[^-]+-)[0-9.,km+]+([^?]+\?logo=weightsandbiases)|\1$total_users\2|gI" "$readme"
new_readme=$(<"$readme")
if [ "$old_readme" != "$new_readme" ] ; then users_updated=true ; fi
done
if [ "$users_updated" = true ] ; then echo "Usercount shields updated to $total_users"
else echo "Usercount shields already up-to-date" ; fi
fi
# Update git clones shield
if [ "$total_clones" == "0" ] ; then echo "Error getting total git clones"
else # perform update
for readme in $(find . -name "README.md") ; do
old_readme=$(<"$readme")
sed -i -E "s|(badge/[^-]+-)[0-9.,km+]+(/[^?]+\?logo=github)|\1$total_clones\2|gI" "$readme"
new_readme=$(<"$readme")
if [ "$old_readme" != "$new_readme" ] ; then clones_updated=true ; fi
done
if [ "$clones_updated" = true ] ; then echo "Git clones shields updated to $total_clones"
else echo "Git clones shields already up-to-date" ; fi
fi
# Define commit msg intro for push steps
if [ "$users_updated" = true ] && [ "$clones_updated" = true ] ; then
multi_shield_types_updated=true ; fi
commit_msg_intro="Updated "
[ "$users_updated" = true ] && commit_msg_intro+="usercount"
[ "$multi_shield_types_updated" = true ] && commit_msg_intro+="/"
[ "$clones_updated" = true ] && commit_msg_intro+="clones"
commit_msg_intro+=" shield counters"
echo "commit_msg_intro=$commit_msg_intro" >> $GITHUB_OUTPUT # expose as output
- name: Sync / to adamlui/chatgpt-apps/chatgpt-auto-refresh/
run: |
rsync -avhr --delete --exclude={'.*','eslint*','package*json'} \
${{ github.workspace }}/adamlui/chatgpt-auto-refresh/ \
${{ github.workspace }}/adamlui/chatgpt-apps/chatgpt-auto-refresh/
- name: Sync /greasemonkey/ to adamlui/userscripts/chatgpt/chatgpt-auto-refresh/
run: |
rsync -avhr --delete \
${{ github.workspace }}/adamlui/chatgpt-auto-refresh/greasemonkey/ \
${{ github.workspace }}/adamlui/userscripts/chatgpt/chatgpt-auto-refresh/
- name: Init committer name/email
run: |
git config --global user.name "kudo-sync-bot"
git config --global user.email "auto-sync@kudoai.com"
- name: Push changes to adamlui/chatgpt-auto-refresh
run: |
cd ${{ github.workspace }}/adamlui/chatgpt-auto-refresh
git add .
git commit -n -m "${{ steps.update-shields.outputs.commit_msg_intro }} in READMEs" || true
git push
- name: Push changes to adamlui/chatgpt-apps
run: |
cd ${{ github.workspace }}/adamlui/chatgpt-apps
git add .
git commit -n -m "${{ steps.update-shields.outputs.commit_msg_intro }} in ChatGPT Auto Refresh READMEs" || true
git push
- name: Push changes to adamlui/userscripts
run: |
cd ${{ github.workspace }}/adamlui/userscripts
git add .
git commit -n -m "${{ steps.update-shields.outputs.commit_msg_intro }} in ChatGPT Auto Refresh READMEs" || true
git push