Merge pull request #44 from cassoule/milo-250802

Milo 250802
This commit is contained in:
Milo Gourvest
2025-08-05 19:59:45 +02:00
committed by GitHub
7 changed files with 183 additions and 3 deletions

View File

@@ -43,7 +43,6 @@ server.listen(PORT, async () => {
console.log('Initial Fetch Error');
}
// Setup scheduled tasks
//setupCronJobs(client, io);
console.log('[Cron Jobs Initialized]');

0
src/game/erinyes.js Normal file
View File

View File

@@ -17,6 +17,9 @@ export let activeSolitaireGames = {};
// Stores active Poker rooms, keyed by a unique room ID (uuidv4).
export let pokerRooms = {};
// Stores active erinyes rooms, keyed by a unique room ID (uuidv4).
export let erinyesRooms = {};
// --- User and Session State ---
// Stores active user inventories for paginated embeds, keyed by the interaction ID.

View File

@@ -9,6 +9,7 @@ import { apiRoutes } from './routes/api.js';
import { pokerRoutes } from './routes/poker.js';
import { solitaireRoutes } from './routes/solitaire.js';
import {getSocketIo} from "./socket.js";
import {erinyesRoutes} from "./routes/erinyes.js";
// --- EXPRESS APP INITIALIZATION ---
const app = express();
@@ -49,5 +50,8 @@ app.use('/api/poker', pokerRoutes(client, io));
// Solitaire-specific routes
app.use('/api/solitaire', solitaireRoutes(client, io));
// erinyes-specific routes
app.use('/api/erinyes', erinyesRoutes(client, io));
export { app };

View File

@@ -0,0 +1,100 @@
import express from "express";
import { v4 as uuidv4 } from 'uuid';
import {erinyesRooms} from "../../game/state.js";
import {socketEmit} from "../socket.js";
const router = express.Router();
/**
* Factory function to create and configure the erinyes API routes.
* @param {object} client - The Discord.js client instance.
* @param {object} io - The Socket.IO server instance.
* @returns {object} The configured Express router.
*/
export function erinyesRoutes(client, io) {
// --- Router Management Endpoints
router.get('/', (req, res) => {
res.status(200).json({ rooms: erinyesRooms })
})
router.get('/:id', (req, res) => {
const room = erinyesRooms[req.params.id];
if (room) {
res.status(200).json({ room });
} else {
res.status(404).json({ message: 'Room not found.' });
}
})
router.post('/create', async (req, res) => {
const { creatorId } = req.body;
if (!creatorId) return res.status(404).json({ message: 'Creator ID is required.' });
if (Object.values(erinyesRooms).some(room => creatorId === room.host_id || room.players[creatorId])) {
res.status(404).json({ message: 'You are already in a room.' });
}
const creator = await client.users.fetch(creatorId);
const id = uuidv4()
createRoom({
host_id: creatorId,
host_name: creator.globalName,
game_rules: {}, // Specific game rules
roles: [], // Every role in the game
})
await socketEmit('erinyes-update', { room: erinyesRooms[id], type: 'room-created' });
res.status(200).json({ room: id });
})
return router;
}
function createRoom(config) {
erinyesRooms[config.id] = {
host_id: config.host_id,
host_name: config.host_name,
created_at: Date.now(),
last_move_at: null,
players: {},
current_player: null,
current_turn: null,
playing: false,
game_rules: createGameRules(config.game_rules),
roles: config.roles,
roles_rules: createRolesRules(config.roles),
bonuses: {}
}
}
function createGameRules(config) {
return {
day_vote_time: config.day_vote_time ?? 60000,
// ...
};
}
function createRolesRules(roles) {
const roles_rules = {}
roles.forEach(role => {
switch (role) {
case 'erynie':
roles_rules[role] = {
//...
};
break;
//...
default:
roles_rules[role] = {
//...
};
break;
}
})
return roles_rules;
}

View File

@@ -17,7 +17,7 @@ const router = express.Router();
/**
* Factory function to create and configure the poker API routes.
* @param {object} client - The Discord.js client instance.
* @param {object} io - The Socket.IO server instance. // FIX: Pass io in as a parameter
* @param {object} io - The Socket.IO server instance.
* @returns {object} The configured Express router.
*/
export function pokerRoutes(client, io) {
@@ -78,7 +78,6 @@ export function pokerRoutes(client, io) {
res.status(200).json({ message: 'Successfully joined.' });
});
// NEW: Endpoint to accept a player from the queue
router.post('/accept', async (req, res) => {
const { hostId, playerId, roomId } = req.body;
const room = pokerRooms[roomId];

75
src/utils/erinyes.js Normal file
View File

@@ -0,0 +1,75 @@
export const roles = {
erynie_1: {
name: 'Erinye',
subtitle: 'Mégère, la haine',
descr: '',
powers: {
double_vote: {
descr: 'Les Erinyes peuvent tuer une deuxième personne (1 seule fois).',
charges: 1,
disabled: false,
},
},
passive: {},
team: 'Erinyes',
},
erynie_2: {
name: 'Erinye',
subtitle: 'Tisiphone, la vengeance',
descr: '',
powers: {
one_shot: {
descr: 'Tuer une personne de son choix en plus du vote des Erinyes (1 seule fois).',
charges: 1,
disabled: false,
},
},
passive: {},
team: 'Erinyes',
},
erynie_3: {
name: 'Erinye',
subtitle: 'Alecto, l\'implacable',
descr: '',
powers: {
silence: {
descr: 'Empêche l\'utilisation du pouvoir de quelqu\'un pour le prochain tour.',
charges: 999,
disabled: false,
}
},
passive: {
descr: 'Voit quels pouvoirs ont été utilisés.',
disabled: false,
},
team: 'Erinyes',
},
narcisse: {
name: 'Narcisse',
subtitle: '',
descr: '',
powers: {},
passive: {
descr: 'S\'il devient maire ...',
disabled: false,
},
},
charon: {
name: 'Charon',
subtitle: 'Sorcier',
descr: 'C\'est le passeur, il est appelé chaque nuit après les Erinyes pour décider du sort des mortels.',
powers: {
revive: {
descr: 'Refuser de faire traverser le Styx (sauver quelqu\'un)',
charges: 1,
disabled: false,
},
kill: {
descr: 'Traverser le Styx (tuer quelqu\'un)',
charges: 1,
disabled: false,
}
},
},
//...
}