From 2b0a6779cc410009767b5fd5d1c9291712381926 Mon Sep 17 00:00:00 2001 From: Timothy Date: Thu, 5 Mar 2026 10:54:30 -0800 Subject: [PATCH] feat: link discord github template --- .github/ISSUE_TEMPLATE/link-discord.yml | 31 ++++++ .github/workflows/link-discord.yml | 126 +++++++++++++++++++++++ contributors.yml | 6 +- docs/bounty-program/README.md | 9 +- docs/bounty-program/contributor-guide.md | 11 +- 5 files changed, 163 insertions(+), 20 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/link-discord.yml create mode 100644 .github/workflows/link-discord.yml diff --git a/.github/ISSUE_TEMPLATE/link-discord.yml b/.github/ISSUE_TEMPLATE/link-discord.yml new file mode 100644 index 00000000..73bb7d66 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/link-discord.yml @@ -0,0 +1,31 @@ +name: Link Discord Account +description: Connect your GitHub and Discord for the bounty program +title: "link: @{{ github.actor }}" +labels: ["link-discord"] +body: + - type: markdown + attributes: + value: | + Link your Discord account to receive XP and role rewards when your bounty PRs are merged. + + **How to find your Discord ID:** + 1. Open Discord Settings > Advanced > Enable **Developer Mode** + 2. Right-click your username > **Copy User ID** + + - type: input + id: discord_id + attributes: + label: Discord User ID + description: "Your numeric Discord ID (not your username). Example: 123456789012345678" + placeholder: "123456789012345678" + validations: + required: true + + - type: input + id: display_name + attributes: + label: Display Name (optional) + description: How you'd like to be credited + placeholder: "Jane Doe" + validations: + required: false diff --git a/.github/workflows/link-discord.yml b/.github/workflows/link-discord.yml new file mode 100644 index 00000000..4ce1fdb6 --- /dev/null +++ b/.github/workflows/link-discord.yml @@ -0,0 +1,126 @@ +name: Link Discord account +description: Auto-creates a PR to add contributor to contributors.yml when a link-discord issue is opened + +on: + issues: + types: [opened] + +jobs: + link-discord: + if: contains(github.event.issue.labels.*.name, 'link-discord') + runs-on: ubuntu-latest + timeout-minutes: 2 + permissions: + contents: write + issues: write + pull-requests: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Parse issue and update contributors.yml + uses: actions/github-script@v7 + with: + script: | + const fs = require('fs'); + + const issue = context.payload.issue; + const githubUsername = issue.user.login; + + // Parse the issue body for form fields + const body = issue.body || ''; + + // Extract Discord ID — look for the numeric value after the "Discord User ID" heading + const discordMatch = body.match(/### Discord User ID\s*\n\s*(\d{17,20})/); + if (!discordMatch) { + await github.rest.issues.createComment({ + ...context.repo, + issue_number: issue.number, + body: `Could not find a valid Discord ID in the issue body. Please make sure you entered a numeric ID (17-20 digits), not a username.\n\nExample: \`123456789012345678\`` + }); + await github.rest.issues.update({ + ...context.repo, + issue_number: issue.number, + state: 'closed', + state_reason: 'not_planned' + }); + return; + } + const discordId = discordMatch[1]; + + // Extract display name (optional) + const nameMatch = body.match(/### Display Name \(optional\)\s*\n\s*(.+)/); + const displayName = nameMatch ? nameMatch[1].trim() : ''; + + // Check if user already exists + const yml = fs.readFileSync('contributors.yml', 'utf-8'); + if (yml.includes(`github: ${githubUsername}`)) { + await github.rest.issues.createComment({ + ...context.repo, + issue_number: issue.number, + body: `@${githubUsername} is already in \`contributors.yml\`. If you need to update your Discord ID, please edit the file directly via PR.` + }); + await github.rest.issues.update({ + ...context.repo, + issue_number: issue.number, + state: 'closed', + state_reason: 'completed' + }); + return; + } + + // Append entry to contributors.yml + let entry = ` - github: ${githubUsername}\n discord: "${discordId}"`; + if (displayName && displayName !== '_No response_') { + entry += `\n name: ${displayName}`; + } + entry += '\n'; + + const updated = yml.trimEnd() + '\n' + entry; + fs.writeFileSync('contributors.yml', updated); + + // Set outputs for commit step + core.exportVariable('GITHUB_USERNAME', githubUsername); + core.exportVariable('DISCORD_ID', discordId); + core.exportVariable('ISSUE_NUMBER', issue.number.toString()); + + - name: Create PR + run: | + # Check if there are changes + if git diff --quiet contributors.yml; then + echo "No changes to contributors.yml" + exit 0 + fi + + BRANCH="docs/link-discord-${GITHUB_USERNAME}" + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git checkout -b "$BRANCH" + git add contributors.yml + git commit -m "docs: link @${GITHUB_USERNAME} to Discord" + git push origin "$BRANCH" + + gh pr create \ + --title "docs: link @${GITHUB_USERNAME} to Discord" \ + --body "Adds @${GITHUB_USERNAME} (Discord \`${DISCORD_ID}\`) to \`contributors.yml\` for bounty XP tracking. + + Closes #${ISSUE_NUMBER}" \ + --base main \ + --head "$BRANCH" \ + --label "link-discord" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Notify on issue + uses: actions/github-script@v7 + with: + script: | + const username = process.env.GITHUB_USERNAME; + const issueNumber = parseInt(process.env.ISSUE_NUMBER); + + await github.rest.issues.createComment({ + ...context.repo, + issue_number: issueNumber, + body: `A PR has been created to link your account. A maintainer will merge it shortly — once merged, you'll receive XP and Discord pings when your bounty PRs are merged.` + }); diff --git a/contributors.yml b/contributors.yml index e18ce463..61ae0484 100644 --- a/contributors.yml +++ b/contributors.yml @@ -5,9 +5,9 @@ # GitHub Action uses this file to ping the contributor on Discord. # # HOW TO ADD YOURSELF: -# 1. Fork this repo -# 2. Add your entry below (keep alphabetical order) -# 3. Submit a PR with title: "docs: link @your-github to Discord" +# Open a "Link Discord Account" issue: +# https://github.com/aden-hive/hive/issues/new?template=link-discord.yml +# A GitHub Action will automatically add your entry here. # # To find your Discord ID: # 1. Open Discord Settings > Advanced > Enable Developer Mode diff --git a/docs/bounty-program/README.md b/docs/bounty-program/README.md index d0097d39..4370ded7 100644 --- a/docs/bounty-program/README.md +++ b/docs/bounty-program/README.md @@ -105,14 +105,7 @@ See the [Setup Guide](setup-guide.md) for full configuration (Lurkr, webhooks, s ### Identity Linking -Contributors link GitHub ↔ Discord by adding themselves to `contributors.yml`: - -```yaml -contributors: - - github: jane-doe - discord: "123456789012345678" - name: Jane Doe -``` +Contributors link GitHub ↔ Discord by opening a [Link Discord Account](https://github.com/aden-hive/hive/issues/new?template=link-discord.yml) issue. A GitHub Action auto-adds them to `contributors.yml` and closes the issue. Without this link, bounties are still tracked but Lurkr can't push XP to your Discord account. diff --git a/docs/bounty-program/contributor-guide.md b/docs/bounty-program/contributor-guide.md index 47e5b932..cae59df9 100644 --- a/docs/bounty-program/contributor-guide.md +++ b/docs/bounty-program/contributor-guide.md @@ -6,18 +6,11 @@ Earn XP, Discord roles, and eventually real money by testing and building integr ### 1. Link your GitHub and Discord -Add yourself to `contributors.yml` at the repo root: - -```yaml -contributors: - - github: your-github-username - discord: "your-discord-id" - name: Your Name -``` +Open a [Link Discord Account](https://github.com/aden-hive/hive/issues/new?template=link-discord.yml) issue — just paste your Discord ID and submit. A GitHub Action will automatically add you to `contributors.yml` and close the issue. To find your Discord ID: Discord Settings > Advanced > Enable **Developer Mode**, then right-click your name > **Copy User ID**. -Submit as a PR. Without this link, Lurkr can't push XP to your Discord account. +Without this link, Lurkr can't push XP to your Discord account. ### 2. Pick your first bounty