From a4c3135bf3b26eb0b90a4829f9f7b60fc447b91f Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Wed, 21 Jan 2026 18:00:37 +0100 Subject: [PATCH] github: Add first time contributor verification (#1663) --- .github/PULL_REQUEST_TEMPLATE.md | 13 +++ .github/ignore_unless_human.png | Bin 0 -> 13918 bytes .../first_time_contributor_detect.yml | 51 +++++++++++ .../first_time_contributor_reopen.yml | 79 ++++++++++++++++++ 4 files changed, 143 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/ignore_unless_human.png create mode 100644 .github/workflows/first_time_contributor_detect.yml create mode 100644 .github/workflows/first_time_contributor_reopen.yml diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..85c6be68a --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,13 @@ +--- + + +![Ignore Until Your PR has been created!](../blob/main/.github/ignore_unless_human.png?raw=true) +--- \ No newline at end of file diff --git a/.github/ignore_unless_human.png b/.github/ignore_unless_human.png new file mode 100644 index 0000000000000000000000000000000000000000..da29dd66a833d8d9494b7c129743d5618afcab92 GIT binary patch literal 13918 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 o=)~lhdnIn!AM5}96w(=ER)7)$`2YX_ literal 0 HcmV?d00001 diff --git a/.github/workflows/first_time_contributor_detect.yml b/.github/workflows/first_time_contributor_detect.yml new file mode 100644 index 000000000..da8c8bb68 --- /dev/null +++ b/.github/workflows/first_time_contributor_detect.yml @@ -0,0 +1,51 @@ +name: Detect first-time contributors + +on: + pull_request_target: + types: [opened] + +permissions: + pull-requests: write + issues: write + +jobs: + detect: + runs-on: ubuntu-latest + if: >- + (github.repository == 'azahar-emu/azahar') && + (github.event.pull_request.author_association != 'COLLABORATOR') && + (github.event.pull_request.author_association != 'CONTRIBUTOR') && + (github.event.pull_request.author_association != 'MANNEQUIN') && + (github.event.pull_request.author_association != 'MEMBER') && + (github.event.pull_request.author_association != 'OWNER') + steps: + - name: Detect PR if author is first-time contributor + uses: actions/github-script@v7 + with: + script: | + const { owner, repo } = context.repo; + const pr = context.payload.pull_request; + + // Add needs verification label so that the reopen action runs on comment. + await github.rest.issues.addLabels({ + owner, + repo, + issue_number: pr.number, + labels: ['needs verification'], + }); + + // Close the pull request and wait for verification. + await github.rest.pulls.update({ + owner, + repo, + pull_number: pr.number, + state: 'closed', + }); + + // Show the new contributor how to verify (they need to write a short poem about the Wii and 3DS being lovers) + await github.rest.issues.createComment({ + owner, + repo, + issue_number: pr.number, + body: 'Welcome to the Azahar Emulator repository! Due to the surge of AI bots we have decided to add an extra verification step to new contributors. Please follow the exact instructions in your own written Pull Request description to reopen it.', + }); diff --git a/.github/workflows/first_time_contributor_reopen.yml b/.github/workflows/first_time_contributor_reopen.yml new file mode 100644 index 000000000..b42400902 --- /dev/null +++ b/.github/workflows/first_time_contributor_reopen.yml @@ -0,0 +1,79 @@ +name: Verify first-time contributors + +on: + issue_comment: + types: [created] + +permissions: + pull-requests: write + issues: write + +jobs: + verify: + runs-on: ubuntu-latest + if: github.event.issue.pull_request && contains(github.event.issue.labels.*.name, 'needs verification') + steps: + - name: Verify and reopen PR + uses: actions/github-script@v7 + with: + script: | + const { owner, repo } = context.repo; + const issue = context.payload.issue; + const comment = context.payload.comment; + const { data: pr } = await github.rest.pulls.get({ + owner, + repo, + pull_number: issue.number, + }); + + // Only allow verification of the comment user is the author + if (comment.user.login !== pr.user.login) { + return; + } + + // Fetch user display and login names (lowercase) + const { data: user } = await github.rest.users.getByUsername({ + username: pr.user.login, + }); + const username = pr.user.login.toLowerCase(); + const displayName = (user.name || '').toLowerCase(); + + // Make comment body lowercase and split words + const body = comment.body.toLowerCase().trim().split(/\s+/); + + // Check that the user verified themselves by writing a song about the NES and the SNES. + const verified = + (body.includes(username) || + (displayName && body.includes(displayName))) && + body.includes('azahar'); + + // Only reopen the PR and remove the label if verification succeeded + if (verified) { + await github.rest.pulls.update({ + owner, + repo, + pull_number: issue.number, + state: 'open', + }); + await github.rest.issues.createComment({ + owner, + repo, + issue_number: issue.number, + body: 'Verification successful! Pull request has been reopened. Please also edit your PR description to remove the block of text between `---` to make the description easier to read.', + }); + try { + await github.rest.issues.removeLabel({ + owner, + repo, + issue_number: issue.number, + name: 'needs verification', + }); + } catch {} + } else { + await github.rest.issues.createComment({ + owner, + repo, + issue_number: issue.number, + body: 'Verification failed! Pull request will remain closed.', + }); + }