|
// Copyright 2017 Google LLC. |
|
// |
|
// Licensed under the Apache License, Version 2.0 (the "License"); |
|
// you may not use this file except in compliance with the License. |
|
// You may obtain a copy of the License at |
|
// |
|
// https://www.apache.org/licenses/LICENSE-2.0 |
|
// |
|
// Unless required by applicable law or agreed to in writing, software |
|
// distributed under the License is distributed on an "AS IS" BASIS, |
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
// See the License for the specific language governing permissions and |
|
// limitations under the License. |
|
|
|
import * as functions from 'firebase-functions' |
|
import * as google from 'googleapis' |
|
import * as _ from 'lodash' |
|
const sheets = google.sheets('v4') |
|
|
|
const spreadsheetId = 'YOUR_SPREADSHEET_ID_HERE' |
|
|
|
const serviceAccount = require('../your_service_account_credentials.json') |
|
const jwtClient = new google.auth.JWT( |
|
serviceAccount.client_email, |
|
null, |
|
serviceAccount.private_key, |
|
['https://www.googleapis.com/auth/spreadsheets'], // read and write sheets |
|
null |
|
); |
|
|
|
const jwtAuthPromise = new Promise((resolve, reject) => { |
|
jwtClient.authorize((err, tokens) => { |
|
console.info("Tokens", tokens) |
|
if (err) { |
|
console.error(err) |
|
reject(err) |
|
return |
|
} |
|
resolve(tokens) |
|
}) |
|
}) |
|
|
|
export const copyScoresToSheet = functions.database.ref('/scores').onUpdate(event => { |
|
const data = event.data.val() |
|
console.info(data) |
|
|
|
// Sort the scores. scores is an array of arrays each containing name and score. |
|
const scores = _.map<any, [string, number]>(data, (value, key) => [String(key), value]) |
|
scores.sort((a,b) => {return b[1] - a[1]}) |
|
|
|
return jwtAuthPromise.then(tokens => { |
|
return new Promise((resolve, reject) => { |
|
sheets.spreadsheets.values.update({ |
|
auth: jwtClient, |
|
spreadsheetId: spreadsheetId, |
|
range: 'Scores!A2:B7', // update this range of cells |
|
valueInputOption: 'RAW', |
|
resource: { values: scores } |
|
}, (err, result) => { |
|
if (err) { |
|
console.log(err) |
|
reject(err) |
|
return |
|
} |
|
console.log(result) |
|
resolve(result) |
|
}) |
|
}) |
|
}) |
|
}) |