-
Notifications
You must be signed in to change notification settings - Fork 0
/
dogTracker.gs
186 lines (147 loc) · 5.16 KB
/
dogTracker.gs
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
var sheet = SpreadsheetApp.openById('[SPREADSHEET_ID]').getSheets()[0];
var webhookToken = '[SLACK_WEBHOOK_TOKEN]';
var webhookUrl = '[INCOMING_WEBHOOK_URL]';
var companyName = "Unbounce";
var timezoneName = "America/Los_Angeles";
var dateFormat = "yyyy-MM-dd";
var currentDate = Utilities.formatDate(new Date(), timezoneName, dateFormat);
var dogStatus = getDogStatus();
function doPost(request) {
var textTokenized = request.parameters.text.toString().toLowerCase().split(" ");
var params = request.parameters;
var response = "";
if (params.token == webhookToken) {
var command = textTokenized[0];
var argument = textTokenized[1];
if (command == "list") {
// List all dogs
response = listDogs();
} else if (command == "register") {
if (!dogRegistered(argument)) {
// Register a dog
response = registerDog(argument);
} else {
response = setDogInOffice(argument, request.parameters.user_name.toString());
}
} else if (command == "delete") {
response = deleteDog(argument);
} else if (command == "help") {
response = getHelp();
} else if (command != "") { // At this point we haven't matched any command, so assume the user has entered their dog's name
if (!dogRegistered(command)) {
// Register a dog
registerDog(command);
}
response = setDogInOffice(command, request.parameters.user_name.toString());
} else {
// List dogs in-office
response = getDogsInOffice();
}
}
Logger.log(response);
return ContentService.createTextOutput(response);
}
function getHelp() {
return "Command list:" +
"\n\t/dog - List all the dogs in the office today." +
"\n\t/dog list - List the dogs registered @ " + companyName + "." +
"\n\t/dog register [Dog Name] - Registers the given dog (example: /dog register bruno)." +
"\n\t/dog delete [Dog Name] - Deletes the given dog (example: /dog delete bruno)." +
"\n\t/dog [Dog Name] - Sets the given dog as in-office for the day (example: /dog bruno). If the dog is not registered, it will be.";
}
function listDogs() {
var response = "Here are the dogs registered @ " + companyName + ":";
for (var key in dogStatus) {
response += "\n\t" + capitalize(dogStatus[key].name);
}
return response;
}
function dogRegistered(dogName) {
for (var key in dogStatus) {
if (dogStatus[key].name == dogName) {
return true;
}
}
return false;
}
function registerDog(dogName) {
var availableRowIndex = getFirstEmptyRowByColumnArray();
if (dogRegistered(dogName)) {
return capitalize(dogName) + " is already registered.";
}
sheet.getRange('A' + availableRowIndex).setValue(dogName);
sheet.getRange('B' + availableRowIndex).setValue("2000-01-01");
dogStatus[dogName] = {
name: dogName,
inOffice: false,
dateCell: availableRowIndex
};
return "Registered " + capitalize(dogName) + ". Use /dog [dogName] to set them as in-office for the day.";
}
function deleteDog(dogName) {
for (var key in dogStatus) {
if (dogStatus[key].name == dogName) {
sheet.getRange('A' + dogStatus[key].dateCell).setValue("");
sheet.getRange('B' + dogStatus[key].dateCell).setValue("");
return capitalize(dogName) + " has been removed.";
}
}
return dogName + " is not registered.";
}
function getDogsInOffice() {
var dogsFound = false;
var response = "The following dogs are in the office today:";
for (var key in dogStatus) {
if (dogStatus[key].inOffice == true) {
response += "\n\t" + capitalize(dogStatus[key].name) + "!";
dogsFound = true;
}
}
if (!dogsFound) {
return "No dogs in the office today :(";
}
return response;
}
function setDogInOffice(dogName, userName) {
var dogCellIndex = dogStatus[dogName].dateCell;
sheet.getRange('B' + dogCellIndex).setValue(currentDate);
postDogInOffice(capitalize(dogName) + " is in the office today :) Thanks " + userName + "!");
return "Thanks! " + capitalize(dogName) + " has been set to in-office for the day :)";
}
function getDogStatus() {
// 500 is arbitrary, but safe to assume < 500 dogs in the office :P
var dogs = sheet.getRange(1, 1, 500);
var dogStatus = {};
for (var i = 1; i <= 500; i++) {
var dogCell = dogs.getCell(i, 1);
if (dogCell.getValue() == "") {
continue;
}
var dogDate = Utilities.formatDate(new Date(sheet.getSheetValues(i, 2, 1, 1)[0][0]), timezoneName, dateFormat);
dogStatus[dogCell.getValue()] = {};
dogStatus[dogCell.getValue()].name = dogCell.getValue();
dogStatus[dogCell.getValue()].inOffice = dogDate == currentDate;
dogStatus[dogCell.getValue()].dateCell = i;
}
return dogStatus;
}
function postDogInOffice(response) {
var url = webhookUrl;
var options = {
'method': 'post',
'payload': "{'text':'" + response + "'}"
};
var response = UrlFetchApp.fetch(url, options);
}
function getFirstEmptyRowByColumnArray() {
var column = sheet.getRange('A:A');
var values = column.getValues(); // get all data in one call
var ct = 0;
while ( values[ct] && values[ct][0] != "" ) {
ct++;
}
return (ct+1);
}
function capitalize(string) {
return string.charAt(0).toUpperCase() + string.slice(1);
}