cabdriver
Version:
Helps you to fill in your hours with taxi
117 lines (100 loc) • 3.92 kB
JavaScript
;
const {google} = require('googleapis');
var Moment = require('moment-timezone');
var _ = require('lodash');
var helper = require('../helper');
var Source = require('./source');
class GoogleCalendar extends Source {
constructor(options, auth) {
super(options, auth);
this.type = 'calendar';
}
// eslint-disable-next-line max-lines-per-function, complexity
generateEntries(auth) {
var me = this;
var calendarArgs = {
auth: auth,
singleEvents: true,
orderBy: 'startTime'
};
calendarArgs['maxResults'] = me.options.count || 10;
if (me.options.startDate) {
calendarArgs['timeMin'] = Moment.tz(me.options.startDate, 'Europe/Zurich').startOf('day').toISOString();
} else {
calendarArgs['timeMin'] = (new Date()).toISOString();
}
if (me.options.endDate) {
var dateObj = Moment.tz(me.options.endDate, 'Europe/Zurich').add(1, 'd').startOf('day');
calendarArgs['timeMax'] = dateObj.toISOString();
}
if (me.options.calendar === true) {
me.options.calendar = 'primary';
}
calendarArgs['calendarId'] = me.options.calendar || 'primary';
helper.printVerbose('Gather Google Calendar events: [', me.options.verbose);
return me.getAllEvents(calendarArgs)
.then(function(allEvents) {
var events = _.map(allEvents, function(event) {
return me.handleEvent(event, me.options.hours);
});
helper.printVerbose(']', me.options.verbose);
return events;
})
.catch(function(err) {
throw new Error('The Google Calendar API returned an error: ' + err);
});
}
getAllEvents(calendarArgs) {
var me = this;
var allEvents = [];
const calendar = google.calendar({
version: 'v3',
auth: calendarArgs['auth']
});
function pager(res) {
helper.printVerbose('.', me.options.verbose);
if (res.data.items) {
allEvents = allEvents.concat(res.data.items);
}
if (res.data.nextPageToken) {
calendarArgs['pageToken'] = res.data.nextPageToken;
return calendar.events.list(_.clone(calendarArgs)).then(pager);
}
return allEvents;
}
return calendar.events.list(_.clone(calendarArgs)).then(pager);
}
// eslint-disable-next-line complexity
handleEvent(event, hours) {
var start = event.start.dateTime || event.start.date;
start = Moment.tz(start, 'Europe/Zurich');
var end = event.end.dateTime || event.end.date;
end = Moment.tz(end, 'Europe/Zurich');
var time;
if (hours) {
time = (Math.round(end.diff(start, 'hours', true) * 100) / 100).toString();
} else {
time = start.format('HH:mm') + '-' + end.format('HH:mm');
}
var msg = {
'project': 'xxx',
'time': time,
'text': event.summary,
'timestamp': start.startOf('day').format('X'),
'comment': false,
'type': 'calendar'
};
// check my response to event (accepted/tentative/declined)
if (_.has(event, 'attendees')) {
var selfResponse = _.find(event.attendees, function(attendee) {
return _.has(attendee, 'self') && attendee.self;
});
if (selfResponse && _.includes(['tentative', 'declined'], selfResponse.responseStatus)) {
msg.comment = true;
msg.text = msg.text + ' ('+ selfResponse.responseStatus.toUpperCase() + ')';
}
}
return msg;
}
}
module.exports = GoogleCalendar;