From 3e886ae0e1b0f0c175f8bb442577198326f2dd2f Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Mon, 16 Mar 2026 11:41:02 -0400 Subject: [PATCH] Refactor AdventureLog Bot workflow to improve issue validation handling and encapsulate comment and close logic (#1068) --- .github/workflows/adventurelog-bot.yml | 88 ++++++++++++++------------ 1 file changed, 46 insertions(+), 42 deletions(-) diff --git a/.github/workflows/adventurelog-bot.yml b/.github/workflows/adventurelog-bot.yml index 26f3b383..d03a9c31 100644 --- a/.github/workflows/adventurelog-bot.yml +++ b/.github/workflows/adventurelog-bot.yml @@ -1,7 +1,7 @@ name: AdventureLog Bot on: - pull_request: + pull_request_target: types: [opened, edited, synchronize] jobs: @@ -18,6 +18,48 @@ jobs: with: script: | const pr = context.payload.pull_request; + const repoFullName = `${context.repo.owner}/${context.repo.repo}`; + + async function safeCreateComment(body) { + try { + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pr.number, + body + }); + return true; + } catch (error) { + if (error.status === 403) { + core.warning(`Unable to comment on PR #${pr.number}: ${error.message}`); + return false; + } + throw error; + } + } + + async function safeClosePr() { + try { + await github.rest.pulls.update({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: pr.number, + state: "closed" + }); + return true; + } catch (error) { + if (error.status === 403) { + core.warning(`Unable to close PR #${pr.number}: ${error.message}`); + return false; + } + throw error; + } + } + + async function safeCommentAndClose(message) { + await safeCreateComment(message); + await safeClosePr(); + } // Ignore specific user if (context.actor === "seanmorley15") { @@ -38,20 +80,7 @@ jobs: const match = body.match(/\b(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?)\s+#(\d+)\b/i); if (!match) { - - await github.rest.issues.createComment({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: pr.number, - body: "šŸ¤– **AdventureLog Bot**\n\n🚫 This PR was automatically closed because it does not reference an issue.\n\nPlease link an issue using `Closes #issue-number`." - }); - - await github.rest.pulls.update({ - owner: context.repo.owner, - repo: context.repo.repo, - pull_number: pr.number, - state: "closed" - }); + await safeCommentAndClose("šŸ¤– **AdventureLog Bot**\n\n🚫 This PR was automatically closed because it does not reference an issue.\n\nPlease link an issue using `Closes #issue-number`."); return; } @@ -68,19 +97,7 @@ jobs: })); } catch (error) { if (error.status === 404) { - await github.rest.issues.createComment({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: pr.number, - body: `šŸ¤– **AdventureLog Bot**\n\n🚫 This PR was automatically closed because the referenced issue #${issueNumber} was not found.\n\nPlease link a valid issue in this repository using \`Closes #issue-number\`.` - }); - - await github.rest.pulls.update({ - owner: context.repo.owner, - repo: context.repo.repo, - pull_number: pr.number, - state: "closed" - }); + await safeCommentAndClose(`šŸ¤– **AdventureLog Bot**\n\n🚫 This PR was automatically closed because the referenced issue #${issueNumber} was not found.\n\nPlease link a valid issue in this repository using \`Closes #issue-number\`.`); return; } @@ -91,19 +108,6 @@ jobs: const labels = issue.labels.map(l => l.name); if (!labels.includes("ready") && !labels.includes("in progress")) { - - await github.rest.issues.createComment({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: pr.number, - body: "šŸ¤– **AdventureLog Bot**\n\n🚫 This PR was automatically closed.\n\nPull requests may only be opened for issues labeled **ready**." - }); - - await github.rest.pulls.update({ - owner: context.repo.owner, - repo: context.repo.repo, - pull_number: pr.number, - state: "closed" - }); + await safeCommentAndClose("šŸ¤– **AdventureLog Bot**\n\n🚫 This PR was automatically closed.\n\nPull requests may only be opened for issues labeled **ready**."); }