From abc4939d7099a4c7f00ff13676728964a7277372 Mon Sep 17 00:00:00 2001 From: buffcode Date: Fri, 9 Feb 2024 08:30:23 +0100 Subject: [PATCH 1/4] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20auto-up?= =?UTF-8?q?date=20GitHub=20issue=20with=20unmapped=20extendedCallList=20mi?= =?UTF-8?q?ssions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflows/extendedCallList-mapping.yml | 166 ++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 .github/workflows/extendedCallList-mapping.yml diff --git a/.github/workflows/extendedCallList-mapping.yml b/.github/workflows/extendedCallList-mapping.yml new file mode 100644 index 0000000000..26fb523f99 --- /dev/null +++ b/.github/workflows/extendedCallList-mapping.yml @@ -0,0 +1,166 @@ +name: '[๐Ÿ‘ท] Check extendedCallList event mapping' +run-name: '[๐Ÿ‘ท] Check extendedCallList event mapping' + +on: + workflow_dispatch: + schedule: + - cron: "0 */6 * * *" + +jobs: + eventMapping: + runs-on: ubuntu-latest + name: '[๐Ÿ‘ท] Check extendedCallList event mapping' + steps: + - name: '[๐Ÿ“ฅ] checkout' + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: '[๐ŸŒ] extract module languages' + id: module_languages + run: | + languages=`find src/modules/extendedCallList/i18n/ -type f -name '*.root.json' -printf '%f\n' | cut -d'.' -f1 | tr '\n' ' '` + echo "languages=${languages% }" >> "$GITHUB_OUTPUT" + + - name: '[โคต๏ธ] download mission i18n files' + run: | + mkdir -p static/missions + cd static/missions + + echo "${{ steps.module_languages.outputs.languages }}" | tr ' ' '\n' | xargs -I{} echo "https://v4.lss-manager.de/missions/{}.json" | xargs curl -sSLZ --remote-name-all + + - name: '[๐Ÿง] compare event missions to mission i18n files' + id: mission_compare + run: | + jq -cn '{}' > static/missions/unmapped.json + + languages=`echo "${{ steps.module_languages.outputs.languages }}"` + for lang in ${languages}; do + echo "Extracting events for ${lang}..." + jq '. | map(select(.additional.optional_event_mission and (.additional.date_end > (now | todate)))) | map(.id | tostring) | sort | unique' static/missions/${lang}.json > static/missions/${lang}.events.json + + echo "Extracting already mapped events for ${lang}..." + jq '.eventMissions.default | flatten | map(. | tostring) | sort | unique' src/modules/extendedCallList/i18n/de_DE.root.json > static/missions/${lang}.mapped.json + + echo "Getting unmapped events for ${lang}..." + jq -n --slurpfile events static/missions/${lang}.events.json --slurpfile mapped static/missions/${lang}.mapped.json '($events | flatten) - ($mapped | flatten)' > static/missions/${lang}.unmapped.json + + echo "Merge unmapped events for ${lang}..." + jq -cn --arg lang "${lang}" --slurpfile langfile static/missions/${lang}.unmapped.json --rawfile merged static/missions/unmapped.json '$merged | fromjson | .[$lang] = ($langfile | flatten)' > static/missions/unmapped.tmp.json + mv static/missions/unmapped.tmp.json static/missions/unmapped.json + done + + echo "diffs_detected=`cat static/missions/unmapped.json`" >> "$GITHUB_OUTPUT" + + - name: '[โœ๏ธ] prepare issue body' + if: ${{ steps.mission_compare.outputs.diffs_detected != '{}' }} + id: issue_body + uses: actions/github-script@v7 + with: + result-encoding: string + script: | + const { writeFileSync } = require('fs'); + + const iconSuggestor = (lang, missionData) => { + // find other already mapped missions with the same start/end date and suggest their icon + const mappedEvents = require(`./src/modules/extendedCallList/i18n/${lang}.root.json`).eventMissions?.default ?? {}; + + return (mission) => { + const icons = Object.entries(mappedEvents).map(([icon, missions]) => { + const mappedMissions = missions + .map(missionId => missionData[missionId]) + .filter(m => !!m) + .filter(m => m.additional.date_start === mission.additional.date_start && m.additional.date_end === mission.additional.date_end) + ; + + return { icon, hits: mappedMissions.length }; + }).sort((a, b) => b.hits - a.hits); + + if (icons.length > 0 && icons[0].hits > 0) { + return icons[0].icon; + } + + return 'โ”'; + }; + }; + + const diffs = JSON.parse('${{ steps.mission_compare.outputs.diffs_detected }}'); + let result = '\n' + + 'The following missions are not mapped in the `extendedCallList` module. Please map them in the respective language files.\n\n'; + + for (const lang in diffs) { + const missionData = require(`./static/missions/${lang}.json`); + const suggestIcon = iconSuggestor(lang, missionData); + const sortedMissions = diffs[lang].map(missionId => missionData[missionId]).filter(m => !!m).sort((a, b) => { + if (a.additional.date_start === b.additional.date_start) { + return a.id - b.id; + } + + return a.additional.date_start.localeCompare(b.additional.date_start); + }); + + result += `
\n\n#### [\`${lang}\`](../blob/dev/src/modules/extendedCallList/i18n/${lang}.root.json) (${diffs[lang].length} mission${diffs[lang].length > 1 ? 's' : ''})\n\n\n\n`; + result += '| ID | Title | Start date | End date | Icon |\n'; + result += '| --- | --- | --- | --- | --- |\n'; + for (const mission of sortedMissions) { + result += `| \`${mission.id}\` | \`${mission.name}\` | \`${mission.additional.date_start}\` | \`${mission.additional.date_end}\` | ${suggestIcon(mission)} |\n`; + } + result += '\n
\n'; + } + + writeFileSync('body.txt', result); + + - name: '[๐Ÿ”] find existing issue' + id: issue_exists + uses: actions-cool/issues-helper@v3 + with: + actions: 'find-issues' + token: ${{ secrets.GITHUB_TOKEN }} + body-includes: '' + title-includes: '๐Ÿฉน [extendedCallList] Unmapped events' + + - name: '[โœจ] create new issue' + id: issue_create + if: ${{ steps.mission_compare.outputs.diffs_detected != '{}' && steps.issue_exists.outputs.issues == '[]' }} + uses: actions/github-script@v7 + with: + script: | + const { readFileSync } = require('fs'); + + const title = '๐Ÿฉน [extendedCallList] Unmapped events'; + const existingIssue = context.payload.issue; + const issue = await github.rest.issues.create({ + owner: context.repo.owner, + repo: context.repo.repo, + title: title, + body: readFileSync('body.txt').toString() + }); + + return issue.data.number; + + - name: '[โœ๏ธ] update issue' + if: ${{ steps.mission_compare.outputs.diffs_detected != '{}' && steps.issue_exists.outputs.issues != '[]' }} + uses: actions/github-script@v7 + with: + script: | + const { readFileSync } = require('fs'); + + const title = '๐Ÿฉน [extendedCallList] Unmapped events'; + const existingIssue = context.payload.issue; + const issue = await github.rest.issues.update({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: ${{ fromJSON(steps.issue_exists.outputs.issues)[0].number }}, + state: 'open', + body: readFileSync('body.txt').toString() + }); + + - name: '[โœ…] close issue' + if: ${{ steps.mission_compare.outputs.diffs_detected == '{}' && (steps.issue_create.outputs.result || steps.issue_exists.outputs.isues != '[]') }} + env: + issue_number: ${{ steps.issue_create.outputs.result || (fromJSON(steps.issue_exists.outputs.issues)[0].number) }} + uses: actions-cool/issues-helper@v3 + with: + actions: 'close-issue' + token: ${{ secrets.GITHUB_TOKEN }} + issue-number: ${{ env.issue_number }} From 103ecd652e47ebef6f0189913663542c3d9ad076 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laurens=20St=C3=B6tzel?= Date: Fri, 9 Feb 2024 12:30:26 +0100 Subject: [PATCH 2/4] =?UTF-8?q?=F0=9F=A9=B9=20change=20issue=20title?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/extendedCallList-mapping.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/extendedCallList-mapping.yml b/.github/workflows/extendedCallList-mapping.yml index 26fb523f99..2ed61efb57 100644 --- a/.github/workflows/extendedCallList-mapping.yml +++ b/.github/workflows/extendedCallList-mapping.yml @@ -117,7 +117,7 @@ jobs: actions: 'find-issues' token: ${{ secrets.GITHUB_TOKEN }} body-includes: '' - title-includes: '๐Ÿฉน [extendedCallList] Unmapped events' + title-includes: '๐Ÿฉน [extendedCallList] Unmapped event missions' - name: '[โœจ] create new issue' id: issue_create @@ -127,7 +127,7 @@ jobs: script: | const { readFileSync } = require('fs'); - const title = '๐Ÿฉน [extendedCallList] Unmapped events'; + const title = '๐Ÿฉน [extendedCallList] Unmapped event missions'; const existingIssue = context.payload.issue; const issue = await github.rest.issues.create({ owner: context.repo.owner, @@ -145,7 +145,7 @@ jobs: script: | const { readFileSync } = require('fs'); - const title = '๐Ÿฉน [extendedCallList] Unmapped events'; + const title = '๐Ÿฉน [extendedCallList] Unmapped event missions'; const existingIssue = context.payload.issue; const issue = await github.rest.issues.update({ owner: context.repo.owner, From fe5fefa8e89e4c3e5e34a7e99cf349bc06bce330 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laurens=20St=C3=B6tzel?= Date: Fri, 9 Feb 2024 12:32:35 +0100 Subject: [PATCH 3/4] =?UTF-8?q?=F0=9F=A9=B9=20sort=20locales=20alphabetica?= =?UTF-8?q?lly?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/extendedCallList-mapping.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/extendedCallList-mapping.yml b/.github/workflows/extendedCallList-mapping.yml index 2ed61efb57..bf0ba0afd8 100644 --- a/.github/workflows/extendedCallList-mapping.yml +++ b/.github/workflows/extendedCallList-mapping.yml @@ -19,7 +19,7 @@ jobs: - name: '[๐ŸŒ] extract module languages' id: module_languages run: | - languages=`find src/modules/extendedCallList/i18n/ -type f -name '*.root.json' -printf '%f\n' | cut -d'.' -f1 | tr '\n' ' '` + languages=`find src/modules/extendedCallList/i18n/ -type f -name '*.root.json' -printf '%f\n' | cut -d'.' -f1 | sort | tr '\n' ' '` echo "languages=${languages% }" >> "$GITHUB_OUTPUT" - name: '[โคต๏ธ] download mission i18n files' From d49b08e03b4963b1a67fc473167f453115c56013 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laurens=20St=C3=B6tzel?= Date: Fri, 9 Feb 2024 12:33:48 +0100 Subject: [PATCH 4/4] =?UTF-8?q?=F0=9F=8E=A8=20fix=20formatting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflows/extendedCallList-mapping.yml | 108 +++++++++--------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/.github/workflows/extendedCallList-mapping.yml b/.github/workflows/extendedCallList-mapping.yml index bf0ba0afd8..7c315c908d 100644 --- a/.github/workflows/extendedCallList-mapping.yml +++ b/.github/workflows/extendedCallList-mapping.yml @@ -4,7 +4,7 @@ run-name: '[๐Ÿ‘ท] Check extendedCallList event mapping' on: workflow_dispatch: schedule: - - cron: "0 */6 * * *" + - cron: '0 */6 * * *' jobs: eventMapping: @@ -57,58 +57,58 @@ jobs: id: issue_body uses: actions/github-script@v7 with: - result-encoding: string - script: | - const { writeFileSync } = require('fs'); - - const iconSuggestor = (lang, missionData) => { - // find other already mapped missions with the same start/end date and suggest their icon - const mappedEvents = require(`./src/modules/extendedCallList/i18n/${lang}.root.json`).eventMissions?.default ?? {}; - - return (mission) => { - const icons = Object.entries(mappedEvents).map(([icon, missions]) => { - const mappedMissions = missions - .map(missionId => missionData[missionId]) - .filter(m => !!m) - .filter(m => m.additional.date_start === mission.additional.date_start && m.additional.date_end === mission.additional.date_end) - ; - - return { icon, hits: mappedMissions.length }; - }).sort((a, b) => b.hits - a.hits); - - if (icons.length > 0 && icons[0].hits > 0) { - return icons[0].icon; - } - - return 'โ”'; - }; - }; - - const diffs = JSON.parse('${{ steps.mission_compare.outputs.diffs_detected }}'); - let result = '\n' + - 'The following missions are not mapped in the `extendedCallList` module. Please map them in the respective language files.\n\n'; - - for (const lang in diffs) { - const missionData = require(`./static/missions/${lang}.json`); - const suggestIcon = iconSuggestor(lang, missionData); - const sortedMissions = diffs[lang].map(missionId => missionData[missionId]).filter(m => !!m).sort((a, b) => { - if (a.additional.date_start === b.additional.date_start) { - return a.id - b.id; - } - - return a.additional.date_start.localeCompare(b.additional.date_start); - }); - - result += `
\n\n#### [\`${lang}\`](../blob/dev/src/modules/extendedCallList/i18n/${lang}.root.json) (${diffs[lang].length} mission${diffs[lang].length > 1 ? 's' : ''})\n\n\n\n`; - result += '| ID | Title | Start date | End date | Icon |\n'; - result += '| --- | --- | --- | --- | --- |\n'; - for (const mission of sortedMissions) { - result += `| \`${mission.id}\` | \`${mission.name}\` | \`${mission.additional.date_start}\` | \`${mission.additional.date_end}\` | ${suggestIcon(mission)} |\n`; - } - result += '\n
\n'; - } - - writeFileSync('body.txt', result); + result-encoding: string + script: | + const { writeFileSync } = require('fs'); + + const iconSuggestor = (lang, missionData) => { + // find other already mapped missions with the same start/end date and suggest their icon + const mappedEvents = require(`./src/modules/extendedCallList/i18n/${lang}.root.json`).eventMissions?.default ?? {}; + + return (mission) => { + const icons = Object.entries(mappedEvents).map(([icon, missions]) => { + const mappedMissions = missions + .map(missionId => missionData[missionId]) + .filter(m => !!m) + .filter(m => m.additional.date_start === mission.additional.date_start && m.additional.date_end === mission.additional.date_end) + ; + + return { icon, hits: mappedMissions.length }; + }).sort((a, b) => b.hits - a.hits); + + if (icons.length > 0 && icons[0].hits > 0) { + return icons[0].icon; + } + + return 'โ”'; + }; + }; + + const diffs = JSON.parse('${{ steps.mission_compare.outputs.diffs_detected }}'); + let result = '\n' + + 'The following missions are not mapped in the `extendedCallList` module. Please map them in the respective language files.\n\n'; + + for (const lang in diffs) { + const missionData = require(`./static/missions/${lang}.json`); + const suggestIcon = iconSuggestor(lang, missionData); + const sortedMissions = diffs[lang].map(missionId => missionData[missionId]).filter(m => !!m).sort((a, b) => { + if (a.additional.date_start === b.additional.date_start) { + return a.id - b.id; + } + + return a.additional.date_start.localeCompare(b.additional.date_start); + }); + + result += `
\n\n#### [\`${lang}\`](../blob/dev/src/modules/extendedCallList/i18n/${lang}.root.json) (${diffs[lang].length} mission${diffs[lang].length > 1 ? 's' : ''})\n\n\n\n`; + result += '| ID | Title | Start date | End date | Icon |\n'; + result += '| --- | --- | --- | --- | --- |\n'; + for (const mission of sortedMissions) { + result += `| \`${mission.id}\` | \`${mission.name}\` | \`${mission.additional.date_start}\` | \`${mission.additional.date_end}\` | ${suggestIcon(mission)} |\n`; + } + result += '\n
\n'; + } + + writeFileSync('body.txt', result); - name: '[๐Ÿ”] find existing issue' id: issue_exists @@ -163,4 +163,4 @@ jobs: with: actions: 'close-issue' token: ${{ secrets.GITHUB_TOKEN }} - issue-number: ${{ env.issue_number }} + issue-number: ${{ env.issue_number }} \ No newline at end of file