UNPKG

cabdriver

Version:

Helps you to fill in your hours with taxi

239 lines (217 loc) 8.39 kB
'use strict'; const { Octokit } = require('@octokit/rest'); var Moment = require('moment-timezone'); var Promise = require('bluebird'); var _ = require('lodash'); var helper = require('../helper'); var Source = require('./source'); class Github extends Source { constructor(options, auth, api) { super(options, auth); this.type = 'github'; this.api = api; } generateEntries(auth) { var me = this; if (!me.api) { me.api = new Octokit({ auth: auth }); } return me.getGitHubUsername() .then(function(username) { helper.printVerbose('Gather GitHub events: [', me.options.verbose); return me.getUserEvents(username); }) .then(function(events) { var eventMsgs = _.map(events, me.mapUserEvents()); var uniqueResults = _.uniqWith(eventMsgs, _.isEqual); var msgs = _.filter(uniqueResults, function(item) { return !_.isEmpty(item); }); helper.printVerbose(']', me.options.verbose); return msgs; }); } mapUserEvents() { var me = this; return function(userEvent) { var text = me.eventDescription(userEvent); var timestamp = Moment(userEvent.created_at).tz('Europe/Zurich').startOf('day').format('X'); var repoName = userEvent.repo.name.split('/')[1]; var msg = { 'project': repoName, 'time': '1', 'text': text, 'timestamp': timestamp, 'type': 'github', 'comment': false }; return msg; }; } // eslint-disable-next-line max-lines-per-function, complexity eventDescription(userEvent) { var eventType = userEvent.type; var payload = userEvent.payload; var text = ''; if (payload.issue) { var issueId = payload.number || payload.issue.number; text = '#' + issueId + ': ' + payload.issue.title + ', '; } else if (payload.pull_request) { text = '#' + payload.pull_request.number + ': ' + payload.pull_request.title + ', '; } switch (eventType) { case 'CommitCommentEvent': text += 'commit comment ' + payload.action; break; case 'CreateEvent': text += 'created ' + payload.ref_type + ' ' + (payload.ref ? payload.ref : ''); break; case 'DeleteEvent': text += 'deleted ' + payload.ref_type + ' ' + payload.ref; break; case 'DeploymentEvent': text += 'deployment'; break; case 'DeploymentStatusEvent': text += 'deployment status'; break; case 'ForkEvent': text += 'forked repo ' + payload.forkee.name; break; case 'GistEvent': text += 'gist ' + payload.gist.description + ' ' + payload.action; break; case 'GollumEvent': text += 'edited the wiki'; break; case 'InstallationEvent': text += 'GitHub app installation ' + payload.action; break; case 'InstallationRepositoriesEvent': text += 'GitHub app repo installation ' + payload.action; break; case 'IssueCommentEvent': text += 'comment ' + payload.action; break; case 'IssuesEvent': text += 'issue ' + payload.action; break; case 'LabelEvent': text += payload.label.name + ' ' + payload.action; break; case 'MarketplacePurchaseEvent': text += 'marketplace plan ' + payload.action; break; case 'MemberEvent': text += payload.member.login + ' ' + payload.action; break; case 'MembershipEvent': text += payload.member.login + ' ' + payload.action + (payload.action === 'added' ? ' to ' : ' from '); text += payload.scope + ' ' + payload.team.name; break; case 'MilestoneEvent': text += 'milestone ' + payload.action; break; case 'OrganizationEvent': var orgAction = payload.action.replace('member_', ''); text += 'user ' + orgAction + (orgAction === 'removed' ? ' from ' :' to ') + 'organization'; break; case 'OrgBlockEvent': text += payload.blocked_user.login + ' ' + payload.action; break; case 'PageBuildEvent': text += 'page build'; break; case 'ProjectCardEvent': text += 'project card ' + payload.action; break; case 'ProjectColumnEvent': text += 'project column ' + payload.action; break; case 'ProjectEvent': text += 'project ' + payload.action; break; case 'PublicEvent': text += 'repository ' + payload.repository.full_name + ' open sourced (yay!)'; break; case 'PullRequestEvent': var prAction = payload.action.replace('_', ' '); text += 'pull request ' + prAction; break; case 'PullRequestReviewEvent': text += 'review ' + payload.action; break; case 'PullRequestReviewCommentEvent': text += 'review comment ' + payload.action; break; case 'PushEvent': text += 'pushed code to ' + payload.ref.replace('refs/heads/', ''); break; case 'ReleaseEvent': text += 'release ' + payload.action; break; case 'RepositoryEvent': text += 'repository ' + payload.repository.full_name + ' ' + payload.action; break; case 'StatusEvent': text += 'git commit status \'' + payload.state + '\''; break; case 'TeamEvent': text += 'team ' + payload.team.name + ' ' + payload.action; break; case 'TeamAddEvent': text += 'repository ' + payload.repository.full_name + ' added to team ' + payload.team.name; break; case 'WatchEvent': text += 'repository ' + userEvent.repo.name + ' starred'; break; default: text += 'unkown event type \'' + eventType + '\''; break; } return text; } getGitHubUsername() { var me = this; var cacheResult = me.options.cache.getSync('github-username'); if (cacheResult) { helper.printVerbose('loaded github username from cache', me.options.verbose); return Promise.resolve(cacheResult); } return me.api.users.getAuthenticated() .then(function(result) { var githubUsername = result.data.login; me.options.cache.putSync('github-username', githubUsername); return githubUsername; }); } getUserEvents(username) { var me = this; var start = Moment(me.options.startDate).tz('Europe/Zurich'); var end = Moment(me.options.endDate).tz('Europe/Zurich').add(1, 'd'); var activityPromise = me.api.activity.listEventsForAuthenticatedUser.endpoint.merge({ username: username }); var cacheResult = me.options.cache.getSync('github-events'); if (cacheResult) { helper.printVerbose('loaded from cache', me.options.verbose); return Promise.resolve(cacheResult); } return me.api.paginate(activityPromise) .then(function(result) { var userEvents = _.filter( result, function(userEvent) { var isUser = (userEvent.actor.login === username); var created = Moment(userEvent.created_at).tz('Europe/Zurich'); var inTimeRange = created.isBetween(start.startOf('day'), end, null, '[]'); return (isUser && inTimeRange); } ); return userEvents; }); } } module.exports = Github;