-
Notifications
You must be signed in to change notification settings - Fork 0
/
calendar.js
143 lines (122 loc) · 5.65 KB
/
calendar.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
'use strict';
var ical = require('ical-generator');
var http = require('http');
var request = require('request-promise');
// Feed for the e-board
var MasterFeed = ical();
MasterFeed.setDomain('techatnyu.org').setName('Tech@NYU E-board Calendar');
// General Feed for everyone
var GeneralFeed = ical();
GeneralFeed.setDomain('techatnyu.org').setName('Tech@NYU Calendar');
// Feed for design peeps
var DesignFeed = ical();
DesignFeed.setDomain('techatnyu.org').setName('Tech@NYU Design Events');
// Feed for programming peeps
var ProgrammingFeed = ical();
ProgrammingFeed.setDomain('techatnyu.org').setName('Tech@NYU Programming Events');
// Feed for entrepreneurship peeps
var EntrepreneurshipFeed = ical();
EntrepreneurshipFeed.setDomain('techatnyu.org').setName('Tech@NYU Entrepreneurship Events');
// Prep teams array
var teamIdsToRoleNames = {};
var venueIdsToVenues = {};
request({url: 'https://api.tnyu.org/v3/teams', rejectUnauthorized: false})
.then(function(teamsBody) {
var teams = JSON.parse(teamsBody).data;
for (var i = 0; i < teams.length; i++) {
var currentTeam = teams[i];
teamIdsToRoleNames[currentTeam.id] = currentTeam.attributes.roleName;
}
return request({url: 'https://api.tnyu.org/v3/events?include=venue', rejectUnauthorized: false});
}).then(function(eventsBody) {
var JSONBody = JSON.parse(eventsBody);
var events = JSONBody.data;
var venues = JSONBody.included;
for (var i = 0; i < venues.length; i++) {
var currentVenue = venues[i];
if (currentVenue.type === 'venues') {
venueIdsToVenues[currentVenue.id] = currentVenue;
}
}
events.forEach(addEvent);
}).then(function() {
GeneralFeed.save("./calendars/general.ics");
MasterFeed.save("./calendars/master.ics");
DesignFeed.save("./calendars/design.ics");
ProgrammingFeed.save("./calendars/programming.ics");
EntrepreneurshipFeed.save("./calendars/entrepreneurship.ics");
});
function addEvent(event) {
var status = event.links.status && event.links.status.linkage && event.links.status.linkage.id;
// if the event doesn't have a start and end time, which
// (unbelievably) can happen, as such is human error, just skip it.
if (!event.attributes.startDateTime || !event.attributes.endDateTime) {
return;
}
// E-board feed
// A master calendar feed, which includes all our events,
// including internal and draft events. This will replace
// the internal Google calendar.
MasterFeed.addEvent(apiEventToFeedObject(event));
// A public calendar feed, which is the master calendar
// minus internal and draft events.
if (!event.attributes.isInternal && status !== 'draft') {
GeneralFeed.addEvent(apiEventToFeedObject(event));
}
// Starting filters
else if (event.links.teams && event.links.teams.linkage) {
for (var i = 0; i < event.links.teams.linkage.length; i++) {
// DesignDays, DemoDays, AfterHours events add to feeds: Design feed
if (teamIdsToRoleNames[event.links.teams.linkage[i].id] === 'DESIGN_DAYS' ||
teamIdsToRoleNames[event.links.teams.linkage[i].id] === 'AFTER_HOURS' ||
teamIdsToRoleNames[event.links.teams.linkage[i].id] === 'DEMO_DAYS') {
DesignFeed.addEvent(apiEventToFeedObject(event));
}
// DemoDays, HackDays, AfterHours events add to feeds: Programming
if (teamIdsToRoleNames[event.links.teams.linkage[i].id] === 'DEMO_DAYS' ||
teamIdsToRoleNames[event.links.teams.linkage[i].id] === 'AFTER_HOURS' ||
teamIdsToRoleNames[event.links.teams.linkage[i].id] === 'HACK_DAYS') {
ProgrammingFeed.addEvent(apiEventToFeedObject(event));
}
// AfterHours events add to the feed: Entrepreneurship
if (teamIdsToRoleNames[event.links.teams.linkage[i].id] === 'AFTER_HOURS' ||
teamIdsToRoleNames[event.links.teams.linkage[i].id] === 'DEMO_DAYS') {
EntrepreneurshipFeed.addEvent(apiEventToFeedObject(event));
}
// Special Case:
// Startupweek events add to feeds: Entrepreneurship
if (teamIdsToRoleNames[event.links.teams.linkage[i].id] === 'STARTUP_WEEK') {
// events hosted only by the startup week team
// (i.e. not sw + design or sw + hack, but only sw).
if (event.links.teams.linkage.length === 1) {
EntrepreneurshipFeed.addEvent(apiEventToFeedObject(event));
}
}
}
}
}
/**
* Maps the JSON for an event from our API to an object usable by the ical lib.
*/
function apiEventToFeedObject(event) {
var status = event.attributes.status;
var prepend = '';
// (Canceled events, if included, need to say [Canceled] in their title.
if (status === 'canceled') {
prepend = '[Canceled] ';
}
if (status === 'draft') {
prepend = '[Draft] ';
}
var result = {
start: new Date(event.attributes.startDateTime),
end: new Date(event.attributes.endDateTime),
summary: prepend + (event.attributes.shortTitle || event.attributes.title || ('Tech@NYU Event')),
description: event.attributes.bodyPlain,
url: event.attributes.rsvpUrl || ''
};
if (event.links && event.links.venue && event.links.venue.linkage) {
result.location = venueIdsToVenues[event.links.venue.linkage.id].attributes.address;
}
return result;
}