trucoshi 0.0.16 → 0.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,3 @@
1
- import { IDeck } from "../types";
1
+ import { ICard, IDeck, IPlayedCard, IPlayer } from "../types";
2
2
  export declare function Deck(): IDeck;
3
+ export declare function PlayedCard(player: IPlayer, card: ICard): IPlayedCard;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Deck = void 0;
3
+ exports.PlayedCard = exports.Deck = void 0;
4
4
  var constants_1 = require("../constants");
5
5
  var utils_1 = require("../utils");
6
6
  function Deck() {
@@ -25,3 +25,14 @@ function Deck() {
25
25
  return deck;
26
26
  }
27
27
  exports.Deck = Deck;
28
+ function PlayedCard(player, card) {
29
+ var pc = {
30
+ player: player,
31
+ card: card,
32
+ get key() {
33
+ return card + player.session;
34
+ },
35
+ };
36
+ return pc;
37
+ }
38
+ exports.PlayedCard = PlayedCard;
@@ -30,6 +30,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
30
30
  exports.Hand = void 0;
31
31
  var types_1 = require("../types");
32
32
  var utils_1 = require("../utils");
33
+ var Deck_1 = require("./Deck");
33
34
  var Play_1 = require("./Play");
34
35
  var Round_1 = require("./Round");
35
36
  var Truco_1 = require("./Truco");
@@ -72,7 +73,6 @@ function Hand(match, deck, idx) {
72
73
  if (!(hand.state === types_1.EHandState.WAITING_FOR_TRUCO_ANSWER)) return [3 /*break*/, 6];
73
74
  value = hand.truco.getNextPlayer().value;
74
75
  if (!(value && value.currentPlayer)) return [3 /*break*/, 5];
75
- console.log({ value: value.currentPlayer });
76
76
  hand.setCurrentPlayer(value.currentPlayer);
77
77
  return [4 /*yield*/, hand];
78
78
  case 4:
@@ -181,7 +181,7 @@ function Hand(match, deck, idx) {
181
181
  var card = player.useCard(idx);
182
182
  if (card) {
183
183
  hand.nextTurn();
184
- return round.use({ player: player, card: card });
184
+ return round.use((0, Deck_1.PlayedCard)(player, card));
185
185
  }
186
186
  return null;
187
187
  },
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Round = void 0;
4
4
  var utils_1 = require("../utils");
5
+ var Deck_1 = require("./Deck");
5
6
  function Round(turn) {
6
7
  var round = {
7
8
  turn: turn,
@@ -24,7 +25,7 @@ function Round(turn) {
24
25
  round.highest = value;
25
26
  round.winner = player;
26
27
  }
27
- round.cards.push({ card: card, player: player });
28
+ round.cards.push((0, Deck_1.PlayedCard)(player, card));
28
29
  return card;
29
30
  },
30
31
  };
@@ -9,6 +9,7 @@ export interface IDeck {
9
9
  shuffle(): IDeck;
10
10
  }
11
11
  export interface IPlayedCard {
12
+ get key(): string;
12
13
  player: IPlayer & IPublicPlayer;
13
14
  card: ICard;
14
15
  }
@@ -2,6 +2,7 @@ import { IPublicPlayer } from "../../lib/classes/Player";
2
2
  import { IPublicTeam } from "../../lib/classes/Team";
3
3
  import { ILobby, IPlayedCard } from "../../lib/types";
4
4
  export interface IPublicMatch {
5
+ matchSessionId: string;
5
6
  teams: Array<IPublicTeam>;
6
7
  players: Array<IPublicPlayer>;
7
8
  rounds: IPlayedCard[][];
@@ -42,7 +42,7 @@ function MatchTable(matchSessionId, teamSize) {
42
42
  var lastHand = (((_a = lobby.gameLoop) === null || _a === void 0 ? void 0 : _a.hands.length) || 1) - 1;
43
43
  var rounds = (_c = (_b = lobby.gameLoop) === null || _b === void 0 ? void 0 : _b.hands[lastHand]) === null || _c === void 0 ? void 0 : _c.rounds.map(function (round) { return round.cards; });
44
44
  return {
45
- matchSessionId: matchSessionId,
45
+ matchSessionId: matchTable.matchSessionId,
46
46
  state: matchTable.state,
47
47
  teams: [],
48
48
  players: lobby.players.map(function (player) {
@@ -1,5 +1,5 @@
1
1
  export interface IUser {
2
2
  id: string;
3
- socketId: string;
3
+ matchSocketIds: Map<string, Set<string>>;
4
4
  }
5
- export declare function User(id: string, socketId: string): IUser;
5
+ export declare function User(id: string): IUser;
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.User = void 0;
4
- function User(id, socketId) {
4
+ function User(id) {
5
5
  var user = {
6
6
  id: id,
7
- socketId: socketId,
7
+ matchSocketIds: new Map()
8
8
  };
9
9
  return user;
10
10
  }
@@ -1,4 +1,15 @@
1
1
  "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
2
13
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
14
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
15
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -69,9 +80,10 @@ var getTable = function (matchSessionId) {
69
80
  };
70
81
  io.on("connection", function (_socket) {
71
82
  var socket = _socket;
83
+ console.log("New socket", socket.id);
72
84
  var getTableSockets = function (table, callback) {
73
85
  return new Promise(function (resolve) { return __awaiter(void 0, void 0, void 0, function () {
74
- var sockets, _i, sockets_1, socket_1;
86
+ var sockets, _i, sockets_1, playerSocket;
75
87
  return __generator(this, function (_a) {
76
88
  switch (_a.label) {
77
89
  case 0: return [4 /*yield*/, io.sockets.adapter.fetchSockets({
@@ -83,8 +95,8 @@ io.on("connection", function (_socket) {
83
95
  _a.label = 2;
84
96
  case 2:
85
97
  if (!(_i < sockets_1.length)) return [3 /*break*/, 5];
86
- socket_1 = sockets_1[_i];
87
- return [4 /*yield*/, callback(socket_1)];
98
+ playerSocket = sockets_1[_i];
99
+ return [4 /*yield*/, callback(playerSocket)];
88
100
  case 3:
89
101
  _a.sent();
90
102
  _a.label = 4;
@@ -98,14 +110,21 @@ io.on("connection", function (_socket) {
98
110
  });
99
111
  }); });
100
112
  };
101
- var emitMatchUpdate = function (table) {
102
- table.lobby.players.map(function (player) {
103
- var user = users.get(player.session);
104
- if (user && user.socketId) {
105
- io.to(user.socketId).emit(types_1.EServerEvent.UPDATE_MATCH, table.getPublicMatch(player.session));
113
+ var emitMatchUpdate = function (table) { return __awaiter(void 0, void 0, void 0, function () {
114
+ return __generator(this, function (_a) {
115
+ switch (_a.label) {
116
+ case 0: return [4 /*yield*/, getTableSockets(table, function (playerSocket) { return __awaiter(void 0, void 0, void 0, function () {
117
+ return __generator(this, function (_a) {
118
+ playerSocket.emit(types_1.EServerEvent.UPDATE_MATCH, table.getPublicMatch(playerSocket.session));
119
+ return [2 /*return*/];
120
+ });
121
+ }); })];
122
+ case 1:
123
+ _a.sent();
124
+ return [2 /*return*/];
106
125
  }
107
126
  });
108
- };
127
+ }); };
109
128
  socket.on(types_1.EClientEvent.PING, function (msg) {
110
129
  socket.emit(types_1.EServerEvent.PONG, msg);
111
130
  });
@@ -125,6 +144,8 @@ io.on("connection", function (_socket) {
125
144
  }
126
145
  var table = (0, MatchTable_1.MatchTable)(socket.session);
127
146
  table.lobby.addPlayer(user.id, socket.session);
147
+ socket.join(socket.session);
148
+ addSocketToUser(socket.session, socket.id, table);
128
149
  tables.set(socket.session, table);
129
150
  return callback({ success: true, match: table.getPublicMatch(user.id) });
130
151
  }
@@ -135,57 +156,51 @@ io.on("connection", function (_socket) {
135
156
  }
136
157
  callback({ success: false, error: new Error("Can't create match without an ID") });
137
158
  });
138
- var sendWaitingForPlay = function (table, session, play) { return __awaiter(void 0, void 0, void 0, function () {
159
+ var sendWaitingForPlay = function (table, play) { return __awaiter(void 0, void 0, void 0, function () {
139
160
  return __generator(this, function (_a) {
140
161
  switch (_a.label) {
141
- case 0: return [4 /*yield*/, getTableSockets(table, function (playerSocket) { return __awaiter(void 0, void 0, void 0, function () {
142
- return __generator(this, function (_a) {
143
- playerSocket.emit(types_1.EServerEvent.UPDATE_MATCH, table.getPublicMatch(playerSocket.session));
144
- return [2 /*return*/];
145
- });
146
- }); })];
147
- case 1:
148
- _a.sent();
149
- return [4 /*yield*/, getTableSockets(table, function (playerSocket) {
150
- return new Promise(function (resolve) {
151
- if (playerSocket.session === session) {
152
- playerSocket.emit(types_1.EServerEvent.WAITING_PLAY, table.getPublicMatch(session));
153
- playerSocket.once(types_1.EClientEvent.PLAY, function (_a) {
154
- var cardIdx = _a.cardIdx, command = _a.command;
155
- if (cardIdx !== undefined) {
156
- var playedCard = play.use(cardIdx);
157
- if (playedCard) {
158
- return resolve();
159
- }
160
- return console.error("ERROR", new Error("Couldnt play card"));
162
+ case 0: return [4 /*yield*/, getTableSockets(table, function (playerSocket) {
163
+ return new Promise(function (resolve) {
164
+ var _a;
165
+ if (playerSocket.session && playerSocket.session === ((_a = play.player) === null || _a === void 0 ? void 0 : _a.session)) {
166
+ playerSocket.emit(types_1.EServerEvent.WAITING_PLAY, table.getPublicMatch(playerSocket.session), function (data) {
167
+ if (!data) {
168
+ return;
169
+ }
170
+ var cardIdx = data.cardIdx, command = data.command;
171
+ if (cardIdx !== undefined) {
172
+ var playedCard = play.use(cardIdx);
173
+ if (playedCard) {
174
+ return resolve();
161
175
  }
162
- if (command) {
163
- var saidCommand = play.say(command);
164
- if (saidCommand) {
165
- return resolve();
166
- }
167
- return console.error("ERROR", new Error("Couldnt say command"));
176
+ return console.error("ERROR", new Error("Couldnt play card"));
177
+ }
178
+ if (command) {
179
+ var saidCommand = play.say(command);
180
+ if (saidCommand) {
181
+ return resolve();
168
182
  }
169
- return console.error("ERROR", new Error("Play callback didn't have data"));
170
- });
171
- }
172
- else {
173
- resolve();
174
- }
175
- });
176
- })];
177
- case 2:
183
+ return console.error("ERROR", new Error("Couldnt say command"));
184
+ }
185
+ return console.error("ERROR", new Error("Play callback didn't have data"));
186
+ });
187
+ }
188
+ else {
189
+ resolve();
190
+ }
191
+ });
192
+ })];
193
+ case 1:
178
194
  _a.sent();
179
195
  return [2 /*return*/];
180
196
  }
181
197
  });
182
198
  }); };
183
- var startMatch = function () { return __awaiter(void 0, void 0, void 0, function () {
184
- var tableId_1, table_1;
199
+ var startMatch = function (tableId) { return __awaiter(void 0, void 0, void 0, function () {
200
+ var table_1;
185
201
  return __generator(this, function (_a) {
186
202
  try {
187
- tableId_1 = socket.session;
188
- table_1 = getTable(tableId_1);
203
+ table_1 = getTable(tableId);
189
204
  if (table_1 && !table_1.lobby.gameLoop) {
190
205
  table_1.setState(MatchTable_1.EMatchTableState.STARTED);
191
206
  table_1.lobby
@@ -198,28 +213,30 @@ io.on("connection", function (_socket) {
198
213
  switch (_b.label) {
199
214
  case 0:
200
215
  table_1.setCurrentPlayer(play.player);
201
- turns.set(tableId_1, { play: play, resolve: resolve });
216
+ turns.set(table_1.matchSessionId, { play: play, resolve: resolve });
202
217
  _b.label = 1;
203
218
  case 1:
204
- _b.trys.push([1, 3, , 4]);
219
+ _b.trys.push([1, 4, , 5]);
205
220
  session = (_a = play.player) === null || _a === void 0 ? void 0 : _a.session;
206
- if (!session) {
221
+ if (!session || !play) {
207
222
  throw new Error("Unexpected Error");
208
223
  }
209
224
  user = users.get(session);
210
225
  if (!user) {
211
226
  throw new Error("Unexpected Error");
212
227
  }
213
- return [4 /*yield*/, sendWaitingForPlay(table_1, session, play)];
228
+ return [4 /*yield*/, emitMatchUpdate(table_1)];
214
229
  case 2:
215
230
  _b.sent();
216
- resolve();
217
- return [3 /*break*/, 4];
231
+ return [4 /*yield*/, sendWaitingForPlay(table_1, play)];
218
232
  case 3:
233
+ _b.sent();
234
+ return [2 /*return*/, resolve()];
235
+ case 4:
219
236
  e_1 = _b.sent();
220
237
  console.error("ERROR", e_1);
221
- return [3 /*break*/, 4];
222
- case 4: return [2 /*return*/];
238
+ return [3 /*break*/, 5];
239
+ case 5: return [2 /*return*/];
223
240
  }
224
241
  });
225
242
  }); });
@@ -246,9 +263,17 @@ io.on("connection", function (_socket) {
246
263
  */
247
264
  socket.on(types_1.EClientEvent.START_MATCH, function () {
248
265
  if (socket.session && users.has(socket.session)) {
249
- startMatch();
266
+ startMatch(socket.session);
250
267
  }
251
268
  });
269
+ var addSocketToUser = function (session, socketId, table) {
270
+ var user = getUser(session);
271
+ console.log("User got new match socket", { socketId: socketId, session: session, matchId: table.matchSessionId });
272
+ var currentMatchSockets = user.matchSocketIds.has(table.matchSessionId)
273
+ ? user.matchSocketIds.get(table.matchSessionId)
274
+ : new Set();
275
+ users.set(session, __assign(__assign({}, user), { matchSocketIds: user.matchSocketIds.set(table.matchSessionId, currentMatchSockets.add(socketId)) }));
276
+ };
252
277
  /**
253
278
  * Join Match
254
279
  */
@@ -259,7 +284,9 @@ io.on("connection", function (_socket) {
259
284
  var user = getUser(socket.session);
260
285
  var table = tables.get(matchSessionId);
261
286
  if (table && table.state === MatchTable_1.EMatchTableState.UNREADY) {
287
+ socket.join(matchSessionId);
262
288
  table.lobby.addPlayer(user.id || "satoshi", socket.session);
289
+ addSocketToUser(socket.session, socket.id, table);
263
290
  emitMatchUpdate(table);
264
291
  return callback({ success: true, match: table.getPublicMatch(socket.session) });
265
292
  }
@@ -278,58 +305,41 @@ io.on("connection", function (_socket) {
278
305
  /**
279
306
  * Set Session
280
307
  */
281
- socket.on(types_1.EClientEvent.SET_SESSION, function (session, id, callback) {
308
+ socket.on(types_1.EClientEvent.SET_SESSION, function (session, id, currentMatchId, callback) {
309
+ var _a;
282
310
  if (id === void 0) { id = "satoshi"; }
311
+ if (currentMatchId === void 0) { currentMatchId = null; }
312
+ if (callback === void 0) { callback = function () { }; }
283
313
  var user = users.get(session);
284
314
  if (user) {
285
- var updatedUser = {
286
- id: id,
287
- socketId: socket.id,
288
- };
315
+ var updatedUser = __assign(__assign({}, user), { id: id });
289
316
  users.set(session, updatedUser);
290
317
  socket.session = session;
291
- tables.forEach(function (table, id) { return __awaiter(void 0, void 0, void 0, function () {
292
- var _a, play, resolve, session_1, user_1, e_2;
293
- var _b, _c;
294
- return __generator(this, function (_d) {
295
- switch (_d.label) {
296
- case 0:
297
- if (!table.isSessionPlaying(session)) return [3 /*break*/, 5];
298
- socket.join(id);
299
- if (!(session === ((_b = table.currentPlayer) === null || _b === void 0 ? void 0 : _b.session))) return [3 /*break*/, 4];
300
- _d.label = 1;
301
- case 1:
302
- _d.trys.push([1, 3, , 4]);
303
- _a = turns.get(id) || {}, play = _a.play, resolve = _a.resolve;
304
- session_1 = (_c = play === null || play === void 0 ? void 0 : play.player) === null || _c === void 0 ? void 0 : _c.session;
305
- if (!play || !session_1) {
306
- throw new Error("Unexpected Error");
307
- }
308
- user_1 = users.get(session_1);
309
- if (!user_1) {
310
- throw new Error("Unexpected Error");
311
- }
312
- return [4 /*yield*/, sendWaitingForPlay(table, session_1, play)];
313
- case 2:
314
- _d.sent();
315
- resolve === null || resolve === void 0 ? void 0 : resolve();
316
- return [3 /*break*/, 4];
317
- case 3:
318
- e_2 = _d.sent();
319
- console.error("ERROR", e_2);
320
- return [3 /*break*/, 4];
321
- case 4:
322
- socket.emit(types_1.EServerEvent.UPDATE_MATCH, table.getPublicMatch(session));
323
- _d.label = 5;
324
- case 5: return [2 /*return*/];
318
+ var currentTable = currentMatchId ? tables.get(currentMatchId) : null;
319
+ if (currentTable && currentTable.isSessionPlaying(session)) {
320
+ addSocketToUser(session, socket.id, currentTable);
321
+ socket.join(currentTable.matchSessionId);
322
+ if (session === ((_a = currentTable.currentPlayer) === null || _a === void 0 ? void 0 : _a.session)) {
323
+ try {
324
+ var _b = turns.get(currentTable.matchSessionId) || {}, play = _b.play, resolve = _b.resolve;
325
+ if (!play) {
326
+ throw new Error("Unexpected Error");
327
+ }
328
+ sendWaitingForPlay(currentTable, play).then(resolve);
325
329
  }
326
- });
327
- }); });
330
+ catch (e) {
331
+ console.error("ERROR", e);
332
+ }
333
+ }
334
+ else {
335
+ socket.emit(types_1.EServerEvent.UPDATE_MATCH, currentTable.getPublicMatch(session));
336
+ }
337
+ }
328
338
  return callback({ success: true, session: session });
329
339
  }
330
340
  var newSession = (0, crypto_1.randomUUID)();
331
341
  socket.session = newSession;
332
- users.set(newSession, (0, User_1.User)(id, socket.id));
342
+ users.set(newSession, (0, User_1.User)(id));
333
343
  callback({ success: true, session: newSession });
334
344
  });
335
345
  /**
@@ -341,9 +351,6 @@ io.on("connection", function (_socket) {
341
351
  var player = table.lobby.players.find(function (player) { return player.session === socket.session; });
342
352
  if (player) {
343
353
  player.setReady(ready);
344
- if (ready) {
345
- socket.join(matchSessionId);
346
- }
347
354
  emitMatchUpdate(table);
348
355
  }
349
356
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trucoshi",
3
- "version": "0.0.16",
3
+ "version": "0.0.17",
4
4
  "main": "build/lib/trucoshi.js",
5
5
  "license": "GPL-3.0",
6
6
  "scripts": {