mirror of
https://github.com/monkeytypegame/monkeytype.git
synced 2025-11-12 07:01:31 +08:00
495 lines
11 KiB
JavaScript
495 lines
11 KiB
JavaScript
import { loadTags } from "./result-filters";
|
|
import * as AccountButton from "./account-button";
|
|
import * as Notifications from "./notifications";
|
|
import axiosInstance from "./axios-instance";
|
|
|
|
let dbSnapshot = null;
|
|
|
|
export function updateName(uid, name) {
|
|
axiosInstance.post("/updateName", {
|
|
name: name,
|
|
});
|
|
}
|
|
|
|
export function getSnapshot() {
|
|
return dbSnapshot;
|
|
}
|
|
|
|
export function setSnapshot(newSnapshot) {
|
|
try {
|
|
delete newSnapshot.banned;
|
|
} catch {}
|
|
try {
|
|
delete newSnapshot.verified;
|
|
} catch {}
|
|
dbSnapshot = newSnapshot;
|
|
}
|
|
|
|
export async function initSnapshot() {
|
|
//send api request with token that returns tags, presets, and data needed for snap
|
|
if (firebase.auth().currentUser == null) return false;
|
|
let snap = {
|
|
results: undefined,
|
|
personalBests: {},
|
|
name: undefined,
|
|
presets: [],
|
|
tags: [],
|
|
favouriteThemes: [],
|
|
banned: undefined,
|
|
verified: undefined,
|
|
emailVerified: undefined,
|
|
lbMemory: {
|
|
time15: {
|
|
global: null,
|
|
daily: null,
|
|
},
|
|
time60: {
|
|
global: null,
|
|
daily: null,
|
|
},
|
|
},
|
|
globalStats: {
|
|
time: 0,
|
|
started: 0,
|
|
completed: 0,
|
|
},
|
|
};
|
|
let userData = await axiosInstance.get("/user");
|
|
userData = userData.data;
|
|
snap.name = userData.name;
|
|
snap.personalBests = userData.personalBests;
|
|
snap.banned = userData.banned;
|
|
snap.verified = userData.verified;
|
|
if (userData.globalStats) {
|
|
snap.globalStats = userData.globalStats;
|
|
}
|
|
snap.favouriteThemes =
|
|
userData.favouriteThemes === undefined ? [] : userData.favouriteThemes;
|
|
try {
|
|
if (userData.lbMemory.time15 !== undefined) {
|
|
snap.lbMemory.time15 = userData.lbMemory.time15;
|
|
}
|
|
if (userData.lbMemory.time60 !== undefined) {
|
|
snap.lbMemory.time60 = userData.lbMemory.time60;
|
|
}
|
|
} catch {}
|
|
|
|
let configData = await axiosInstance.get("/config");
|
|
configData = configData.data;
|
|
snap.config = configData.config;
|
|
|
|
dbSnapshot = snap;
|
|
loadTags(dbSnapshot.tags);
|
|
return dbSnapshot;
|
|
}
|
|
|
|
export async function getUserResults() {
|
|
let user = firebase.auth().currentUser;
|
|
if (user == null) return false;
|
|
if (dbSnapshot === null) return false;
|
|
if (dbSnapshot.results !== undefined) {
|
|
return true;
|
|
} else {
|
|
axiosInstance
|
|
.get("/userResults")
|
|
.then((response) => {
|
|
dbSnapshot.results = response.data.results;
|
|
})
|
|
.catch((error) => {
|
|
console.log(error);
|
|
});
|
|
}
|
|
/*
|
|
try {
|
|
return await db
|
|
.collection(`users/${user.uid}/results/`)
|
|
.orderBy("timestamp", "desc")
|
|
.limit(1000)
|
|
.get()
|
|
.then((data) => {
|
|
dbSnapshot.results = [];
|
|
data.docs.forEach((doc) => {
|
|
let result = doc.data();
|
|
result.id = doc.id;
|
|
|
|
//this should be done server-side
|
|
if (result.bailedOut === undefined) result.bailedOut = false;
|
|
if (result.blindMode === undefined) result.blindMode = false;
|
|
if (result.difficulty === undefined) result.difficulty = "normal";
|
|
if (result.funbox === undefined) result.funbox = "none";
|
|
if (result.language === undefined) result.language = "english";
|
|
if (result.numbers === undefined) result.numbers = false;
|
|
if (result.punctuation === undefined) result.punctuation = false;
|
|
|
|
dbSnapshot.results.push(result);
|
|
});
|
|
return true;
|
|
})
|
|
.catch((e) => {
|
|
throw e;
|
|
});
|
|
} catch (e) {
|
|
console.error(e);
|
|
return false;
|
|
}
|
|
}
|
|
*/
|
|
}
|
|
|
|
export async function getUserHighestWpm(
|
|
mode,
|
|
mode2,
|
|
punctuation,
|
|
language,
|
|
difficulty
|
|
) {
|
|
function cont() {
|
|
let topWpm = 0;
|
|
dbSnapshot.results.forEach((result) => {
|
|
if (
|
|
result.mode == mode &&
|
|
result.mode2 == mode2 &&
|
|
result.punctuation == punctuation &&
|
|
result.language == language &&
|
|
result.difficulty == difficulty
|
|
) {
|
|
if (result.wpm > topWpm) {
|
|
topWpm = result.wpm;
|
|
}
|
|
}
|
|
});
|
|
return topWpm;
|
|
}
|
|
|
|
let retval;
|
|
if (dbSnapshot == null || dbSnapshot.results === undefined) {
|
|
retval = 0;
|
|
} else {
|
|
retval = cont();
|
|
}
|
|
return retval;
|
|
}
|
|
|
|
export async function getUserAverageWpm10(
|
|
mode,
|
|
mode2,
|
|
punctuation,
|
|
language,
|
|
difficulty
|
|
) {
|
|
function cont() {
|
|
let wpmSum = 0;
|
|
let count = 0;
|
|
let last10Wpm = 0;
|
|
let last10Count = 0;
|
|
// You have to use every so you can break out of the loop
|
|
dbSnapshot.results.every((result) => {
|
|
if (
|
|
result.mode == mode &&
|
|
result.punctuation == punctuation &&
|
|
result.language == language &&
|
|
result.difficulty == difficulty
|
|
) {
|
|
// Continue if the mode2 doesn't match unless it's a quote.
|
|
if (result.mode2 != mode2 && mode != "quote") {
|
|
return true;
|
|
}
|
|
|
|
// Grab the most recent 10 wpm's for the current mode.
|
|
if (last10Count < 10) {
|
|
last10Wpm += result.wpm;
|
|
last10Count++;
|
|
}
|
|
|
|
// Check mode2 matches and append, for quotes this is the quote id.
|
|
if (result.mode2 == mode2) {
|
|
wpmSum += result.wpm;
|
|
count++;
|
|
if (count >= 10) {
|
|
// Break out of every loop since we a maximum of the last 10 wpm results.
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
});
|
|
|
|
// Return the last 10 average wpm for quote if the current quote id has never been completed before by the user.
|
|
if (count == 0 && mode == "quote") {
|
|
return Math.round(last10Wpm / last10Count);
|
|
}
|
|
|
|
// Return the average wpm of the last 10 completions for the targeted test mode.
|
|
return Math.round(wpmSum / count);
|
|
}
|
|
|
|
let retval = 0;
|
|
|
|
if (dbSnapshot == null) return retval;
|
|
var dbSnapshotValid = await getUserResults();
|
|
if (dbSnapshotValid === false) {
|
|
return retval;
|
|
}
|
|
retval = cont();
|
|
return retval;
|
|
}
|
|
|
|
export async function getLocalPB(
|
|
mode,
|
|
mode2,
|
|
punctuation,
|
|
language,
|
|
difficulty
|
|
) {
|
|
function cont() {
|
|
let ret = 0;
|
|
try {
|
|
dbSnapshot.personalBests[mode][mode2].forEach((pb) => {
|
|
if (
|
|
pb.punctuation == punctuation &&
|
|
pb.difficulty == difficulty &&
|
|
pb.language == language
|
|
) {
|
|
ret = pb.wpm;
|
|
}
|
|
});
|
|
return ret;
|
|
} catch (e) {
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
let retval;
|
|
if (dbSnapshot == null) {
|
|
retval = 0;
|
|
} else {
|
|
retval = cont();
|
|
}
|
|
return retval;
|
|
}
|
|
|
|
export async function saveLocalPB(
|
|
mode,
|
|
mode2,
|
|
punctuation,
|
|
language,
|
|
difficulty,
|
|
wpm,
|
|
acc,
|
|
raw,
|
|
consistency
|
|
) {
|
|
if (mode == "quote") return;
|
|
function cont() {
|
|
try {
|
|
let found = false;
|
|
if (dbSnapshot.personalBests[mode][mode2] === undefined) {
|
|
dbSnapshot.personalBests[mode][mode2] = [];
|
|
}
|
|
dbSnapshot.personalBests[mode][mode2].forEach((pb) => {
|
|
if (
|
|
pb.punctuation == punctuation &&
|
|
pb.difficulty == difficulty &&
|
|
pb.language == language
|
|
) {
|
|
found = true;
|
|
pb.wpm = wpm;
|
|
pb.acc = acc;
|
|
pb.raw = raw;
|
|
pb.timestamp = Date.now();
|
|
pb.consistency = consistency;
|
|
}
|
|
});
|
|
if (!found) {
|
|
//nothing found
|
|
dbSnapshot.personalBests[mode][mode2].push({
|
|
language: language,
|
|
difficulty: difficulty,
|
|
punctuation: punctuation,
|
|
wpm: wpm,
|
|
acc: acc,
|
|
raw: raw,
|
|
timestamp: Date.now(),
|
|
consistency: consistency,
|
|
});
|
|
}
|
|
} catch (e) {
|
|
//that mode or mode2 is not found
|
|
dbSnapshot.personalBests[mode] = {};
|
|
dbSnapshot.personalBests[mode][mode2] = [
|
|
{
|
|
language: language,
|
|
difficulty: difficulty,
|
|
punctuation: punctuation,
|
|
wpm: wpm,
|
|
acc: acc,
|
|
raw: raw,
|
|
timestamp: Date.now(),
|
|
consistency: consistency,
|
|
},
|
|
];
|
|
}
|
|
}
|
|
|
|
if (dbSnapshot != null) {
|
|
cont();
|
|
}
|
|
}
|
|
|
|
export async function getLocalTagPB(
|
|
tagId,
|
|
mode,
|
|
mode2,
|
|
punctuation,
|
|
language,
|
|
difficulty
|
|
) {
|
|
function cont() {
|
|
let ret = 0;
|
|
let filteredtag = dbSnapshot.tags.filter((t) => t._id === tagId)[0];
|
|
try {
|
|
filteredtag.personalBests[mode][mode2].forEach((pb) => {
|
|
if (
|
|
pb.punctuation == punctuation &&
|
|
pb.difficulty == difficulty &&
|
|
pb.language == language
|
|
) {
|
|
ret = pb.wpm;
|
|
}
|
|
});
|
|
} catch (e) {
|
|
console.log(e);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
let retval;
|
|
if (dbSnapshot == null) {
|
|
retval = 0;
|
|
} else {
|
|
retval = cont();
|
|
}
|
|
return retval;
|
|
}
|
|
|
|
export async function saveLocalTagPB(
|
|
tagId,
|
|
mode,
|
|
mode2,
|
|
punctuation,
|
|
language,
|
|
difficulty,
|
|
wpm,
|
|
acc,
|
|
raw,
|
|
consistency
|
|
) {
|
|
if (mode == "quote") return;
|
|
function cont() {
|
|
let filteredtag = dbSnapshot.tags.filter((t) => t._id === tagId)[0];
|
|
try {
|
|
let found = false;
|
|
if (filteredtag.personalBests[mode][mode2] === undefined) {
|
|
filteredtag.personalBests[mode][mode2] = [];
|
|
}
|
|
filteredtag.personalBests[mode][mode2].forEach((pb) => {
|
|
if (
|
|
pb.punctuation == punctuation &&
|
|
pb.difficulty == difficulty &&
|
|
pb.language == language
|
|
) {
|
|
found = true;
|
|
pb.wpm = wpm;
|
|
pb.acc = acc;
|
|
pb.raw = raw;
|
|
pb.timestamp = Date.now();
|
|
pb.consistency = consistency;
|
|
}
|
|
});
|
|
if (!found) {
|
|
//nothing found
|
|
filteredtag.personalBests[mode][mode2].push({
|
|
language: language,
|
|
difficulty: difficulty,
|
|
punctuation: punctuation,
|
|
wpm: wpm,
|
|
acc: acc,
|
|
raw: raw,
|
|
timestamp: Date.now(),
|
|
consistency: consistency,
|
|
});
|
|
}
|
|
} catch (e) {
|
|
//that mode or mode2 is not found
|
|
filteredtag.personalBests[mode] = {};
|
|
filteredtag.personalBests[mode][mode2] = [
|
|
{
|
|
language: language,
|
|
difficulty: difficulty,
|
|
punctuation: punctuation,
|
|
wpm: wpm,
|
|
acc: acc,
|
|
raw: raw,
|
|
timestamp: Date.now(),
|
|
consistency: consistency,
|
|
},
|
|
];
|
|
}
|
|
}
|
|
|
|
if (dbSnapshot != null) {
|
|
cont();
|
|
}
|
|
}
|
|
|
|
export function updateLbMemory(mode, mode2, type, value) {
|
|
//could dbSnapshot just be used here instead of getSnapshot()
|
|
getSnapshot().lbMemory[mode + mode2][type] = value;
|
|
}
|
|
|
|
export async function saveConfig(config) {
|
|
if (firebase.auth().currentUser !== null) {
|
|
AccountButton.loading(true);
|
|
try {
|
|
let response = await axiosInstance.post("/config/save", { config });
|
|
} catch (e) {
|
|
Notifications.add(e.message, -1);
|
|
}
|
|
AccountButton.loading(false);
|
|
}
|
|
}
|
|
|
|
// export async function DB.getLocalTagPB(tagId) {
|
|
// function cont() {
|
|
// let ret = 0;
|
|
// try {
|
|
// ret = dbSnapshot.tags.filter((t) => t.id === tagId)[0].pb;
|
|
// if (ret == undefined) {
|
|
// ret = 0;
|
|
// }
|
|
// return ret;
|
|
// } catch (e) {
|
|
// return ret;
|
|
// }
|
|
// }
|
|
|
|
// let retval;
|
|
// if (dbSnapshot != null) {
|
|
// retval = cont();
|
|
// }
|
|
// return retval;
|
|
// }
|
|
|
|
// export async functio(tagId, wpm) {
|
|
// function cont() {
|
|
// dbSnapshot.tags.forEach((tag) => {
|
|
// if (tag._id === tagId) {
|
|
// tag.pb = wpm;
|
|
// }
|
|
// });
|
|
// }
|
|
|
|
// if (dbSnapshot != null) {
|
|
// cont();
|
|
// }
|
|
// }
|