-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfacebook.js
executable file
·134 lines (121 loc) · 4.09 KB
/
facebook.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
/**
* Copyright © 2017, ACM@UIUC
*
* This file is part of the Groot Project.
*
* The Groot Project is open source software, released under the University of
* Illinois/NCSA Open Source License. You should have received a copy of
* this license in a file with the distribution.
**/
const path = require('path');
const request = require('request');
const moment = require('moment');
require('dotenv').config({path: path.resolve(__dirname) + '/.env'});
const ACCESS_TOKEN = process.env.FACEBOOK_ACCESS_TOKEN;
const PAGE_ID = process.env.FACEBOOK_ACM_PAGE_ID;
const EVENT_DATE_FORMAT = "MMMM D YYYY, h:mm A";
function parseEvent(event) {
const today = moment();
if (event.start_time) {
event.start_time = moment.parseZone(event.start_time)
.local().format(EVENT_DATE_FORMAT);
}
if (event.end_time) {
event.end_time = moment.parseZone(event.end_time)
.local().format(EVENT_DATE_FORMAT);
}
// The end time for a recurring event is the last scheduled meeting time
// Only change start and end time for this event for recurring events
// that are still continuing
if (event.event_times && moment(event.end_time).local() > today) {
event.recurring_event = true;
// Find the nearest start time and end time to today, and update the start
// and end times in the parsed event
event.event_times = event.event_times.filter((a) => {
return moment(a.start_time) > today;
}).sort((a, b) => {
var diff = new Date(a.start_time) - new Date(b.start_time);
return diff/(Math.abs(diff) || 1);
});
if (event.event_times[0].start_time) {
event.start_time = moment.parseZone(event.event_times[0].start_time)
.local().format(EVENT_DATE_FORMAT);
}
if (event.event_times[0].end_time) {
event.end_time = moment.parseZone(event.event_times[0].end_time)
.local().format(EVENT_DATE_FORMAT);
}
if (event.event_times.length > 1) {
event.next_event_start_time =
moment.parseZone(event.event_times[1].end_time)
.local().format(EVENT_DATE_FORMAT);
}
}
event.url = "https://www.facebook.com/events/" + event.id;
return event;
}
function getPageAccessToken(callback) {
request({
url: 'https://graph.facebook.com/me/accounts?access_token=' + ACCESS_TOKEN,
method: 'GET',
json: true
}, function(error, response, body) {
if (response && response.statusCode == 200) {
body.data.forEach(function(item) {
if (item.id == PAGE_ID) {
callback && callback(item.access_token);
}
});
}
});
}
function getFBEvents(page_access_token, callback) {
request({
url: 'https://graph.facebook.com/' + PAGE_ID + '?fields=events&limit=50&access_token=' + ACCESS_TOKEN,
method: 'GET',
json: true
}, function(error, response, body) {
if (response && response.statusCode == 200) {
callback && callback(body.events.data);
}
});
}
function getRawEvents(callback) {
getPageAccessToken(function(page_access_token) {
getFBEvents(page_access_token, function(raw_events) {
callback && callback(raw_events);
});
});
}
function getEvents(callback) {
getRawEvents(function(raw_events) {
var orderedEvents = [];
for (var event of raw_events) {
orderedEvents.unshift(parseEvent(event));
}
callback && callback(orderedEvents);
});
}
function getUpcomingEvents(callback) {
const today = moment();
getRawEvents(function(raw_events) {
var orderedUpcomingEvents = [];
for (var event of raw_events) {
var eventDate = moment(event.end_time).local();
if (today < eventDate) { // an upcoming event
orderedUpcomingEvents.unshift(parseEvent(event)); //to add to beginning
}
}
orderedUpcomingEvents.sort((a, b) => {
var diff = new Date(a.start_time) - new Date(b.start_time);
return diff/(Math.abs(diff) || 1);
});
callback && callback(orderedUpcomingEvents);
});
}
module.exports = {
ACCESS_TOKEN: ACCESS_TOKEN,
PAGE_ID: PAGE_ID,
getEvents: getEvents,
getUpcomingEvents: getUpcomingEvents
};