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