opened.js (4628B)
1 import fs from 'fs'; 2 import path from 'path'; 3 4 import { db, numberOfDays } from '../index.js'; 5 import { getNumberOfDays } from '../tools/numberofdays.js'; 6 7 const ignoreLabels = ['maintainer']; 8 const newPRs = fs.readFileSync( 9 path.join(import.meta.dirname, '../message/opened.md'), 10 'utf8' 11 ); 12 const draftPRs = fs.readFileSync( 13 path.join(import.meta.dirname, '../message/draft.md'), 14 'utf8' 15 ); 16 17 // https://docs.github.com/en/webhooks/webhook-events-and-payloads#pull_request 18 export async function opened( 19 appOctokit, 20 repoOwner, 21 repoName, 22 repoFullName, 23 prNumber, 24 prCreatedAt, 25 prUsername, 26 prDraft 27 ) { 28 console.log( 29 `Received a open pull request event for #${prNumber} on https://github.com/${repoFullName}` 30 ); 31 const labels = await appOctokit.rest.issues.listLabelsOnIssue({ 32 owner: repoOwner, 33 repo: repoName, 34 issue_number: prNumber, 35 }); 36 const allLabels = labels.data.map((label) => label.name); 37 if (ignoreLabels.some((label) => allLabels.includes(label))) { 38 console.log( 39 `#${prNumber} from https://github.com/${repoFullName} is by a maintainer, skipping pull request.` 40 ); 41 return; 42 } 43 if (prDraft === true) { 44 await appOctokit.rest.issues.createComment({ 45 owner: repoOwner, 46 repo: repoName, 47 issue_number: prNumber, 48 body: draftPRs, 49 }); 50 console.log( 51 `Sent a draft message to #${prNumber} on https://github.com/${repoFullName}` 52 ); 53 } else { 54 await appOctokit.rest.issues.createComment({ 55 owner: repoOwner, 56 repo: repoName, 57 issue_number: prNumber, 58 body: newPRs, 59 }); 60 console.log( 61 `Sent a opened message to #${prNumber} on https://github.com/${repoFullName}` 62 ); 63 } 64 // low priority check 65 let res = await db 66 .prepare(`SELECT * FROM LIST WHERE username = ?;`) 67 .get(prUsername); 68 if (res !== undefined) { 69 let resJson = JSON.stringify(res); 70 let parsed = JSON.parse(resJson); 71 let date = new Date(); 72 if ( 73 parsed.username === prUsername && 74 getNumberOfDays(parsed.time, date) <= numberOfDays 75 ) { 76 let lowPriority = ` 77 # Low priority 78 79 You're attempting to create a new pull request to bypass the low priority label placed on your previous pull request, #${parsed.prnumber}. Unfortunately, we've noticed this attempt, and we're applying the label you were trying to escape on this pull request, too. 80 81 If you think this is a mistake then please contact [iostpa](https://github.com/iostpa). 82 `; 83 await appOctokit.request( 84 'POST /repos/{owner}/{repo}/issues/{issue_number}/labels', 85 { 86 owner: repoOwner, 87 repo: repoName, 88 issue_number: prNumber, 89 labels: ['status: low priority'], 90 } 91 ); 92 await appOctokit.rest.issues.createComment({ 93 owner: repoOwner, 94 repo: repoName, 95 issue_number: prNumber, 96 body: lowPriority, 97 }); 98 await db 99 .prepare(`UPDATE LIST SET prnumber = ? WHERE prnumber = ?;`) 100 .run(`${prNumber}`, `${parsed.prnumber}`); 101 await db 102 .prepare(`UPDATE LIST SET time = ? WHERE prnumber = ?;`) 103 .run(prCreatedAt, `${prNumber}`); 104 console.log( 105 `Auto-added, replaced with new PR number and sent low priority message to #${prNumber} on https://github.com/${repoFullName} because it was found in the database.` 106 ); 107 } else if ( 108 parsed.username === prUsername && 109 getNumberOfDays(parsed.time, date) >= numberOfDays 110 ) { 111 await appOctokit.request( 112 'DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}', 113 { 114 owner: repoOwner, 115 repo: repoName, 116 issue_number: prNumber, 117 name: 'status: low priority', 118 } 119 ); 120 await db 121 .prepare(`DELETE FROM LIST WHERE username = ?;`) 122 .run(parsed.username); 123 console.log( 124 `Removed #${prNumber} from https://github.com/${repoFullName} from the low priority database as well as the label.` 125 ); 126 } 127 } else if (res === undefined) { 128 return; 129 } 130 }