Skip to content

Commit ed065cb

Browse files
authored
Merge pull request #12670 from ethereum/crowdin-leaderboard
fix: Crowdin leaderboard data fetching
2 parents 3aa6427 + 3ec8246 commit ed065cb

File tree

11 files changed

+59021
-381115
lines changed

11 files changed

+59021
-381115
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
name: Update Crowdin leaderboard data
2+
3+
on:
4+
schedule:
5+
- cron: "20 16 1 * *"
6+
workflow_dispatch:
7+
8+
jobs:
9+
create_pr:
10+
runs-on: ubuntu-latest
11+
steps:
12+
- name: Check out code
13+
uses: actions/checkout@v3
14+
15+
- name: Set up Node.js
16+
uses: actions/setup-node@v3
17+
with:
18+
node-version: 18
19+
20+
- name: Install dependencies
21+
run: yarn install
22+
23+
- name: Install ts-node
24+
run: yarn global add ts-node
25+
26+
- name: Set up git
27+
run: |
28+
git config --global user.email "[email protected]"
29+
git config --global user.name "GitHub Action"
30+
31+
- name: Generate timestamp and readable date
32+
id: date
33+
run: |
34+
echo "TIMESTAMP=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_ENV
35+
echo "READABLE_DATE=$(date +'%B %-d')" >> $GITHUB_ENV
36+
37+
- name: Fetch latest dev and create new branch
38+
run: |
39+
git fetch origin dev
40+
git checkout -b "automated-update-${{ env.TIMESTAMP }}" origin/dev
41+
42+
- name: Run script
43+
run: npx ts-node -O '{"module":"commonjs"}' ./src/scripts/crowdin/leaderboard/getLeaderboardReports.ts
44+
env:
45+
CROWDIN_API_KEY: ${{ secrets.CROWDIN_API_KEY }}
46+
CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}
47+
48+
- name: Commit and push
49+
run: |
50+
git add -A
51+
git commit -m "Update Crowdin leaderboard data"
52+
git push origin "automated-update-${{ env.TIMESTAMP }}"
53+
54+
- name: Create PR body
55+
run: |
56+
echo "This PR was automatically created to update Crowdin leaderboard data." > pr_body.txt
57+
echo "This workflows runs on the first of each month at 16:20 (UTC)." >> pr_body.txt
58+
echo "" >> pr_body.txt
59+
echo "Thank you to everyone contributing to translate ethereum.org ❤️" >> pr_body.txt
60+
61+
- name: Create Pull Request
62+
run: |
63+
gh auth login --with-token ${{ secrets.GITHUB_TOKEN }}
64+
gh pr create --base dev --head "automated-update-${{ env.TIMESTAMP }}" --title "Update translation leaderboard data from Crowdin - ${{ env.READABLE_DATE }}" --body-file pr_body.txt

src/components/TranslationLeaderboard.tsx

Lines changed: 17 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,11 @@ import {
1212
useRadioGroup,
1313
} from "@chakra-ui/react"
1414

15+
import type { CostLeaderboardData } from "@/lib/types"
16+
1517
import Emoji from "./Emoji"
1618
import Text from "./OldText"
1719

18-
export type TranslationLeaderboardProps = {
19-
monthData: any
20-
quarterData: any
21-
allTimeData: any
22-
}
23-
2420
const Button = (props) => {
2521
return (
2622
<ChakraButton
@@ -82,34 +78,13 @@ const RadioCard = (props) => {
8278
)
8379
}
8480

85-
const filterLeaderboardUsers = (item) => {
86-
const username = item.user.username.toLowerCase()
87-
const fullName = item.user.fullName?.toLowerCase() || ""
88-
89-
const excludedUsernames = new Set([
90-
"ethdotorg",
91-
"finnish_sandberg",
92-
"norwegian_sandberg",
93-
"swedish_sandberg",
94-
])
95-
96-
return (
97-
!excludedUsernames.has(username) &&
98-
!username.includes("lqs_") &&
99-
!username.includes("removed_user") &&
100-
!username.includes("aco_") &&
101-
!fullName.includes("aco_") &&
102-
!username.includes("aco-") &&
103-
!fullName.includes("aco-") &&
104-
!username.includes("acc_") &&
105-
!fullName.includes("acc_")
106-
)
107-
}
81+
const sortAndFilterData = (data: CostLeaderboardData[]) =>
82+
reverse(sortBy(data, ({ totalCosts }) => totalCosts))
10883

109-
const sortAndFilterData = (data) => {
110-
return reverse(sortBy(data, ({ user }) => user.totalCosts)).filter(
111-
filterLeaderboardUsers
112-
)
84+
type TranslationLeaderboardProps = {
85+
allTimeData: CostLeaderboardData[]
86+
monthData: CostLeaderboardData[]
87+
quarterData: CostLeaderboardData[]
11388
}
11489

11590
const TranslationLeaderboard = ({
@@ -124,9 +99,9 @@ const TranslationLeaderboard = ({
12499
)
125100

126101
const leaderboardData = {
127-
monthData: sortAndFilterData(monthData.data),
128-
quarterData: sortAndFilterData(quarterData.data),
129-
allTimeData: sortAndFilterData(allTimeData.data),
102+
monthData: sortAndFilterData(monthData),
103+
quarterData: sortAndFilterData(quarterData),
104+
allTimeData: sortAndFilterData(allTimeData),
130105
}
131106

132107
const [filterAmount, updateFilterAmount] = useState(10)
@@ -216,11 +191,8 @@ const TranslationLeaderboard = ({
216191
</Flex>
217192
{leaderboardData[dateRangeType]
218193
.slice(0, filterAmount)
219-
.map((item, idx) => {
220-
const { user, languages } = item
221-
const sortedLanguages = reverse(
222-
sortBy(languages, ({ language }) => language.totalCosts)
223-
)
194+
.map((item: CostLeaderboardData, idx: number) => {
195+
const { username, avatarUrl, totalCosts, langs } = item
224196

225197
let emoji: string | null = null
226198
if (idx === 0) {
@@ -270,12 +242,12 @@ const TranslationLeaderboard = ({
270242
w={{ base: "30px", sm: 10 }}
271243
borderRadius="50%"
272244
display={{ base: "none", s: "block" }}
273-
src={user.avatarUrl}
245+
src={avatarUrl}
274246
/>
275247
<Box maxW={{ base: "100px", sm: "none" }}>
276-
{user.username}
248+
{username}
277249
<Text m={0} display="block" fontSize="sm" opacity="0.6">
278-
{sortedLanguages[0].language.name}
250+
{langs[0]}
279251
</Text>
280252
</Box>
281253
</Flex>
@@ -287,7 +259,7 @@ const TranslationLeaderboard = ({
287259
fontSize="2xl"
288260
text={":writing:"}
289261
/>
290-
{user.totalCosts}
262+
{totalCosts}
291263
</Flex>
292264
</Flex>
293265
)

0 commit comments

Comments
 (0)