diff --git a/src/server/refresh.js b/src/server/refresh.js index 59f6c43..d7585cd 100644 --- a/src/server/refresh.js +++ b/src/server/refresh.js @@ -8,6 +8,7 @@ const dataBasePath = process.env.DATA_BASE_PATH || '../assets/data' const dataPath = process.env.DATA_PATH || '../assets/data/data.json' const logPath = process.env.LOG_PATH || '../assets/data/log.json' const configPath = process.env.CONFIG_PATH || './config.json' +const rateLimitStopError = 'RATE_LIMIT_STOP' let interval = 150 let dataBuffer = {} @@ -36,30 +37,33 @@ async function getAllContributorsInfo() { // Record time logBuffer.starttime = Date.now() + API.resetRateLimitExceeded() Promise.mapSeries(contributors, async contributor => { + if (API.isRateLimitExceeded()) { + throw new Error(rateLimitStopError) + } await Promise.delay(delay * 1000) - API.getContributorInfo(process.env.ORGANIZATION, contributor, includedRepositories, startDate).then( res => { - Config = jsonfile.readFileSync(configPath) // update Config - delay = Config.delay // update delay + const res = await API.getContributorInfo(process.env.ORGANIZATION, contributor, includedRepositories, startDate) + Config = jsonfile.readFileSync(configPath) // update Config + delay = Config.delay // update delay - if (res.avatarUrl !== '' && res.issuesNumber !== -1 && res.mergedPRsNumber !== -1 && res.openPRsNumber != -1) { + if (res && res.avatarUrl !== '' && res.issuesNumber !== -1 && res.mergedPRsNumber !== -1 && res.openPRsNumber != -1) { - dataBuffer = jsonfile.readFileSync(dataPath) + dataBuffer = jsonfile.readFileSync(dataPath) - if (Config.contributors.includes(contributor)) { - dataBuffer[`${contributor}`] = res - console.log(`${contributor} was updated: ${res.openPRsNumber} ${res.mergedPRsNumber} ${res.issuesNumber}`) + if (Config.contributors.includes(contributor)) { + dataBuffer[`${contributor}`] = res + console.log(`${contributor} was updated: ${res.openPRsNumber} ${res.mergedPRsNumber} ${res.issuesNumber}`) - // Update contributors infomation - jsonfile.writeFile(dataPath, dataBuffer, { spaces: 2 }, (err) => { - if (err) console.error(err) - }) - } + // Update contributors infomation + jsonfile.writeFile(dataPath, dataBuffer, { spaces: 2 }, (err) => { + if (err) console.error(err) + }) } - }) + } // Record time logBuffer.endtime = Date.now() @@ -67,8 +71,15 @@ async function getAllContributorsInfo() { jsonfile.writeFile(logPath, logBuffer, { spaces: 2 }, (err) => { if (err) console.error(err) }) + }).catch((err) => { + if (err.message === rateLimitStopError) { + console.log('[WARNING] Refresh cycle stopped because the GitHub API rate limit was reached.') + return + } + + throw err }) } getAllContributorsInfo() -setInterval(getAllContributorsInfo, interval * delay * 1000) \ No newline at end of file +setInterval(getAllContributorsInfo, interval * delay * 1000) diff --git a/src/server/util/API.js b/src/server/util/API.js index 71b3c8d..d476b4c 100644 --- a/src/server/util/API.js +++ b/src/server/util/API.js @@ -3,6 +3,7 @@ const chalk = require('chalk') const BASEURL = 'https://github.com' const APIHOST = 'https://api.github.com' +let rateLimitExceeded = false async function get(url, _authToken) { try { @@ -37,6 +38,9 @@ async function get(url, _authToken) { process.exit() break default: + if (message.startsWith('API rate limit exceeded')) { + rateLimitExceeded = true + } console.log(chalk.yellow('[WARNING] ' + message)) } } else { @@ -243,4 +247,8 @@ module.exports = { checkRateLimit, getStats, getRanks, + isRateLimitExceeded: () => rateLimitExceeded, + resetRateLimitExceeded: () => { + rateLimitExceeded = false + }, }