mirror of
https://github.com/cassoule/flopobot_v2.git
synced 2026-01-18 16:37:40 +01:00
1
index.js
1
index.js
@@ -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
0
src/game/erinyes.js
Normal 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.
|
||||
|
||||
@@ -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 };
|
||||
100
src/server/routes/erinyes.js
Normal file
100
src/server/routes/erinyes.js
Normal 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;
|
||||
}
|
||||
@@ -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
75
src/utils/erinyes.js
Normal 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,
|
||||
}
|
||||
},
|
||||
},
|
||||
//...
|
||||
}
|
||||
Reference in New Issue
Block a user