source: pages/api/roulette/index.js@ 1df3fde

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

Saving roulette data to database

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