on: issues: types: [opened] discussion: types: [created] name: Close likely duplicates permissions: {} jobs: should_run: runs-on: ubuntu-latest outputs: should_run: ${{ steps.should_run.outputs.run }} steps: - id: should_run run: echo "run=${{ github.event_name == 'issues' || github.event.discussion.category.name == 'Feature Request' }}" >> $GITHUB_OUTPUT get_body: runs-on: ubuntu-latest needs: should_run if: ${{ needs.should_run.outputs.should_run == 'true' }} env: EVENT: ${{ toJSON(github.event) }} outputs: body: ${{ steps.get_body.outputs.body }} steps: - id: get_body run: | BODY=$(echo """$EVENT""" | jq -r '.issue // .discussion | .body' | base64 -w 0) echo "body=$BODY" >> $GITHUB_OUTPUT get_checkbox_json: runs-on: ubuntu-latest needs: [get_body, should_run] if: ${{ needs.should_run.outputs.should_run == 'true' }} container: image: yshavit/mdq:0.8.0@sha256:c69224d34224a0043d9a3ee46679ba4a2a25afaac445f293d92afe13cd47fcea outputs: json: ${{ steps.get_checkbox.outputs.json }} steps: - id: get_checkbox env: BODY: ${{ needs.get_body.outputs.body }} # TODO: We should detect if the checkbox is missing entirely and also close_and_comment in that case. run: | JSON=$(echo "$BODY" | base64 -d | /mdq --output json '# I have searched | - [?] Yes') echo "json=$JSON" >> $GITHUB_OUTPUT close_and_comment: runs-on: ubuntu-latest needs: [get_checkbox_json, should_run] if: ${{ needs.should_run.outputs.should_run == 'true' && !fromJSON(needs.get_checkbox_json.outputs.json).items[0].list[0].checked }} permissions: issues: write discussions: write steps: - name: Close issue if: ${{ github.event_name == 'issues' }} env: GH_TOKEN: ${{ github.token }} NODE_ID: ${{ github.event.issue.node_id }} run: | gh api graphql \ -f issueId="$NODE_ID" \ -f body="This issue has automatically been closed as it is likely a duplicate. We get a lot of duplicate threads each day, which is why we ask you in the template to confirm that you searched for duplicates before opening one. If you're sure this is not a duplicate, please leave a comment and we will reopen the thread if necessary." \ -f query=' mutation CommentAndCloseIssue($issueId: ID!, $body: String!) { addComment(input: { subjectId: $issueId, body: $body }) { __typename } closeIssue(input: { issueId: $issueId, stateReason: DUPLICATE }) { __typename } }' - name: Close discussion if: ${{ github.event_name == 'discussion' && github.event.discussion.category.name == 'Feature Request' }} env: GH_TOKEN: ${{ github.token }} NODE_ID: ${{ github.event.discussion.node_id }} run: | gh api graphql \ -f discussionId="$NODE_ID" \ -f body="This discussion has automatically been closed as it is likely a duplicate. We get a lot of duplicate threads each day, which is why we ask you in the template to confirm that you searched for duplicates before opening one. If you're sure this is not a duplicate, please leave a comment and we will reopen the thread if necessary." \ -f query=' mutation CommentAndCloseDiscussion($discussionId: ID!, $body: String!) { addDiscussionComment(input: { discussionId: $discussionId, body: $body }) { __typename } closeDiscussion(input: { discussionId: $discussionId, reason: DUPLICATE }) { __typename } }'