monkeytype/functions/index.js

1041 lines
28 KiB
JavaScript
Raw Normal View History

2020-07-03 08:35:45 +08:00
const functions = require("firebase-functions");
const admin = require("firebase-admin");
let key = "./serviceAccountKey.json";
2020-07-03 08:35:45 +08:00
if (process.env.GCLOUD_PROJECT === "monkey-type") {
key = "./serviceAccountKey_live.json";
}
var serviceAccount = require(key);
admin.initializeApp({
2020-07-03 08:35:45 +08:00
credential: admin.credential.cert(serviceAccount),
});
// // Create and Deploy Your First Cloud Functions
// // https://firebase.google.com/docs/functions/write-firebase-functions
//
// exports.helloWorld = functions.https.onRequest((request, response) => {
// response.send("Hello from Firebase!");
// });
2020-07-03 08:35:45 +08:00
exports.moveResults = functions
.runWith({ timeoutSeconds: 540, memory: "2GB" })
.https.onCall((request, response) => {
return admin
.firestore()
.collection("results")
.orderBy("timestamp", "desc")
.limit(2000)
.get()
.then((data) => {
data.docs.forEach((doc) => {
let result = doc.data();
if (result.moved === undefined || result.moved === false) {
admin
.firestore()
.collection(`results`)
.doc(doc.id)
.update({ moved: true });
admin
.firestore()
.collection(`users/${result.uid}/results`)
.add(result);
console.log(`moving doc ${doc.id}`);
}
});
return;
});
});
function getAllNames() {
return admin
.auth()
.listUsers()
.then((data) => {
let names = [];
data.users.forEach((user) => {
names.push(user.displayName);
});
return names;
});
}
2020-07-03 08:35:45 +08:00
function getAllUsers() {
return admin
.auth()
.listUsers()
.then((data) => {
return data.users;
});
}
2020-07-03 08:35:45 +08:00
function isUsernameValid(name) {
if (name === null || name === undefined || name === "") return false;
if (/miodec/.test(name)) return false;
if (name.length > 12) return false;
return /^[0-9a-zA-Z_.-]+$/.test(name);
}
2020-07-03 08:35:45 +08:00
exports.checkNameAvailability = functions.https.onCall((request, response) => {
// 1 - available
// -1 - unavailable (taken)
// -2 - not valid name
// -999 - unknown error
try {
if (!isUsernameValid(request.name)) return -2;
return getAllNames().then((data) => {
let available = 1;
data.forEach((name) => {
try {
if (name.toLowerCase() === request.name.toLowerCase()) available = -1;
} catch (e) {
//
}
2020-07-03 08:35:45 +08:00
});
return available;
});
} catch (e) {
return -999;
}
});
exports.changeName = functions.https.onCall((request, response) => {
try {
if (!isUsernameValid(request.name)) {
console.warn(
`${request.uid} tried to change their name to ${request.name} - not valid`
);
return 0;
}
2020-07-03 08:35:45 +08:00
return getAllNames().then((data) => {
let available = 1;
data.forEach((name) => {
try {
if (name.toLowerCase() === request.name.toLowerCase()) available = 0;
} catch (e) {
//
}
});
if (available === 1) {
return admin
.auth()
.updateUser(request.uid, {
displayName: request.name,
})
.then((d) => {
console.log(
`${request.uid} changed their name to ${request.name} - done`
);
return 1;
})
.catch((e) => {
console.error(
`${request.uid} tried to change their name to ${request.name} - ${e.message}`
);
return -1;
});
} else {
console.warn(
`${request.uid} tried to change their name to ${request.name} - already taken`
);
return 0;
}
});
} catch (e) {
console.error(
`${request.uid} tried to change their name to ${request.name} - ${e}`
);
return -1;
}
});
2020-07-03 08:35:45 +08:00
exports.checkIfNeedsToChangeName = functions.https.onCall(
(request, response) => {
try {
return admin
2020-07-04 05:09:29 +08:00
.firestore()
.collection("users")
.doc(request.uid)
.get()
.then((doc) => {
if (doc.data().name === undefined) {
return admin
.auth()
.getUser(request.uid)
.then((requestUser) => {
if (!isUsernameValid(requestUser.displayName)) {
//invalid name, needs to change
2020-07-03 08:35:45 +08:00
console.log(
`user ${requestUser.uid} ${requestUser.displayName} needs to change name`
);
2020-07-04 05:09:29 +08:00
return 1;
2020-07-03 08:35:45 +08:00
} else {
2020-07-04 05:09:29 +08:00
//valid name, but need to change if not duplicate
return getAllUsers()
.then((users) => {
let sameName = [];
//look for name names
users.forEach((user) => {
if (user.uid !== requestUser.uid) {
try {
if (
user.displayName.toLowerCase() ===
requestUser.displayName.toLowerCase()
) {
sameName.push(user);
}
} catch (e) {
//
2020-07-04 05:09:29 +08:00
}
}
});
if (sameName.length === 0) {
2020-07-04 05:09:29 +08:00
admin
.firestore()
.collection("users")
.doc(request.uid)
.update({ name: requestUser.displayName })
.then(() => {
return 0;
});
} else {
//check when the request user made the account compared to others
let earliestTimestamp = 999999999999999;
sameName.forEach((sn) => {
let ts =
new Date(sn.metadata.creationTime).getTime() / 1000;
if (ts <= earliestTimestamp) {
earliestTimestamp = ts;
}
});
if (
new Date(
requestUser.metadata.creationTime
).getTime() /
1000 >
earliestTimestamp
) {
console.log(
`user ${requestUser.uid} ${requestUser.displayName} needs to change name`
);
return 2;
} else {
admin
.firestore()
.collection("users")
.doc(request.uid)
.update({ name: requestUser.displayName })
.then(() => {
return 0;
});
}
2020-07-04 05:09:29 +08:00
}
})
.catch((e) => {
console.error(`error getting all users - ${e}`);
});
2020-07-03 08:35:45 +08:00
}
2020-07-04 05:09:29 +08:00
});
} else {
console.log("name is good");
return 0;
2020-07-03 08:35:45 +08:00
}
});
2020-07-03 08:35:45 +08:00
} catch (e) {
return -1;
}
2020-07-03 08:35:45 +08:00
}
);
function checkIfPB(uid, obj) {
return admin
.firestore()
.collection(`users`)
.doc(uid)
.get()
.then((data) => {
let pbs = null;
try {
pbs = data.data().personalBests;
if (pbs === undefined) {
throw new Error("pb is undefined");
2020-06-08 09:24:24 +08:00
}
2020-07-03 08:35:45 +08:00
} catch (e) {
return admin
.firestore()
.collection("users")
.doc(uid)
.update({
personalBests: {
[obj.mode]: {
[obj.mode2]: [
{
2020-06-08 09:24:24 +08:00
language: obj.language,
difficulty: obj.difficulty,
punctuation: obj.punctuation,
2020-07-03 08:35:45 +08:00
wpm: obj.wpm,
},
],
},
},
})
.then((e) => {
return true;
})
.catch((e) => {
return admin
.firestore()
.collection("users")
.doc(uid)
.set({
personalBests: {
[obj.mode]: {
[obj.mode2]: [
{
language: obj.language,
difficulty: obj.difficulty,
punctuation: obj.punctuation,
wpm: obj.wpm,
},
],
},
},
})
.then((e) => {
2020-06-08 09:24:24 +08:00
return true;
2020-07-03 08:35:45 +08:00
});
});
}
// //check mode, mode2, punctuation, language and difficulty
let toUpdate = false;
let found = false;
try {
pbs[obj.mode][obj.mode2].forEach((pb) => {
if (
pb.punctuation === obj.punctuation &&
pb.difficulty === obj.difficulty &&
pb.language === obj.language
) {
//entry like this already exists, compare wpm
found = true;
if (pb.wpm < obj.wpm) {
//new pb
pb.wpm = obj.wpm;
toUpdate = true;
} else {
//no pb
return false;
}
}
});
//checked all pbs, nothing found - meaning this is a new pb
if (!found) {
pbs[obj.mode][obj.mode2].push({
language: obj.language,
difficulty: obj.difficulty,
punctuation: obj.punctuation,
wpm: obj.wpm,
});
toUpdate = true;
2020-06-08 09:24:24 +08:00
}
2020-07-03 08:35:45 +08:00
} catch (e) {
// console.log(e);
pbs[obj.mode] = {};
pbs[obj.mode][obj.mode2] = [
{
language: obj.language,
difficulty: obj.difficulty,
punctuation: obj.punctuation,
wpm: obj.wpm,
},
];
toUpdate = true;
}
if (toUpdate) {
return admin
.firestore()
.collection("users")
.doc(uid)
.update({ personalBests: pbs })
.then((e) => {
return true;
});
} else {
return false;
}
});
}
2020-07-03 08:35:45 +08:00
exports.testCompleted = functions.https.onCall((request, response) => {
try {
if (request.uid === undefined || request.obj === undefined) {
console.error(`error saving result for ${request.uid} - missing input`);
2020-07-04 02:15:46 +08:00
return { resultCode: -1 };
2020-07-03 08:35:45 +08:00
}
2020-07-03 08:35:45 +08:00
let obj = request.obj;
2020-07-03 08:35:45 +08:00
let err = false;
Object.keys(obj).forEach((key) => {
let val = obj[key];
if (Array.isArray(val)) {
val.forEach((valarr) => {
if (!/^[0-9a-zA-Z._]+$/.test(valarr)) err = true;
});
} else {
if (val === undefined || !/^[0-9a-zA-Z._]+$/.test(val)) err = true;
}
});
if (err) {
console.error(
`error saving result for ${request.uid} - bad input - ${JSON.stringify(
request.obj
)}`
);
2020-07-04 02:15:46 +08:00
return { resultCode: -1 };
2020-07-03 08:35:45 +08:00
}
2020-07-03 08:35:45 +08:00
if (obj.wpm <= 0 || obj.wpm > 350 || obj.acc < 50 || obj.acc > 100) {
2020-07-04 02:15:46 +08:00
return { resultCode: -1 };
2020-07-03 08:35:45 +08:00
}
2020-07-03 08:35:45 +08:00
return admin
.firestore()
.collection(`users/${request.uid}/results`)
.add(obj)
.then((e) => {
2020-07-04 06:41:42 +08:00
return Promise.all([
checkLeaderboards(request.obj, "global"),
checkLeaderboards(request.obj, "daily"),
checkIfPB(request.uid, request.obj),
]).then((values) => {
let globallb = values[0];
let dailylb = values[1];
let ispb = values[2];
2020-07-04 06:41:42 +08:00
// console.log(values);
let returnobj = {
resultCode: null,
globalLeaderboard: globallb,
dailyLeaderboard: dailylb,
};
if (ispb) {
console.log(
`saved result for ${request.uid} (new PB) - ${JSON.stringify(
request.obj
)}`
);
returnobj.resultCode = 2;
} else {
console.log(
`saved result for ${request.uid} - ${JSON.stringify(request.obj)}`
);
returnobj.resultCode = 1;
}
2020-07-04 06:41:42 +08:00
// console.log(returnobj);
return returnobj;
});
2020-07-03 08:35:45 +08:00
})
.catch((e) => {
console.error(
`error saving result when checking for PB for ${request.uid} - ${e.message}`
);
2020-07-04 02:15:46 +08:00
return { resultCode: -1 };
2020-07-03 08:35:45 +08:00
});
} catch (e) {
console.error(`error saving result for ${request.uid} - ${e}`);
2020-07-04 02:15:46 +08:00
return { resultCode: -1 };
2020-07-03 08:35:45 +08:00
}
});
2020-06-12 01:48:15 +08:00
2020-07-03 08:35:45 +08:00
function isTagValid(name) {
if (name === null || name === undefined || name === "") return false;
if (name.length > 16) return false;
return /^[0-9a-zA-Z_.-]+$/.test(name);
2020-06-12 01:48:15 +08:00
}
2020-07-03 08:35:45 +08:00
exports.addTag = functions.https.onCall((request, response) => {
try {
if (!isTagValid(request.name)) {
return { resultCode: -1 };
} else {
return admin
.firestore()
.collection(`users/${request.uid}/tags`)
.add({
name: request.name,
})
.then((e) => {
console.log(`user ${request.uid} created a tag: ${request.name}`);
return {
resultCode: 1,
id: e.id,
};
})
.catch((e) => {
console.error(
`error while creating tag for user ${request.uid}: ${e.message}`
);
return { resultCode: -999 };
});
2020-06-12 01:48:15 +08:00
}
2020-07-03 08:35:45 +08:00
} catch (e) {
console.error(`error adding tag for ${request.uid} - ${e}`);
return { resultCode: -999 };
}
});
2020-07-03 08:35:45 +08:00
exports.editTag = functions.https.onCall((request, response) => {
try {
if (!isTagValid(request.name)) {
return { resultCode: -1 };
} else {
return admin
.firestore()
.collection(`users/${request.uid}/tags`)
.doc(request.tagid)
.update({
name: request.name,
})
.then((e) => {
console.log(`user ${request.uid} updated a tag: ${request.name}`);
return {
resultCode: 1,
};
})
.catch((e) => {
console.error(
`error while updating tag for user ${request.uid}: ${e.message}`
);
return { resultCode: -999 };
});
}
2020-07-03 08:35:45 +08:00
} catch (e) {
console.error(`error updating tag for ${request.uid} - ${e}`);
return { resultCode: -999 };
}
});
2020-06-24 07:54:32 +08:00
2020-07-03 08:35:45 +08:00
exports.removeTag = functions.https.onCall((request, response) => {
try {
return admin
.firestore()
.collection(`users/${request.uid}/tags`)
.doc(request.tagid)
.delete()
.then((e) => {
console.log(`user ${request.uid} deleted a tag`);
return {
resultCode: 1,
};
})
.catch((e) => {
console.error(
`error deleting tag for user ${request.uid}: ${e.message}`
);
return { resultCode: -999 };
});
} catch (e) {
console.error(`error deleting tag for ${request.uid} - ${e}`);
return { resultCode: -999 };
}
});
exports.updateResultTags = functions.https.onCall((request, response) => {
try {
let validTags = true;
request.tags.forEach((tag) => {
if (!/^[0-9a-zA-Z]+$/.test(tag)) validTags = false;
});
if (validTags) {
return admin
.firestore()
.collection(`users/${request.uid}/results`)
.doc(request.resultid)
.update({
tags: request.tags,
2020-06-24 07:54:32 +08:00
})
2020-07-03 08:35:45 +08:00
.then((e) => {
console.log(
`user ${request.uid} updated tags for result ${request.resultid}`
);
return {
resultCode: 1,
};
})
.catch((e) => {
console.error(
`error while updating tags for result by user ${request.uid}: ${e.message}`
);
return { resultCode: -999 };
});
} else {
console.error(`invalid tags for user ${request.uid}: ${request.tags}`);
return { resultCode: -1 };
2020-06-24 07:54:32 +08:00
}
2020-07-03 08:35:45 +08:00
} catch (e) {
console.error(`error updating tags by ${request.uid} - ${e}`);
return { resultCode: -999 };
}
});
2020-06-28 06:45:24 +08:00
2020-07-03 08:35:45 +08:00
function isConfigKeyValid(name) {
if (name === null || name === undefined || name === "") return false;
if (name.length > 30) return false;
return /^[0-9a-zA-Z_.\-#]+$/.test(name);
2020-06-28 06:45:24 +08:00
}
2020-07-03 08:35:45 +08:00
exports.saveConfig = functions.https.onCall((request, response) => {
try {
if (request.uid === undefined || request.obj === undefined) {
console.error(`error saving config for ${request.uid} - missing input`);
return -1;
}
2020-06-28 06:45:24 +08:00
2020-07-03 08:35:45 +08:00
let obj = request.obj;
let err = false;
Object.keys(obj).forEach((key) => {
let val = obj[key];
if (Array.isArray(val)) {
val.forEach((valarr) => {
if (!isConfigKeyValid(valarr)) {
err = true;
console.error(`${key}: ${valarr} failed regex check`);
}
2020-06-28 06:45:24 +08:00
});
2020-07-03 08:35:45 +08:00
} else {
if (!isConfigKeyValid(val)) {
err = true;
console.error(`${key}: ${val} failed regex check`);
}
}
});
if (err) {
console.error(
`error saving config for ${request.uid} - bad input - ${JSON.stringify(
request.obj
)}`
);
return -1;
2020-06-28 06:45:24 +08:00
}
2020-07-03 08:35:45 +08:00
return admin
.firestore()
.collection(`users`)
.doc(request.uid)
.set(
{
config: obj,
},
{ merge: true }
)
.then((e) => {
return 1;
})
.catch((e) => {
console.error(
`error saving config to DB for ${request.uid} - ${e.message}`
);
return -1;
});
} catch (e) {
console.error(`error saving config for ${request.uid} - ${e}`);
return { resultCode: -999 };
}
});
2020-06-28 06:45:24 +08:00
2020-07-04 02:15:46 +08:00
class Leaderboard {
constructor(size, mode, mode2, type, starting) {
this.size = size;
this.board = [];
this.mode = mode;
this.mode2 = mode2;
this.type = type;
if (starting !== undefined && starting !== null) {
starting.forEach((entry) => {
if (entry.mode === this.mode && entry.mode2 === this.mode2) {
this.board.push({
uid: entry.uid,
wpm: parseFloat(entry.wpm),
2020-07-04 02:29:48 +08:00
raw: parseFloat(entry.raw),
2020-07-04 02:15:46 +08:00
acc: parseFloat(entry.acc),
mode: entry.mode,
mode2: entry.mode2,
timestamp: entry.timestamp,
});
}
});
}
this.sortBoard();
this.clipBoard();
}
sortBoard() {
this.board.sort((a, b) => {
if (a.wpm === b.wpm) {
if (a.acc === b.acc) {
return a.timestamp - b.timestamp;
} else {
return b.acc - a.acc;
}
} else {
return b.wpm - a.wpm;
}
});
}
clipBoard() {
let boardLength = this.board.length;
if (boardLength > this.size) {
while (this.board.length !== this.size) {
this.board.pop();
}
}
}
logBoard() {
console.log(this.board);
}
removeDuplicates(insertedAt, uid) {
//return true if a better result is found
let found = false;
// let ret;
let foundAt = null;
if (this.board !== undefined) {
this.board.forEach((entry, index) => {
if (entry.uid === uid) {
if (found) {
this.board.splice(index, 1);
// if (index > insertedAt) {
// //removed old result
// ret = false;
// } else {
// ret = true;
// }
} else {
found = true;
foundAt = index;
}
}
});
}
2020-07-04 06:41:42 +08:00
// console.log(ret);
// return ret;
return foundAt;
}
2020-07-04 02:15:46 +08:00
insert(a) {
let insertedAt = -1;
if (a.mode === this.mode && a.mode2 === this.mode2) {
this.board.forEach((b, index) => {
if (insertedAt !== -1) return;
if (a.wpm === b.wpm) {
if (a.acc === b.acc) {
if (a.timestamp < b.timestamp) {
this.board.splice(index, 0, {
uid: a.uid,
wpm: parseFloat(a.wpm),
2020-07-04 03:10:22 +08:00
raw: parseFloat(a.rawWpm),
2020-07-04 02:15:46 +08:00
acc: parseFloat(a.acc),
mode: a.mode,
mode2: a.mode2,
timestamp: a.timestamp,
});
insertedAt = index;
}
} else {
if (a.acc > b.acc) {
this.board.splice(index, 0, {
uid: a.uid,
wpm: parseFloat(a.wpm),
2020-07-04 03:10:22 +08:00
raw: parseFloat(a.rawWpm),
2020-07-04 02:15:46 +08:00
acc: parseFloat(a.acc),
mode: a.mode,
mode2: a.mode2,
timestamp: a.timestamp,
});
insertedAt = index;
}
}
} else {
if (a.wpm > b.wpm) {
this.board.splice(index, 0, {
uid: a.uid,
wpm: parseFloat(a.wpm),
2020-07-04 03:10:22 +08:00
raw: parseFloat(a.rawWpm),
2020-07-04 02:15:46 +08:00
acc: parseFloat(a.acc),
mode: a.mode,
mode2: a.mode2,
timestamp: a.timestamp,
});
insertedAt = index;
}
}
});
if (this.board.length < this.size && insertedAt === -1) {
this.board.push({
uid: a.uid,
wpm: parseFloat(a.wpm),
2020-07-04 03:10:22 +08:00
raw: parseFloat(a.rawWpm),
2020-07-04 02:15:46 +08:00
acc: parseFloat(a.acc),
mode: a.mode,
mode2: a.mode2,
timestamp: a.timestamp,
});
insertedAt = this.board.length - 1;
}
// console.log("before duplicate remove");
// console.log(this.board);
let newBest = false;
let foundAt = null;
if (insertedAt >= 0) {
// if (this.removeDuplicates(insertedAt, a.uid)) {
// insertedAt = -2;
// }
foundAt = this.removeDuplicates(insertedAt, a.uid);
if (foundAt >= insertedAt) {
//new better result
newBest = true;
}
}
// console.log(this.board);
2020-07-04 02:15:46 +08:00
this.clipBoard();
return {
insertedAt: insertedAt,
newBest: newBest,
foundAt: foundAt,
};
2020-07-04 02:15:46 +08:00
} else {
return {
insertedAt: -999,
};
2020-07-04 02:15:46 +08:00
}
}
}
2020-07-04 05:09:29 +08:00
async function checkLeaderboards(resultObj, type) {
2020-07-04 07:32:45 +08:00
try {
2020-07-04 08:39:29 +08:00
if (
2020-07-05 23:29:57 +08:00
((resultObj.mode === "words" &&
2020-07-04 08:39:29 +08:00
["10", "100"].includes(String(resultObj.mode2))) ||
2020-07-05 23:29:57 +08:00
(resultObj.mode === "time" &&
["15", "60"].includes(String(resultObj.mode2)))) &&
resultObj.language === "english"
2020-07-04 08:39:29 +08:00
) {
return admin
.firestore()
.collection("leaderboards")
.where("mode", "==", String(resultObj.mode))
.where("mode2", "==", String(resultObj.mode2))
.where("type", "==", type)
.get()
.then((ret) => {
if (ret.docs.length === 0) {
//no lb found, create
console.log(
`no ${resultObj.mode} ${resultObj.mode2} ${type} leaderboard found - creating`
);
let toAdd = {
size: 20,
mode: String(resultObj.mode),
mode2: String(resultObj.mode2),
type: type,
};
return admin
.firestore()
.collection("leaderboards")
.doc(
`${String(resultObj.mode)}_${String(resultObj.mode2)}_${type}`
)
.set(toAdd)
.then((ret) => {
return cont(
`${String(resultObj.mode)}_${String(
resultObj.mode2
)}_${type}`,
toAdd
);
});
} else {
//continue
return cont(
`${String(resultObj.mode)}_${String(resultObj.mode2)}_${type}`,
ret.docs[0].data()
);
2020-07-04 08:39:29 +08:00
}
});
function cont(docid, documentData) {
let boardInfo = documentData;
2020-07-04 07:32:45 +08:00
let boardData = boardInfo.board;
// console.log(`info ${JSON.stringify(boardInfo)}`);
// console.log(`data ${JSON.stringify(boardData)}`);
let lb = new Leaderboard(
boardInfo.size,
resultObj.mode,
resultObj.mode2,
boardInfo.type,
boardData
);
2020-07-04 02:15:46 +08:00
2020-07-04 07:32:45 +08:00
// console.log("board created");
// lb.logBoard();
2020-07-04 02:15:46 +08:00
2020-07-04 07:32:45 +08:00
let insertResult = lb.insert(resultObj);
2020-07-04 02:15:46 +08:00
2020-07-04 07:32:45 +08:00
// console.log("board after inseft");
// lb.logBoard();
2020-07-04 02:15:46 +08:00
if (insertResult.insertedAt >= 0) {
2020-07-04 07:32:45 +08:00
//update the database here
console.log(
2020-07-04 07:53:29 +08:00
`leaderboard changed ${resultObj.mode} ${
resultObj.mode2
} ${type} - ${JSON.stringify(lb.board)}`
2020-07-04 07:32:45 +08:00
);
2020-07-04 08:39:29 +08:00
admin.firestore().collection("leaderboards").doc(docid).set(
2020-07-04 07:32:45 +08:00
{
size: lb.size,
type: lb.type,
board: lb.board,
},
{ merge: true }
);
} else {
// console.log("board is the same");
}
2020-07-04 02:15:46 +08:00
2020-07-04 07:32:45 +08:00
return insertResult;
2020-07-04 08:39:29 +08:00
}
}
2020-07-04 07:32:45 +08:00
} catch (e) {
console.error(
`error while checking leaderboards - ${e} - ${type} ${resultObj}`
);
return null;
}
2020-07-04 02:15:46 +08:00
}
exports.getLeaderboard = functions.https.onCall((request, response) => {
return admin
.firestore()
.collection("leaderboards")
.where("mode", "==", String(request.mode))
.where("mode2", "==", String(request.mode2))
2020-07-04 03:10:22 +08:00
.where("type", "==", String(request.type))
2020-07-04 02:15:46 +08:00
.get()
.then(async (data) => {
2020-07-04 07:58:49 +08:00
// console.log("got data");
2020-07-04 03:10:22 +08:00
if (data.docs.length === 0) return null;
2020-07-04 02:15:46 +08:00
let lbdata = data.docs[0].data();
2020-07-04 03:10:22 +08:00
if (lbdata.board !== undefined) {
2020-07-04 07:58:49 +08:00
// console.log("replacing users");
2020-07-04 05:09:29 +08:00
2020-07-04 03:10:22 +08:00
for (let i = 0; i < lbdata.board.length; i++) {
await admin
2020-07-04 05:09:29 +08:00
.firestore()
.collection("users")
.doc(lbdata.board[i].uid)
.get()
.then((doc) => {
console.log(lbdata.board[i].uid);
console.log(request.uid);
if (
lbdata.board[i].uid !== null &&
lbdata.board[i].uid === request.uid
) {
lbdata.board[i].currentUser = true;
}
2020-07-04 05:09:29 +08:00
lbdata.board[i].name = doc.data().name;
2020-07-04 03:10:22 +08:00
lbdata.board[i].uid = null;
});
}
// console.log(lbdata);
if (request.type === "daily") {
2020-07-06 00:56:16 +08:00
let resetTime = new Date(Date.now());
resetTime.setHours(0, 0, 0, 0);
2020-07-06 00:27:18 +08:00
resetTime.setDate(resetTime.getUTCDate() + 1);
resetTime = resetTime.valueOf();
lbdata.resetTime = resetTime;
}
2020-07-04 05:09:29 +08:00
2020-07-04 03:10:22 +08:00
return lbdata;
} else {
if (
lbdata.board === undefined ||
lbdata.board === [] ||
lbdata.board.length === 0
) {
return lbdata;
} else {
return [];
}
2020-07-04 02:15:46 +08:00
}
});
});
exports.scheduledFunctionCrontab = functions.pubsub
2020-07-05 23:38:08 +08:00
.schedule("00 00 * * *")
2020-07-06 08:09:17 +08:00
.timeZone("Africa/Abidjan")
.onRun((context) => {
2020-07-04 07:32:45 +08:00
try {
console.log("moving daily leaderboards to history");
admin
.firestore()
.collection("leaderboards")
.where("type", "==", "daily")
.get()
.then((res) => {
res.docs.forEach((doc) => {
let lbdata = doc.data();
t = new Date();
admin
.firestore()
.collection("leaderboards_history")
.doc(
2020-07-06 00:27:18 +08:00
`${t.getUTCDate()}_${t.getUTCMonth()}_${t.getUTCFullYear()}_${
lbdata.mode
}_${lbdata.mode2}`
)
2020-07-04 07:32:45 +08:00
.set(lbdata);
admin.firestore().collection("leaderboards").doc(doc.id).set(
{
board: [],
},
{ merge: true }
);
});
});
2020-07-04 07:32:45 +08:00
return null;
} catch (e) {
console.error(`error while moving daily leaderboards to history - ${e}`);
}
});
2020-06-28 06:45:24 +08:00
// exports.getConfig = functions.https.onCall((request,response) => {
// try{
// if(request.uid === undefined){
// console.error(`error getting config for ${request.uid} - missing input`);
// return -1;
// }
// return admin.firestore().collection(`users`).doc(request.uid).get().then(e => {
// return e.data().config;
// }).catch(e => {
// console.error(`error getting config from DB for ${request.uid} - ${e.message}`);
// return -1;
// });
// }catch(e){
// console.error(`error getting config for ${request.uid} - ${e}`);
// return {resultCode:-999};
// }
// })