close_unresponsive.js (1542B)
1 function labeledEvent(data) { 2 return data.event === "labeled" && data.label.name === "needs:response"; 3 } 4 5 const numberOfDaysLimit = 30; 6 const close_message = `This has been closed since a request for information has \ 7 not been answered for ${numberOfDaysLimit} days. It can be reopened when the \ 8 requested information is provided.`; 9 10 module.exports = async ({ github, context }) => { 11 const owner = context.repo.owner; 12 const repo = context.repo.repo; 13 14 const issues = await github.rest.issues.listForRepo({ 15 owner: owner, 16 repo: repo, 17 labels: "needs:response", 18 }); 19 const numbers = issues.data.map((e) => e.number); 20 21 for (const number of numbers) { 22 const events = await github.paginate( 23 github.rest.issues.listEventsForTimeline, 24 { 25 owner: owner, 26 repo: repo, 27 issue_number: number, 28 }, 29 (response) => response.data.filter(labeledEvent), 30 ); 31 32 const latest_response_label = events[events.length - 1]; 33 34 const created_at = new Date(latest_response_label.created_at); 35 const now = new Date(); 36 const diff = now - created_at; 37 const diffDays = diff / (1000 * 60 * 60 * 24); 38 39 if (diffDays > numberOfDaysLimit) { 40 github.rest.issues.update({ 41 owner: owner, 42 repo: repo, 43 issue_number: number, 44 state_reason: "not_planned", 45 state: "closed", 46 }); 47 48 github.rest.issues.createComment({ 49 owner: owner, 50 repo: repo, 51 issue_number: number, 52 body: close_message, 53 }); 54 } 55 } 56 };