Skip to content

Commit

Permalink
Add game over functions.
Browse files Browse the repository at this point in the history
  • Loading branch information
vaclavpavlicek committed Nov 9, 2019
1 parent 147c34b commit 13bb892
Show file tree
Hide file tree
Showing 2 changed files with 3 additions and 132 deletions.
35 changes: 1 addition & 34 deletions functions/src/game/fractions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,38 +7,5 @@ import { CallableContext } from 'firebase-functions/lib/providers/https';
const db = admin.firestore();

export const giveWater = functions.https.onCall(async (data: any, context: CallableContext) => {
const fractionId = data.fractionId;
const water = data.water;
const number = data.number;

if (fractionId && number && water) {
const userSnap = await db.collection('users').doc(number).get();
const userData = userSnap.data();

const actualScore = propOr(0, 'actualScore', userData);

if (actualScore >= water && parseInt(water) >= 0) {
await db.collection('users').doc(number).set(assoc('actualScore', actualScore - water, userData));
await db.runTransaction(t => {
const fractionRef = db.collection('fractions').doc('' + fractionId);
return t.get(fractionRef)
.then(doc => {
const newScore = parseInt(doc.data().score) + parseInt(water);
t.update(fractionRef, {score: newScore});
return Promise.resolve('Population increased to ' + newScore);
});
});
console.log('Success');
return new WaterGiveSuccessfulResponse();
} else {
console.log('Water error');
return new ErrorResponse('Not enought of water.');
}
} else if (!number) {
return new ErrorResponse('No user id provided.');
} else if (!fractionId) {
return new ErrorResponse('No fraction id provided.');
} else {
return new ErrorResponse('Water error.');
}
return new ErrorResponse('Game over.');
});
100 changes: 2 additions & 98 deletions functions/src/game/questions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,105 +7,9 @@ import { CallableContext } from 'firebase-functions/lib/providers/https';
const db = admin.firestore();

export const loadQuestion = functions.https.onCall(async (data: any, context: CallableContext) => {
const questionId = data.questionId;
const number = data.number;

if (questionId && number) {
const userSnap = await db.collection('users').doc(number).get();
if (userSnap.exists) {
const userData = await userSnap.data();
const containsQuestionId = pipe(
propOr([], 'answeredQuestions'),
contains(questionId),
)(userData);

if (containsQuestionId) {
return new ErrorResponse('Question already answered.');
} else {
const questionSnap = await db.collection('questions').doc(questionId).get();

if (questionSnap.exists) {
const question = questionSnap.data();
if (question.pointsOnly) {
userData.totalScore = propOr(0, 'totalScore', userData) + propOr(0, 'score', question);
userData.actualScore = propOr(0, 'actualScore', userData) + propOr(0, 'score', question);
userData.answeredQuestions = pipe(
propOr([], 'answeredQuestions'),
append(questionId)
)(userData);

await db.collection('users').doc(number).set(userData);

return new PointsOnlyResponse(propOr(0, 'score', question));
} else {
return new QuestionResponse(pipe(
dissoc('correctAnswer'),
dissoc('score'),
)(question));
}
} else {
return new ErrorResponse('Question with this ID does not exist.');
}
}
} else {
return new ErrorResponse('User not found.');
}
} else if (!questionId) {
return new ErrorResponse('No question id provided.');
} else {
return new ErrorResponse('No user id provided.');
}
return new ErrorResponse('Game over.');
});

export const answerQuestion = functions.https.onCall(async (data: any, context: CallableContext) => {
const questionId = data.questionId;
const number = data.number;
const answer = data.answer;

if (questionId && number && answer) {
const userSnap = await db.collection('users').doc(number).get();
if (userSnap.exists) {
const userData = await userSnap.data();
const containsQuestionId = pipe(
propOr([], 'answeredQuestions'),
contains(questionId),
)(userData);

if (containsQuestionId) {
return new ErrorResponse('Question already answered.');
} else {
const questionSnap = await db.collection('questions').doc(questionId).get();
if (questionSnap.exists) {
const question = questionSnap.data();
userData.answeredQuestions = pipe(
propOr([], 'answeredQuestions'),
append(questionId)
)(userData);

if (question.correctAnswer === parseInt(answer)) {
userData.totalScore = propOr(0, 'totalScore', userData) + propOr(0, 'score', question);
userData.actualScore = propOr(0, 'actualScore', userData) + propOr(0, 'score', question);
}

await db.collection('users').doc(number).set(userData);

if (question.correctAnswer === parseInt(answer)) {
return new CorrectAnswerResponse(question.score);
} else {
return new WrongAnswerResponse();
}
} else {
return new ErrorResponse('Question with this ID does not exist.');
}
}
} else {
return new ErrorResponse('User not found.');
}
} else if (!questionId) {
return new ErrorResponse('No question id provided.');
} else if (!number) {
return new ErrorResponse('No user id provided.');
} else {
return new ErrorResponse('No answer id provided.');
}
return new ErrorResponse('Game over.');
});

0 comments on commit 13bb892

Please sign in to comment.