content/hifi-content/rebecca/bingo/bingoSheet.js
2022-02-14 02:04:11 +01:00

196 lines
6.6 KiB
JavaScript

// Adapted by Rebecca Stankus on 10/19/18 from AttendeeLookupAndCheckin.gs by Robin Wilson 08-28-2018
var bingoSpreadsheetID = "1RWSOO2yyv78ZSOvMhWOUkQkSJ0Q7_zX0GpB37QbtuRE";
var spreadsheet = SpreadsheetApp.openById(bingoSpreadsheetID);
var sheetInProgress = spreadsheet.getSheetByName("InProgress");
var data = sheetInProgress.getDataRange().getValues();
var col_Usernames = sheetInProgress.getRange("Usernames").getColumn();
var col_cardNumbers = sheetInProgress.getRange("Cards").getColumn();
var col_cardColors = sheetInProgress.getRange("CardColors").getColumn();
var userCardNumbers = [];
// *************************************
// START UTILITY FUNCTIONS
// *************************************
/* DOES ARRAY CONTAIN A NUMBER: Search through an array for a specific number and return the result */
function contains(array, number) {
for (var i = 0 ; i < array.length; i++) {
if (array[i] === number) {
return true;
}
}
return false;
}
// *************************************
// END UTILITY FUNCTIONS
// *************************************
function doGet(e) {
var type = e.parameter.type;
if (type === "searchOrAdd" || type === "searchOnly") {
var username = e.parameter.username;
if (username) {
var usernameRow = getUsernameRow(username);
if (usernameRow === -1 && type === "searchOrAdd") {
return addUser(e);
} else if (usernameRow === -1 && type === "searchOnly") {
return ContentService.createTextOutput(JSON.stringify({
status: "success",
newUser: true
})).setMimeType(ContentService.MimeType.JSON);
} else {
var numbersCell = sheetInProgress.getRange(usernameRow + 1, col_cardNumbers);
var colorCell = sheetInProgress.getRange(usernameRow + 1, col_cardColors);
return ContentService.createTextOutput(JSON.stringify({
status: "success",
newUser: false,
userCardNumbers: JSON.parse(numbersCell.getValue()),
userCardColor: JSON.parse(colorCell.getValue()),
})).setMimeType(ContentService.MimeType.JSON);
}
} else {
return ContentService.createTextOutput(JSON.stringify({
status: "error"
})).setMimeType(ContentService.MimeType.JSON);
}
} else if (type === "newRound") {
return newRound(e);
}
}
// e.postData.contents will always be JSON.
function doPost(e) {
var data = JSON.parse(e.postData.contents);
if (data.type === "recordPrizes") {
if (!data.winners) {
return ContentService.createTextOutput(JSON.stringify({
status: "error",
text: "No winners array provided."
})).setMimeType(ContentService.MimeType.JSON);
}
sheetInProgress.appendRow(["WINNER USERNAME", "PRIZE WON"]);
var winnersArray = data.winners;
for (var i = 0; i < winnersArray.length; i++) {
sheetInProgress.appendRow([winnersArray[i].username, winnersArray[i].prizeWon]);
}
return ContentService.createTextOutput(JSON.stringify({
status: "success"
})).setMimeType(ContentService.MimeType.JSON);
} else {
return ContentService.createTextOutput(JSON.stringify({
status: "error",
text: "Invalid type provided."
})).setMimeType(ContentService.MimeType.JSON);
}
}
/* GET A RANDOM BINGO NUMBER: Selects a random number from the possible combinations for the current column. Each letter
column has 15 possible numbers, so possibilities are B 1-15, I 16-30, N 31-45, G 46-60, and O 61-75. After a random
number is selected, checks that the number has not already been used and, if not, returns the new number */
var COLUMN_RANGE = 15;
var rowMinimum;
function getRandomNumber() {
var randomNumber = Math.floor(Math.random() * Number(COLUMN_RANGE) + Number(rowMinimum));
if (!contains(userCardNumbers, randomNumber)) {
userCardNumbers.push(randomNumber);
return randomNumber;
}
return getRandomNumber();
}
/* GET A RANDOM BINGO CARD COLOR */
var CARD_YELLOW = { "blue": 66, "green": 255, "red": 227 };
var CARD_BLUE = { "blue": 247, "green": 196, "red": 0 };
var CARD_GREEN = { "blue": 0, "green": 255, "red": 30 };
var CARD_PINK = { "blue": 119, "green": 0, "red": 255 };
function getRandomColor() {
var colorChange = Math.floor(Math.random() * 4);
var newColor;
switch (colorChange) {
case 0:
newColor = CARD_YELLOW;
break;
case 1:
newColor = CARD_BLUE;
break;
case 2:
newColor = CARD_GREEN;
break;
case 3:
newColor = CARD_PINK;
break;
default:
newColor = CARD_PINK;
}
return newColor;
}
var BINGO_STRING = "BINGO";
function addUser(userData) {
if (search(userData.parameter.username, col_Usernames) === -1) {
userCardNumbers = [];
rowMinimum = 1;
for (var i = 0; i < BINGO_STRING.length; i++) {
var rows = 5;
for (var currentRow = 0; currentRow < rows; currentRow++) {
if (!(i === 2 && currentRow === 2)) {
getRandomNumber();
}
}
rowMinimum += COLUMN_RANGE;
}
var userCardColor = getRandomColor();
sheetInProgress.appendRow([userData.parameter.username, JSON.stringify(userCardNumbers), JSON.stringify(userCardColor)]);
return ContentService.createTextOutput(JSON.stringify({
status: "success",
newUser: true,
userCardNumbers: userCardNumbers,
userCardColor: userCardColor
})).setMimeType(ContentService.MimeType.JSON);
} else {
return ContentService.createTextOutput("Not a new user");
}
}
function getUsernameRow(username) {
var searchUsername = username.toString().toLowerCase();
return search(searchUsername, col_Usernames);
}
function search(searchTerm, searchCol) {
for(var row = 0; row < data.length; row++) {
var rowData = data[row];
var cur = rowData[searchCol - 1];
if (cur) cur = cur.toLowerCase();
if (cur === searchTerm) return row;
}
return -1;
}
function newRound(newRoundData) {
var calledLettersAndNumbers = newRoundData.parameter.calledLettersAndNumbers;
if (calledLettersAndNumbers !== "[]") {
sheetInProgress.appendRow(["Called Letters and Numbers", calledLettersAndNumbers]);
var tabName = Utilities.formatDate(new Date(), 'America/Los_Angeles', 'MMMM dd, yyyy HH:mm:ss');
var copy = sheetInProgress.copyTo(spreadsheet);
copy.setName(tabName);
sheetInProgress.clear();
return ContentService.createTextOutput(JSON.stringify({
status: "success"
})).setMimeType(ContentService.MimeType.JSON);
} else {
sheetInProgress.clear();
}
}