1+ /**
2+ * Responds to an ADDED_TO_SPACE event in Chat.
3+ * @param {object} event the event object from Chat
4+ * @return {object} JSON-formatted response
5+ * @see https://developers.google.com/hangouts/chat/reference/message-formats/events
6+ */
7+ function onAddToSpace(event) {
8+ let message = 'Thank you for adding me to ';
9+ if (event.space.type === 'DM') {
10+ message += 'a DM, ' + event.user.displayName + '!';
11+ } else {
12+ message += event.space.displayName;
13+ }
14+ return { text: message };
15+ }
16+
17+ /**
18+ * Responds to a REMOVED_FROM_SPACE event in Chat.
19+ * @param {object} event the event object from Chat
20+ * @param {object} event the event object from Chat
21+ * @see https://developers.google.com/hangouts/chat/reference/message-formats/events
22+ */
23+ function onRemoveFromSpace(event) {
24+ console.log('App removed from ', event.space.name);
25+ }
26+
27+
28+ /**
29+ * Responds to a MESSAGE event triggered in Chat.
30+ * @param {object} event the event object from Chat
31+ * @return {function} call the respective function
32+ */
33+ function onMessage(event) {
34+ const message = event.message;
35+
36+ if (message.slashCommand) {
37+ switch (message.slashCommand.commandId) {
38+ case 1: // Help command
39+ return createHelpCard();
40+ case 2: // Block out day command
41+ return blockDayOut();
42+ case 3: // Cancel all meetings command
43+ return cancelAllMeetings();
44+ case 4: // Set auto reply command
45+ return setAutoReply();
46+ }
47+ }
48+ }
49+
50+ function createHelpCard() {
51+ return {
52+ "cardsV2": [
53+ {
54+ "cardId": "2",
55+ "card": {
56+ "sections": [
57+ {
58+ "header": "",
59+ "widgets": [
60+ {
61+ "decoratedText": {
62+ "topLabel": "",
63+ "text": "Hi! 👋 I'm here to help you with your out of office tasks.<br><br>Here's a list of commands I understand.",
64+ "wrapText": true
65+ }
66+ }
67+ ]
68+ },
69+ {
70+ "widgets": [
71+ {
72+ "decoratedText": {
73+ "topLabel": "",
74+ "text": "<b>/blockDayOut</b>: I will block out your calendar for you.",
75+ "wrapText": true
76+ }
77+ },
78+ {
79+ "decoratedText": {
80+ "topLabel": "",
81+ "text": "<b>/cancelAllMeetings</b>: I will cancel all your meetings for the day.",
82+ "wrapText": true
83+ }
84+ },
85+ {
86+ "decoratedText": {
87+ "topLabel": "",
88+ "text": "<b>/setAutoReply</b>: Set an out of office auto reply in Gmail.",
89+ "wrapText": true
90+ }
91+ }
92+ ]
93+ }
94+ ],
95+ "header": {
96+ "title": "OOO app",
97+ "subtitle": "Helping you manage your OOO",
98+ "imageUrl": "https://goo.gle/3SfMkjb",
99+ "imageType": "SQUARE"
100+ }
101+ }
102+ }
103+ ]
104+ }
105+ }
106+
107+ /**
108+ * Adds an all day event to the users Google Calendar.
109+ * @return {object} JSON-formatted response
110+ */
111+ function blockDayOut() {
112+ blockOutCalendar();
113+ return createResponseCard('Your calendar has been blocked out for you.')
114+ }
115+
116+ /**
117+ * Cancels all of the users meeting for the current day.
118+ * @return {object} JSON-formatted response
119+ */
120+ function cancelAllMeetings() {
121+ cancelMeetings();
122+ return createResponseCard('All your meetings have been canceled.')
123+ }
124+
125+ /**
126+ * Sets an out of office auto reply in the users Gmail account.
127+ * @return {object} JSON-formatted response
128+ */
129+ function setAutoReply() {
130+ turnOnAutoResponder();
131+ return createResponseCard('The out of office auto reply has been turned on.')
132+ }
133+
134+
135+ const ONE_DAY_MILLIS = 24 * 60 * 60 * 1000;
136+
137+ /**
138+ * Places an all-day meeting on the user's Calendar.
139+ */
140+ function blockOutCalendar() {
141+ CalendarApp.createAllDayEvent('I am out of office today', new Date(), new Date(Date.now() + ONE_DAY_MILLIS));
142+ }
143+
144+ /**
145+ * Declines all meetings for the day.
146+ */
147+
148+ function cancelMeetings() {
149+ const events = CalendarApp.getEventsForDay(new Date());
150+
151+ events.forEach(function(event) {
152+ if (event.getGuestList().length > 0) {
153+ event.setMyStatus(CalendarApp.GuestStatus.NO);
154+ }
155+ });
156+ }
157+
158+ /**
159+ * Turns on the user's vacation response for today in Gmail.
160+ */
161+ function turnOnAutoResponder() {
162+ const currentTime = (new Date()).getTime();
163+ Gmail.Users.Settings.updateVacation({
164+ enableAutoReply: true,
165+ responseSubject: 'I am out of the office today',
166+ responseBodyHtml: 'I am out of the office today; will be back on the next business day.<br><br><i>Created by OOO Chat app!</i>',
167+ restrictToContacts: true,
168+ restrictToDomain: true,
169+ startTime: currentTime,
170+ endTime: currentTime + ONE_DAY_MILLIS
171+ }, 'me');
172+ }
173+
174+ function createResponseCard(responseText) {
175+ return {
176+ "cardsV2": [
177+ {
178+ "cardId": "1",
179+ "card": {
180+ "sections": [
181+ {
182+ "widgets": [
183+ {
184+ "decoratedText": {
185+ "topLabel": "",
186+ "text": responseText,
187+ "startIcon": {
188+ "knownIcon": "NONE",
189+ "altText": "Task done",
190+ "iconUrl": "https://fonts.gstatic.com/s/i/short-term/web/system/1x/task_alt_gm_grey_48dp.png"
191+ },
192+ "wrapText": true
193+ }
194+ }
195+ ]
196+ }
197+ ],
198+ "header": {
199+ "title": "OOO app",
200+ "subtitle": "Helping you manage your OOO",
201+ "imageUrl": "https://goo.gle/3SfMkjb",
202+ "imageType": "CIRCLE"
203+ }
204+ }
205+ }
206+ ]
207+ }
208+ }
209+
210+
0 commit comments