mirror of
https://github.com/monkeytypegame/monkeytype.git
synced 2025-02-05 13:27:49 +08:00
296 lines
8.5 KiB
JavaScript
296 lines
8.5 KiB
JavaScript
|
exports.requestTest = functions.https.onRequest((request, response) => {
|
||
|
response.set("Access-Control-Allow-Origin", origin);
|
||
|
response.set("Access-Control-Allow-Headers", "*");
|
||
|
response.set("Access-Control-Allow-Credentials", "true");
|
||
|
response.status(200).send({ data: "test" });
|
||
|
});
|
||
|
|
||
|
exports.getPatreons = functions.https.onRequest(async (request, response) => {
|
||
|
response.set("Access-Control-Allow-Origin", origin);
|
||
|
response.set("Access-Control-Allow-Headers", "*");
|
||
|
response.set("Access-Control-Allow-Credentials", "true");
|
||
|
if (request.method === "OPTIONS") {
|
||
|
// Send response to OPTIONS requests
|
||
|
response.set("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
|
||
|
response.set("Access-Control-Allow-Headers", "Authorization,Content-Type");
|
||
|
response.set("Access-Control-Max-Age", "3600");
|
||
|
response.status(204).send("");
|
||
|
return;
|
||
|
}
|
||
|
request = request.body.data;
|
||
|
try {
|
||
|
let patreon = await db.collection("patreon").doc("patreons").get();
|
||
|
let data = patreon.data().list;
|
||
|
|
||
|
data = data.sort((a, b) => {
|
||
|
return b.value - a.value;
|
||
|
});
|
||
|
|
||
|
let ret = [];
|
||
|
data.forEach((pdoc) => {
|
||
|
ret.push(pdoc.name);
|
||
|
});
|
||
|
|
||
|
response.status(200).send({ data: ret });
|
||
|
return;
|
||
|
} catch (e) {
|
||
|
response.status(200).send({ e });
|
||
|
return;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
async function getAllNames() {
|
||
|
// return admin
|
||
|
// .auth()
|
||
|
// .listUsers()
|
||
|
// .then((data) => {
|
||
|
// let names = [];
|
||
|
// data.users.forEach((user) => {
|
||
|
// names.push(user.displayName);
|
||
|
// });
|
||
|
// return names;
|
||
|
// });
|
||
|
|
||
|
let ret = [];
|
||
|
|
||
|
async function getAll(nextPageToken) {
|
||
|
// List batch of users, 1000 at a time.
|
||
|
let listUsersResult = await admin.auth().listUsers(1000, nextPageToken);
|
||
|
for (let i = 0; i < listUsersResult.users.length; i++) {
|
||
|
ret.push(listUsersResult.users[i].displayName);
|
||
|
}
|
||
|
if (listUsersResult.pageToken) {
|
||
|
// List next batch of users.
|
||
|
await getAll(listUsersResult.pageToken);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
await getAll();
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
async function getAllUsers() {
|
||
|
// return admin
|
||
|
// .auth()
|
||
|
// .listUsers()
|
||
|
// .then((data) => {
|
||
|
// let names = [];
|
||
|
// data.users.forEach((user) => {
|
||
|
// names.push(user.displayName);
|
||
|
// });
|
||
|
// return names;
|
||
|
// });
|
||
|
|
||
|
let ret = [];
|
||
|
|
||
|
async function getAll(nextPageToken) {
|
||
|
// List batch of users, 1000 at a time.
|
||
|
let listUsersResult = await auth.listUsers(1000, nextPageToken);
|
||
|
for (let i = 0; i < listUsersResult.users.length; i++) {
|
||
|
let loopuser = listUsersResult.users[i];
|
||
|
|
||
|
//if custom claim is undefined check, if its true then ignore
|
||
|
|
||
|
// if (loopuser === undefined || loopuser.customClaims === undefined || loopuser.customClaims['nameChecked'] === undefined) {
|
||
|
ret.push(listUsersResult.users[i]);
|
||
|
// }
|
||
|
|
||
|
// console.log(loopuser.customClaims['asd']);
|
||
|
|
||
|
// let userdata = await db.collection('users').doc(listUsersResult.users[i].uid).get();
|
||
|
|
||
|
// let data = userdata.data();
|
||
|
|
||
|
// if (data === undefined || data.needsToChangeName === undefined) {
|
||
|
// // console.log(data);
|
||
|
// ret.push(listUsersResult.users[i]);
|
||
|
// // console.log('user added');
|
||
|
// } else {
|
||
|
// // console.log('user already added');
|
||
|
// }
|
||
|
}
|
||
|
if (listUsersResult.pageToken) {
|
||
|
// List next batch of users.
|
||
|
await getAll(listUsersResult.pageToken);
|
||
|
}
|
||
|
}
|
||
|
await getAll();
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
function isUsernameValid(name) {
|
||
|
if (name === null || name === undefined || name === "") return false;
|
||
|
if (/miodec/.test(name.toLowerCase())) return false;
|
||
|
if (/bitly/.test(name.toLowerCase())) return false;
|
||
|
if (name.length > 14) return false;
|
||
|
if (/^\..*/.test(name.toLowerCase())) return false;
|
||
|
return /^[0-9a-zA-Z_.-]+$/.test(name);
|
||
|
}
|
||
|
|
||
|
async function incrementTestCounter(uid, userData) {
|
||
|
try {
|
||
|
if (userData.completedTests === undefined) {
|
||
|
let results = await db.collection(`users/${uid}/results`).get();
|
||
|
let count = results.docs.length;
|
||
|
db.collection("users")
|
||
|
.doc(uid)
|
||
|
.update({
|
||
|
completedTests: admin.firestore.FieldValue.increment(count),
|
||
|
});
|
||
|
db.collection("public")
|
||
|
.doc("stats")
|
||
|
.update({
|
||
|
completedTests: admin.firestore.FieldValue.increment(count),
|
||
|
});
|
||
|
} else {
|
||
|
db.collection("users")
|
||
|
.doc(uid)
|
||
|
.update({ completedTests: admin.firestore.FieldValue.increment(1) });
|
||
|
db.collection("public")
|
||
|
.doc("stats")
|
||
|
.update({ completedTests: admin.firestore.FieldValue.increment(1) });
|
||
|
}
|
||
|
} catch (e) {
|
||
|
console.error(
|
||
|
`Error while incrementing completed tests for user ${uid}: ${e}`
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
async function incrementStartedTestCounter(uid, num, userData) {
|
||
|
try {
|
||
|
if (userData.startedTests === undefined) {
|
||
|
let stepSize = 1000;
|
||
|
let results = [];
|
||
|
let query = await db
|
||
|
.collection(`users/${uid}/results`)
|
||
|
.orderBy("timestamp", "desc")
|
||
|
.limit(stepSize)
|
||
|
.get();
|
||
|
let lastDoc;
|
||
|
while (query.docs.length > 0) {
|
||
|
lastDoc = query.docs[query.docs.length - 1];
|
||
|
query.docs.forEach((doc) => {
|
||
|
results.push({ restartCount: doc.data().restartCount });
|
||
|
});
|
||
|
query = await db
|
||
|
.collection(`users/${uid}/results`)
|
||
|
.orderBy("timestamp", "desc")
|
||
|
.limit(stepSize)
|
||
|
.startAfter(lastDoc)
|
||
|
.get();
|
||
|
}
|
||
|
|
||
|
let count = 0;
|
||
|
results.forEach((result) => {
|
||
|
try {
|
||
|
let rc = result.restartCount;
|
||
|
if (rc === undefined) {
|
||
|
rc = 0;
|
||
|
}
|
||
|
|
||
|
count += parseInt(rc);
|
||
|
} catch (e) {}
|
||
|
});
|
||
|
count += results.length;
|
||
|
db.collection("users")
|
||
|
.doc(uid)
|
||
|
.update({
|
||
|
startedTests: admin.firestore.FieldValue.increment(count),
|
||
|
});
|
||
|
db.collection("public")
|
||
|
.doc("stats")
|
||
|
.update({
|
||
|
startedTests: admin.firestore.FieldValue.increment(count),
|
||
|
});
|
||
|
} else {
|
||
|
db.collection("users")
|
||
|
.doc(uid)
|
||
|
.update({ startedTests: admin.firestore.FieldValue.increment(num) });
|
||
|
db.collection("public")
|
||
|
.doc("stats")
|
||
|
.update({ startedTests: admin.firestore.FieldValue.increment(num) });
|
||
|
}
|
||
|
} catch (e) {
|
||
|
console.error(
|
||
|
`Error while incrementing started tests for user ${uid}: ${e}`
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
exports.scheduledFunctionCrontab = functions.pubsub
|
||
|
.schedule("00 00 * * *")
|
||
|
.timeZone("Africa/Abidjan")
|
||
|
.onRun((context) => {
|
||
|
try {
|
||
|
console.log("moving daily leaderboards to history");
|
||
|
db.collection("leaderboards")
|
||
|
.where("type", "==", "daily")
|
||
|
.get()
|
||
|
.then(async (res) => {
|
||
|
for (let i = 0; i < res.docs.length; i++) {
|
||
|
let doc = res.docs[i];
|
||
|
|
||
|
let lbdata = doc.data();
|
||
|
|
||
|
let winnerUid = lbdata.board[0].uid;
|
||
|
await db
|
||
|
.collection("users")
|
||
|
.doc(winnerUid)
|
||
|
.get()
|
||
|
.then(async (userDoc) => {
|
||
|
let userData = userDoc.data();
|
||
|
let lbwins = userData.dailyLbWins;
|
||
|
|
||
|
let lbname = lbdata.mode + lbdata.mode2;
|
||
|
|
||
|
if (lbwins === undefined) {
|
||
|
//first win ever
|
||
|
lbwins = {
|
||
|
[lbname]: 1,
|
||
|
};
|
||
|
} else {
|
||
|
//object already exists
|
||
|
if (lbwins[lbname] === undefined) {
|
||
|
lbwins[lbname] = 1;
|
||
|
} else {
|
||
|
lbwins[lbname] = lbwins[lbname] + 1;
|
||
|
}
|
||
|
}
|
||
|
await db.collection("users").doc(winnerUid).update({
|
||
|
dailyLbWins: lbwins,
|
||
|
});
|
||
|
});
|
||
|
|
||
|
announceDailyLbResult(lbdata);
|
||
|
t = new Date();
|
||
|
// db.collection("leaderboards_history")
|
||
|
// .doc(
|
||
|
// `${t.getUTCDate()}_${t.getUTCMonth()}_${t.getUTCFullYear()}_${
|
||
|
// lbdata.mode
|
||
|
// }_${lbdata.mode2}`
|
||
|
// )
|
||
|
// .set(lbdata);
|
||
|
db.collection("leaderboards").doc(doc.id).set(
|
||
|
{
|
||
|
board: [],
|
||
|
},
|
||
|
{ merge: true }
|
||
|
);
|
||
|
}
|
||
|
});
|
||
|
return null;
|
||
|
} catch (e) {
|
||
|
console.error(`error while moving daily leaderboards to history - ${e}`);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
async function announceDailyLbResult(lbdata) {
|
||
|
db.collection("bot-commands").add({
|
||
|
command: "announceDailyLbResult",
|
||
|
arguments: [lbdata],
|
||
|
executed: false,
|
||
|
requestTimestamp: Date.now(),
|
||
|
});
|
||
|
}
|