hell yeah

This commit is contained in:
milo
2026-01-28 17:17:25 +01:00
parent 12eac37226
commit 4dd5be7e2f
3 changed files with 82 additions and 6 deletions

View File

@@ -24,7 +24,7 @@ import {
} from "../../database/index.js"; } from "../../database/index.js";
// --- Game State Imports --- // --- Game State Imports ---
import { activePolls, activePredis, activeSlowmodes, skins } from "../../game/state.js"; import { activePolls, activePredis, activeSlowmodes, skins, activeSnakeGames } from "../../game/state.js";
// --- Utility and API Imports --- // --- Utility and API Imports ---
import { formatTime, isMeleeSkin, isVCTSkin, isChampionsSkin, getVCTRegion } from "../../utils/index.js"; import { formatTime, isMeleeSkin, isVCTSkin, isChampionsSkin, getVCTRegion } from "../../utils/index.js";
@@ -32,7 +32,7 @@ import { DiscordRequest } from "../../api/discord.js";
// --- Discord.js Builder Imports --- // --- Discord.js Builder Imports ---
import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } from "discord.js"; import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } from "discord.js";
import { emitDataUpdated, socketEmit } from "../socket.js"; import { emitDataUpdated, socketEmit, onGameOver } from "../socket.js";
import { handleCaseOpening } from "../../utils/marketNotifs.js"; import { handleCaseOpening } from "../../utils/marketNotifs.js";
import { drawCaseContent, drawCaseSkin, getSkinUpgradeProbs } from "../../utils/caseOpening.js"; import { drawCaseContent, drawCaseSkin, getSkinUpgradeProbs } from "../../utils/caseOpening.js";
@@ -1204,6 +1204,79 @@ export function apiRoutes(client, io) {
return res.status(200).json({ message: "Prédi close" }); return res.status(200).json({ message: "Prédi close" });
}); });
router.post("/snake/reward", async (req, res) => {
const { discordId, score, isWin } = req.body;
console.log(`[SNAKE][SOLO]${discordId}: score=${score}, isWin=${isWin}`);
try {
const user = getUser.get(discordId);
if (!user) return res.status(404).json({ message: "Utilisateur introuvable" });
const reward = isWin ? score * 2 : score;
const newCoins = user.coins + reward;
updateUserCoins.run({ id: discordId, coins: newCoins });
insertLog.run({
id: `${discordId}-snake-reward-${Date.now()}`,
user_id: discordId,
action: "SNAKE_GAME_REWARD",
coins_amount: reward,
user_new_amount: newCoins,
target_user_id: null,
});
await emitDataUpdated({ table: "users", action: "update" });
return res.status(200).json({ message: `Récompense de ${reward} FlopoCoins attribuée !` });
} catch (e) {
console.error("Error rewarding snake game:", e);
return res.status(500).json({ message: "Erreur lors de l'attribution de la récompense" });
}
});
router.post("/queue/leave", async (req, res) => {
const { discordId, game, reason } = req.body;
if (game === "snake" && (reason === "beforeunload" || reason === "route-leave")) {
const lobby = Object.values(activeSnakeGames).find(
(l) => (l.p1.id === discordId || l.p2.id === discordId) && !l.gameOver,
);
if (!lobby) return;
const player = lobby.p1.id === discordId ? lobby.p1 : lobby.p2;
const otherPlayer = lobby.p1.id === discordId ? lobby.p2 : lobby.p1;
if (player.gameOver === true) return res.status(200).json({ message: "Déjà quitté" });
player.gameOver = true;
otherPlayer.win = true;
lobby.lastmove = Date.now();
// Broadcast the updated state to both players
await socketEmit("snakegamestate", {
lobby: {
p1: lobby.p1,
p2: lobby.p2,
},
});
// Check if game should end
if (lobby.p1.gameOver && lobby.p2.gameOver) {
// Both players finished - determine winner
let winnerId = null;
if (lobby.p1.win && !lobby.p2.win) {
winnerId = lobby.p1.id;
} else if (lobby.p2.win && !lobby.p1.win) {
winnerId = lobby.p2.id;
} else if (lobby.p1.score > lobby.p2.score) {
winnerId = lobby.p1.id;
} else if (lobby.p2.score > lobby.p1.score) {
winnerId = lobby.p2.id;
}
// If scores are equal, winnerId remains null (draw)
await onGameOver(client, "snake", discordId, winnerId, "", { p1: lobby.p1.score, p2: lobby.p2.score });
} else if (lobby.p1.win || lobby.p2.win) {
// One player won by filling the grid
const winnerId = lobby.p1.win ? lobby.p1.id : lobby.p2.id;
await onGameOver(client, "snake", discordId, winnerId, "", { p1: lobby.p1.score, p2: lobby.p2.score });
}
}
});
// --- Admin Routes --- // --- Admin Routes ---
router.post("/buy-coins", (req, res) => { router.post("/buy-coins", (req, res) => {

View File

@@ -36,6 +36,8 @@ export function initializeSocket(server, client) {
registerSnakeEvents(socket, client); registerSnakeEvents(socket, client);
socket.on("tictactoe:queue:leave", async ({ discordId }) => await refreshQueuesForUser(discordId, client)); socket.on("tictactoe:queue:leave", async ({ discordId }) => await refreshQueuesForUser(discordId, client));
socket.on("connect4:queue:leave", async ({ discordId }) => await refreshQueuesForUser(discordId, client));
socket.on("snake:queue:leave", async ({ discordId }) => await refreshQueuesForUser(discordId, client));
// catch tab kills / network drops // catch tab kills / network drops
socket.on("disconnecting", async () => { socket.on("disconnecting", async () => {
@@ -210,7 +212,7 @@ async function onSnakeGameStateUpdate(client, eventData) {
player.snake = snake; player.snake = snake;
player.food = food; player.food = food;
player.score = score; player.score = score;
player.gameOver = gameOver; player.gameOver = gameOver === true ? true : false;
player.win = win; player.win = win;
lobby.lastmove = Date.now(); lobby.lastmove = Date.now();
@@ -245,7 +247,7 @@ async function onSnakeGameStateUpdate(client, eventData) {
} }
} }
async function onGameOver(client, gameType, playerId, winnerId, reason = "", scores = null) { export async function onGameOver(client, gameType, playerId, winnerId, reason = "", scores = null) {
const { activeGames, title } = getGameAssets(gameType); const { activeGames, title } = getGameAssets(gameType);
const gameKey = Object.keys(activeGames).find((key) => key.includes(playerId)); const gameKey = Object.keys(activeGames).find((key) => key.includes(playerId));
const game = gameKey ? activeGames[gameKey] : undefined; const game = gameKey ? activeGames[gameKey] : undefined;
@@ -514,7 +516,7 @@ async function updateDiscordMessage(client, game, title, resultText = "") {
} else if (title === "Puissance 4") { } else if (title === "Puissance 4") {
description = `**🔴 ${game.p1.name}** vs **${game.p2.name} 🟡**\n\n${formatConnect4BoardForDiscord(game.board)}`; description = `**🔴 ${game.p1.name}** vs **${game.p2.name} 🟡**\n\n${formatConnect4BoardForDiscord(game.board)}`;
} else if (title === "Snake 1v1") { } else if (title === "Snake 1v1") {
description = `**🐍 ${game.p1.name}** (${game.p1.score}) vs **${game.p2.name} 🐍** (${game.p2.score})`; description = `**🐍 ${game.p1.name}** (${game.p1.score}) vs (${game.p2.score}) **${game.p2.name}** `;
} }
if (resultText) description += `\n### ${resultText}`; if (resultText) description += `\n### ${resultText}`;

View File

@@ -211,7 +211,8 @@ export async function handleMarketOfferClosing(offerId, client) {
// Send notification in guild channel // Send notification in guild channel
try { try {
const guildChannel = await client.channels.fetch(process.env.BOT_CHANNEL_ID); const guild = await client.guilds.fetch(process.env.BOT_GUILD_ID);
const guildChannel = await guild.channels.fetch(process.env.BOT_CHANNEL_ID);
const embed = new EmbedBuilder() const embed = new EmbedBuilder()
.setTitle("🔔 Fin des enchères") .setTitle("🔔 Fin des enchères")
.setDescription( .setDescription(