rDrama/files/assets/js/lottery.js

190 lines
4.7 KiB
JavaScript
Raw Normal View History

2022-07-16 21:00:02 +00:00
let purchaseQuantity = 1;
const lotteryOnReady = function () {
2022-09-04 23:15:37 +00:00
checkLotteryStats();
2022-07-16 21:00:02 +00:00
2022-09-04 23:15:37 +00:00
// Show ticket being pulled.
const ticketPulled = document.getElementById("lotteryTicketPulled");
const purchaseTicket = document.getElementById("purchaseTicket");
2022-07-16 21:00:02 +00:00
2022-09-04 23:15:37 +00:00
purchaseTicket.addEventListener("click", () => {
2022-07-16 21:00:02 +00:00
ticketPulled.style.display = "block";
setTimeout(() => {
2022-09-04 23:15:37 +00:00
ticketPulled.style.display = "none";
ticketPulled.src =
2022-07-16 21:00:02 +00:00
"/i/rDrama/lottery_active.webp?v=2000&t=" +
new Date().getTime();
2022-09-04 23:15:37 +00:00
purchaseTicket.disabled = false;
2022-07-16 21:00:02 +00:00
}, 1780);
2022-09-04 23:15:37 +00:00
});
2022-07-16 21:00:02 +00:00
2022-09-04 23:15:37 +00:00
// Update the quantity field
const purchaseQuantityField = document.getElementById(
2022-07-16 21:00:02 +00:00
"totalQuantityOfTickets"
2022-09-04 23:15:37 +00:00
);
const purchaseTotalCostField = document.getElementById("totalCostOfTickets");
const ticketPurchaseQuantityInput = document.getElementById(
2022-07-16 21:00:02 +00:00
"ticketPurchaseQuantity"
2022-09-04 23:15:37 +00:00
);
2022-07-16 21:00:02 +00:00
2022-09-04 23:15:37 +00:00
ticketPurchaseQuantityInput.addEventListener("change", (event) => {
2022-07-16 21:00:02 +00:00
const value = Math.max(1, parseInt(event.target.value))
purchaseQuantity = value
purchaseQuantityField.innerText = value
purchaseTotalCostField.innerText = value * 12
2022-09-04 23:15:37 +00:00
});
2022-07-16 21:00:02 +00:00
};
function purchaseLotteryTicket() {
2022-09-04 23:15:37 +00:00
return handleLotteryRequest("buy", "POST");
2022-07-16 21:00:02 +00:00
}
function checkLotteryStats() {
2022-09-04 23:15:37 +00:00
return handleLotteryRequest("active", "GET");
2022-07-16 21:00:02 +00:00
}
// Admin
function ensureIntent() {
2022-09-04 23:15:37 +00:00
return window.confirm("Are you sure you want to end the current lottery?");
2022-07-16 21:00:02 +00:00
}
function startLotterySession() {
2022-09-04 23:15:37 +00:00
checkLotteryStats();
2022-07-16 21:00:02 +00:00
2022-09-04 23:15:37 +00:00
if (ensureIntent()) {
2022-07-16 21:00:02 +00:00
return handleLotteryRequest("start", "POST", () =>
2022-12-30 12:52:59 +00:00
location.reload()
2022-07-16 21:00:02 +00:00
);
2022-09-04 23:15:37 +00:00
}
2022-07-16 21:00:02 +00:00
}
function endLotterySession() {
2022-09-04 23:15:37 +00:00
checkLotteryStats();
2022-07-16 21:00:02 +00:00
2022-09-04 23:15:37 +00:00
if (ensureIntent()) {
2022-12-30 12:52:59 +00:00
return handleLotteryRequest("end", "POST", () => location.reload());
2022-09-04 23:15:37 +00:00
}
2022-07-16 21:00:02 +00:00
}
// Composed
function handleLotteryRequest(uri, method, callback = () => {}) {
2022-09-04 23:15:37 +00:00
const form = new FormData();
form.append("formkey", formkey());
form.append("quantity", purchaseQuantity);
const xhr = createXhrWithFormKey(`/lottery/${uri}`, method, form);
xhr[0].onload = handleLotteryResponse.bind(null, xhr[0], method, callback);
xhr[0].send(xhr[1]);
2022-07-16 21:00:02 +00:00
}
function handleLotteryResponse(xhr, method, callback) {
2022-09-04 23:15:37 +00:00
let response;
2022-07-16 21:00:02 +00:00
2022-09-04 23:15:37 +00:00
try {
2022-07-16 21:00:02 +00:00
response = JSON.parse(xhr.response);
2022-09-04 23:15:37 +00:00
} catch (error) {
2022-07-16 21:00:02 +00:00
console.error(error);
2022-09-04 23:15:37 +00:00
}
2022-07-16 21:00:02 +00:00
2022-09-04 23:15:37 +00:00
if (method === "POST") {
2022-07-16 21:00:02 +00:00
const succeeded =
2022-09-04 23:15:37 +00:00
xhr.status >= 200 && xhr.status < 300 && response && response.message;
2022-07-16 21:00:02 +00:00
if (succeeded) {
2022-09-04 23:15:37 +00:00
// Display success.
const toast = document.getElementById("lottery-post-success");
const toastMessage = document.getElementById("lottery-post-success-text");
2022-07-16 21:00:02 +00:00
2022-09-04 23:15:37 +00:00
toastMessage.innerText = response.message;
2022-07-16 21:00:02 +00:00
2022-09-04 23:15:37 +00:00
bootstrap.Toast.getOrCreateInstance(toast).show();
2022-07-16 21:00:02 +00:00
2022-09-04 23:15:37 +00:00
callback();
2022-07-16 21:00:02 +00:00
} else {
2022-09-04 23:15:37 +00:00
// Display error.
const toast = document.getElementById("lottery-post-error");
const toastMessage = document.getElementById("lottery-post-error-text");
2022-07-16 21:00:02 +00:00
2022-09-04 23:15:37 +00:00
toastMessage.innerText =
2022-07-16 21:00:02 +00:00
(response && response.error) || "Error, please try again later.";
2022-09-04 23:15:37 +00:00
bootstrap.Toast.getOrCreateInstance(toast).show();
}
2022-07-16 21:00:02 +00:00
}
2022-09-04 23:15:37 +00:00
if (response && response.stats) {
2022-07-16 21:00:02 +00:00
lastStats = response.stats;
const { user, lottery, participants } = response.stats;
const [
2022-09-04 23:15:37 +00:00
prizeImage,
prizeField,
timeLeftField,
ticketsSoldThisSessionField,
participantsThisSessionField,
ticketsHeldCurrentField,
ticketsHeldTotalField,
winningsField,
purchaseTicketButton,
2022-07-16 21:00:02 +00:00
] = [
2022-09-04 23:15:37 +00:00
"prize-image",
"prize",
"timeLeft",
"ticketsSoldThisSession",
"participantsThisSession",
"ticketsHeldCurrent",
"ticketsHeldTotal",
"winnings",
"purchaseTicket",
2022-07-16 21:00:02 +00:00
].map((id) => document.getElementById(id));
if (lottery) {
2022-09-04 23:15:37 +00:00
prizeImage.style.display = "inline";
prizeField.textContent = lottery.prize;
timeLeftField.textContent = formatTimeLeft(lottery.timeLeft);
2022-07-16 21:00:02 +00:00
2022-09-04 23:15:37 +00:00
if (participants) {
2022-07-16 21:00:02 +00:00
participantsThisSessionField.textContent = participants;
2022-09-04 23:15:37 +00:00
}
2022-07-16 21:00:02 +00:00
2022-09-04 23:15:37 +00:00
ticketsSoldThisSessionField.textContent = lottery.ticketsSoldThisSession;
ticketsHeldCurrentField.textContent = user.ticketsHeld.current;
2022-07-16 21:00:02 +00:00
} else {
2022-09-04 23:15:37 +00:00
prizeImage.style.display = "none";
[
2022-07-16 21:00:02 +00:00
prizeField,
timeLeftField,
ticketsSoldThisSessionField,
participantsThisSessionField,
ticketsHeldCurrentField,
2022-09-04 23:15:37 +00:00
].forEach((e) => (e.textContent = "-"));
purchaseTicketButton.disabled = true;
2022-07-16 21:00:02 +00:00
}
ticketsHeldTotalField.textContent = user.ticketsHeld.total;
winningsField.textContent = user.winnings;
const [endButton, startButton] = [
2022-09-04 23:15:37 +00:00
"endLotterySession",
"startLotterySession",
2022-07-16 21:00:02 +00:00
].map((id) => document.getElementById(id));
if (response.stats.lottery) {
2022-09-04 23:15:37 +00:00
endButton.style.display = "block";
startButton.style.display = "none";
2022-07-16 21:00:02 +00:00
} else {
2022-09-04 23:15:37 +00:00
endButton.style.display = "none";
startButton.style.display = "block";
}
2022-07-16 21:00:02 +00:00
}
}
function formatTimeLeft(secondsLeft) {
2022-09-04 23:15:37 +00:00
const minutesLeft = Math.floor(secondsLeft / 60);
const seconds = secondsLeft % 60;
const minutes = minutesLeft % 60;
const hours = Math.floor(minutesLeft / 60);
2022-07-16 21:00:02 +00:00
2022-09-04 23:15:37 +00:00
return `${hours}h, ${minutes}m, ${seconds}s`;
2022-07-16 21:00:02 +00:00
}
lotteryOnReady();