From 2507582478eb0ae270d22d8b8ef2f928982abafc Mon Sep 17 00:00:00 2001 From: f Date: Sun, 5 Jan 2025 23:35:55 +0300 Subject: [PATCH] update --- .github/workflows/ai_bot.yml | 91 ++++++++++++++++++++++++++++++++++-- 1 file changed, 86 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ai_bot.yml b/.github/workflows/ai_bot.yml index ea38744..7c802ba 100644 --- a/.github/workflows/ai_bot.yml +++ b/.github/workflows/ai_bot.yml @@ -7,14 +7,18 @@ on: types: [created] pull_request_review_comment: types: [created] + pull_request: + types: [opened, edited, synchronize] jobs: respond-to-commands: runs-on: ubuntu-latest if: | - (github.event_name == 'issues' && contains(github.event.issue.body, '/ai')) || + (github.actor == 'f') && + ((github.event_name == 'issues' && contains(github.event.issue.body, '/ai')) || (github.event_name == 'issue_comment' && contains(github.event.comment.body, '/ai')) || - (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '/ai')) + (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '/ai')) || + (github.event_name == 'pull_request' && contains(github.event.pull_request.body, '/ai'))) permissions: contents: write pull-requests: write @@ -36,7 +40,7 @@ jobs: - name: Process command id: process env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_SECRET: ${{ secrets.GH_SECRET }} OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} run: | node << 'EOF' @@ -49,16 +53,24 @@ jobs: }); const octokit = new Octokit({ - auth: process.env.GITHUB_TOKEN + auth: process.env.GH_SECRET }); const eventName = process.env.GITHUB_EVENT_NAME; const eventPath = process.env.GITHUB_EVENT_PATH; const event = require(eventPath); + // Double check user authorization + const actor = event.sender?.login || event.pull_request?.user?.login || event.issue?.user?.login; + if (actor !== 'f') { + console.log('Unauthorized user attempted to use the bot:', actor); + return; + } + // Get command and context let command = ''; let issueNumber = null; + let isPullRequest = false; if (eventName === 'issues') { command = event.issue.body; @@ -66,9 +78,15 @@ jobs: } else if (eventName === 'issue_comment') { command = event.comment.body; issueNumber = event.issue.number; + isPullRequest = !!event.issue.pull_request; } else if (eventName === 'pull_request_review_comment') { command = event.comment.body; issueNumber = event.pull_request.number; + isPullRequest = true; + } else if (eventName === 'pull_request') { + command = event.pull_request.body; + issueNumber = event.pull_request.number; + isPullRequest = true; } if (!command.startsWith('/ai')) { @@ -77,8 +95,71 @@ jobs: // Extract the actual command after /ai const aiCommand = command.substring(3).trim(); + + // Handle rename command specifically + if (aiCommand.startsWith('rename') || aiCommand === 'suggest title') { + if (!isPullRequest) { + await octokit.issues.createComment({ + owner: event.repository.owner.login, + repo: event.repository.name, + issue_number: issueNumber, + body: '❌ The rename command can only be used on pull requests.' + }); + return; + } - // Generate response using OpenAI + // Get PR details for context + const { data: pr } = await octokit.pulls.get({ + owner: event.repository.owner.login, + repo: event.repository.name, + pull_number: issueNumber + }); + + // Get the PR diff for better context + const { data: diff } = await octokit.pulls.get({ + owner: event.repository.owner.login, + repo: event.repository.name, + pull_number: issueNumber, + mediaType: { format: 'diff' } + }); + + const completion = await openai.chat.completions.create({ + model: "gpt-3.5-turbo", + messages: [ + { + role: "system", + content: "You are a helpful assistant that generates clear, concise, and descriptive pull request titles. Follow conventional commit message style. Return ONLY the new title, nothing else." + }, + { + role: "user", + content: `Based on this pull request content, generate a better title.\n\nCurrent title: ${pr.title}\n\nDescription: ${pr.body}\n\nChanges:\n${diff}` + } + ], + temperature: 0.7, + max_tokens: 60 + }); + + const newTitle = completion.choices[0].message.content.trim(); + + // Update PR title + await octokit.pulls.update({ + owner: event.repository.owner.login, + repo: event.repository.name, + pull_number: issueNumber, + title: newTitle + }); + + // Add comment about the rename + await octokit.issues.createComment({ + owner: event.repository.owner.login, + repo: event.repository.name, + issue_number: issueNumber, + body: `✨ Updated PR title to: "${newTitle}"` + }); + return; + } + + // Handle other commands const completion = await openai.chat.completions.create({ model: "gpt-3.5-turbo", messages: [