"use strict"; // P A C K A G E S // U T I L S import relativeDate from "../modules/relative-date.js"; let githubFeed; let lastGithubFeedUpdate; updateGithubFeed(); // Update the feed every 5 minutes setInterval(() => { updateGithubFeed(); }, 5 * 60 * 1000); // P R O G R A M function generateEvent(event) { switch(event.type) { case "CommitCommentEvent": return ` ${event.actor.display_login} commented on commit in `; case "CreateEvent": return ` ${event.actor.display_login} created ${event.payload.ref_type} ${refToBranch(event.payload.ref)} in `; case "DeleteEvent": return ` ${event.actor.display_login} deleted ${event.payload.ref_type} ${event.payload.ref} in `; case "ForkEvent": return ` ${event.actor.display_login} forked ${event.repo.name} to ${event.payload.forkee.full_name} `; case "IssueCommentEvent": if (event.payload.issue.pull_request) { return ` ${event.actor.display_login} commented on pull request ${escapeSpecialCharacters(event.payload.issue.title)} in `; } else { return ` ${event.actor.display_login} commented on issue ${escapeSpecialCharacters(event.payload.issue.title)} in `; } case "IssuesEvent": return ` ${event.actor.display_login} ${event.payload.action} issue ${escapeSpecialCharacters(event.payload.issue.title)} in `; case "PullRequestEvent": return ` ${event.actor.display_login} pull request ${escapeSpecialCharacters(event.payload.pull_request.title)} in `; case "PullRequestReviewEvent": return ` ${event.actor.display_login} reviewed pull request ${escapeSpecialCharacters(event.payload.pull_request.title)} in `; case "PullRequestReviewCommentEvent": return ` ${event.actor.display_login} commented on pull request ${escapeSpecialCharacters(event.payload.pull_request.title)} in `; case "PushEvent": return ` ${event.actor.display_login} pushed to ${refToBranch(event.payload.ref)} in `; case "ReleaseEvent": return ` ${event.actor.display_login} released ${event.payload.release.tag_name} in `; case "WatchEvent": return ` ${event.actor.display_login} starred the repo `; default: break; } } async function generateGitHubFeed(displayGitHubFeed) { await githubFeed; if (!githubFeed) return; const renderedEvents = []; for (const event of githubFeed) { const repoName = ` ${event.repo.name} `; renderedEvents.push(`
${event.actor.login}'s avatar

${generateEvent(event)} ${event.type !== "ForkEvent" ? repoName : ""} ${relativeDate(new Date(event.created_at))}

`); } displayGitHubFeed(`

GitHub

Last updated: ${lastGithubFeedUpdate.date} at ${lastGithubFeedUpdate.time} UTC
${renderedEvents.join("")} `); } function generateUrl(type, event) { switch(type) { case "actor": return `https://github.com/${event.actor.display_login}`; case "comment": return event.payload.comment.html_url; case "create": return `https://github.com/${event.repo.name}/tree/${event.payload.ref}`; case "forkee": return `https://github.com/${event.payload.forkee.full_name}`; case "issue": return event.payload.issue.html_url; case "pull_request": return event.payload.pull_request.html_url; case "push": return `https://github.com/${event.repo.name}/tree/${event.payload.ref.replace("refs/heads/", "")}`; case "release": return event.payload.release.html_url; case "repo": return `https://github.com/${event.repo.name}`; default: break; } } async function updateGithubFeed() { let response; try { response = await fetch(`https://api.github.com/orgs/lbryfoundation/events`, process.env.GITHUB_TOKEN && { headers: { 'Authorization': `Bearer ${process.env.GITHUB_TOKEN}` } }); } catch (err) { console.log(err); return; } githubFeed = await response.json(); const now = new Date(); lastGithubFeedUpdate = { date: now.toISOString().split("T")[0], time: now.toLocaleTimeString('en-US', { timeZone: 'UTC' }) }; } // H E L P E R function escapeSpecialCharacters(contentToEscape) { const tagsToReplace = { "&": "&", "<": "<", ">": ">" }; return contentToEscape.replace(/[&<>]/g, tag => tagsToReplace[tag] || tag); } function refToBranch(ref) { if (ref) return ref.replace("refs/heads/", ""); } // E X P O R T S export { generateEvent, generateGitHubFeed, generateUrl, updateGithubFeed };