source: pages/api/roulette/index.js@ ace7865

main
Last change on this file since ace7865 was ace7865, checked in by anastasovv <simon@…>, 2 years ago

Finished Roulette

  • Property mode set to 100644
File size: 9.1 KB
Line 
1import axios from 'axios';
2
3require('dotenv').config();
4
5function getWinningBets(magicNumber) {
6 let winningBets = [];
7 winningBets.push(magicNumber);
8
9 if (magicNumber != 0) {
10 if ((magicNumber <= 9 && magicNumber % 2 == 1) || (magicNumber > 10 && magicNumber <= 18 && magicNumber % 2 == 0) ||
11 (magicNumber > 19 && magicNumber <= 27 && magicNumber % 2 == 1) || (magicNumber > 27 && magicNumber % 2 == 0)) {
12
13 winningBets.push('Red');
14 }
15 else {
16 winningBets.push('Black');
17 }
18
19 if (magicNumber % 2 === 0) winningBets.push('Even');
20 else winningBets.push('Odd');
21
22 if (magicNumber <= 12) winningBets.push('1-12');
23 else if (magicNumber <= 24) winningBets.push('13-24');
24 else winningBets.push('25-36');
25
26 if (magicNumber <= 18) winningBets.push('1-18');
27 else winningBets.push('19-36');
28
29 if (magicNumber % 3 === 0) winningBets.push('Remainder3');
30 else if (magicNumber % 3 === 2) winningBets.push('Remainder2');
31 else winningBets.push('Remainder1');
32 }
33
34 return winningBets;
35}
36
37function updateGameWithWinners() {
38 const winningBets = getWinningBets(magicNumber);
39
40 for (let i = 0; i < game.players.length; i++) {
41 const player = game.players[i];
42
43 let playerWon = false;
44 player.whichBets.forEach(bet => {
45 if (winningBets.indexOf(bet) !== -1) {
46 playerWon = true;
47 }
48 })
49
50 if (playerWon) {
51 game.players[i].outcome = 'won';
52 }
53 else {
54 game.players[i].outcome = 'lost';
55 }
56 }
57}
58
59function resetPlayers() {
60 game.players.forEach(player => {
61 player.whichBets = [];
62 player.betAmount = 0;
63 player.outcome = 'none';
64 player.status = '_1_no_placed_bet';
65 })
66}
67
68function calculateWinnings(player) {
69 if (player.outcome === 'lost') return 0;
70
71 let bets = player.whichBets;
72 let bet = player.betAmount;
73
74 if (bets[0] === 'Even' || bets[0] === 'Odd') return 2 * bet;
75 else if (bets[0] === 'Red' || bets[0] === 'Black') return 2 * bet;
76 else if (bets[0].contains('Remainder')) return 3 * bet;
77 else if (bets[0] === '1-12' || bets[0] === '13-24' || bets[0] === '25-36') return 3 * bet;
78 else if (bets[0] === '1-18' || bets[0] === '19-36') return 2 * bet;
79 else if (bets.length === 4) return 9 * bet;
80 else if (bets.length === 2) return 18 * bet;
81 else if (bets.length === 1) return 36 * bet;
82
83 return 0;
84}
85
86const COUNTDOWN_FROM = 30;
87const WAIT_BEFORE = 20;
88
89let magicNumber = -1;
90
91(function() {
92 setInterval(() => {
93 game.timeToStart--;
94
95 // WAIT_BEFORE seconds is the time allocated for spinning the wheel and seeing the results.
96 if (game.timeToStart == 0) {
97 game.timeToStart = COUNTDOWN_FROM + WAIT_BEFORE;
98 }
99 else if (game.timeToStart == 10) {
100 magicNumber = Math.floor(Math.random() * 37);
101 game.status = '_2_spinning';
102 }
103 else if (game.timeToStart == COUNTDOWN_FROM) {
104 game.status = '_1_ongoing_timer';
105 }
106 else if (game.timeToStart == COUNTDOWN_FROM + 5) {
107 resetPlayers();
108 }
109
110 }, 1000);
111})();
112
113let game = {
114 status: '_1_ongoing_timer', // statuses: _1_ongoing_timer, _2_spinning,
115 timeToStart: COUNTDOWN_FROM, // in seconds
116 players: [] , // example player -> { session_id, name, whichBet, betAmount, status, outcome } // statuses: _1_no_placed_bet, _2_placed_bet
117}
118
119function addPlayer(session_id, name) {
120 if (game.players.map(e=>e.session_id).indexOf(session_id) === -1) {
121 game.players.push({
122 session_id: session_id,
123 name: name,
124 whichBets: [],
125 betAmount: 0,
126 status: '_1_no_placed_bet',
127 outcome: 'none',
128 })
129 }
130}
131
132/**
133 * ********************* BEGIN OF REQUEST HANDLER *********************
134 */
135export default async function handler(req, res) {
136 /**
137 * GET method
138 */
139 if (req.method === 'GET') {
140
141 /**
142 * /---------------------- GET ----------------------/
143 * Return to the user info for starting a new game.
144 * @action reset_game
145 * @param session_id
146 */
147 if (req.query.action === 'reset_game' && req.query?.session_id) {
148 const session_id = req.query.session_id;
149 const playerIdx = game.players.map(e=>e.session_id).indexOf(session_id);
150
151 if (playerIdx !== -1) {
152 res.json({
153 success: true,
154 game: game,
155 })
156 }
157 else {
158 res.json({
159 success: false,
160 })
161 }
162 }
163
164 /**
165 * /---------------------- GET ----------------------/
166 * Timer done on client side.
167 * @action timer_done
168 * @param session_id
169 */
170 if (req.query.action === 'timer_done' && req.query?.session_id) {
171 const session_id = req.query.session_id;
172 const playerIdx = game.players.map(e=>e.session_id).indexOf(session_id);
173
174 if (playerIdx !== -1 && game.status.substr(1, 1) === '2') {
175 updateGameWithWinners();
176
177 const playerWinnings = calculateWinnings(game.players[playerIdx]);
178
179 axios.get(`${process.env.HOME_URL}/api/postgre/?action=add_credits&session_id=${session_id}&credits=${playerWinnings}&game=roulette&outcome=${game.players[playerIdx].outcome}`).then(postgreRes => {
180 if (postgreRes.data?.success) {
181 res.json({
182 success: true,
183 game: game,
184 magicNumber: magicNumber,
185 winningBets: getWinningBets(magicNumber),
186 credits: postgreRes.data?.credits,
187 })
188 }
189 else {
190 res.json({
191 success: false,
192 })
193 }
194 });
195 }
196 else {
197 res.json({
198 success: false,
199 })
200 }
201 }
202
203 /**
204 * /---------------------- GET ----------------------/
205 * Place a bet.
206 * @action place_bet
207 * @param session_id
208 * @param betAmount
209 * @param whichBets
210 */
211 if (req.query.action === 'place_bet' && req.query?.session_id && req.query?.betAmount && req.query?.whichBets) {
212 const session_id = req.query.session_id;
213 const playerIdx = game.players.map(e=>e.session_id).indexOf(session_id);
214
215 if (playerIdx !== -1 && game.status.substr(1, 1) === '1' && game.players[playerIdx].status.substr(1, 1) === '1') {
216 game.players[playerIdx].betAmount = parseInt(req.query.betAmount);
217 game.players[playerIdx].whichBets = req.query.whichBets.split(',');
218 game.players[playerIdx].status = '_2_placed_bet';
219
220 axios.get(`${process.env.HOME_URL}/api/postgre?action=take_credits&session_id=${session_id}&credits=${req.query.betAmount}`).then(postgreRes => {
221 if (postgreRes.data?.success) {
222 res.json({
223 success: true,
224 game: game,
225 credits: postgreRes.data?.credits,
226 })
227 }
228 else {
229 res.json({
230 success: false,
231 })
232 }
233 });
234 }
235 }
236
237 /**
238 * /---------------------- GET ----------------------/
239 * If the player is not in an existing room, create a room for them.
240 * If they are reconnecting, get the room they were in.
241 * @action get_player_info_on_enter
242 * @param session_id
243 */
244 if (req.query.action === 'get_player_info_on_enter' && req.query?.session_id) {
245 const session_id = req.query.session_id;
246
247 axios.get(`${process.env.HOME_URL}/api/postgre?action=check_if_logged_in&session_id=${session_id}`).then(postgreRes => {
248 if (postgreRes.data?.success) {
249 addPlayer(session_id, postgreRes.data?.displayName);
250
251 res.json({
252 success: true,
253 game: game,
254 displayName: postgreRes.data?.displayName,
255 session_id: postgreRes.data?.session_id,
256 credits: postgreRes.data?.credits,
257 })
258 }
259 else {
260 res.json({
261 success: false,
262 })
263 }
264 });
265 }
266 }
267}
268/**
269 * ********************* END OF REQUEST HANDLER *********************
270 */
Note: See TracBrowser for help on using the repository browser.