trucoshi 0.0.12 → 0.0.14

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
1
  import { IPlayer } from "../types";
2
+ export type IPublicPlayer = Pick<IPlayer, "id" | "disabled" | "ready" | "hand" | "usedHand" | "teamIdx" | "session">;
2
3
  export declare function Player(id: string, teamIdx: number): IPlayer;
@@ -4,12 +4,16 @@ exports.Player = void 0;
4
4
  function Player(id, teamIdx) {
5
5
  var player = {
6
6
  id: id,
7
+ session: undefined,
7
8
  teamIdx: teamIdx,
8
9
  hand: [],
9
10
  commands: [],
10
11
  usedHand: [],
11
12
  disabled: false,
12
13
  ready: false,
14
+ setSession: function (session) {
15
+ player.session = session;
16
+ },
13
17
  enable: function () {
14
18
  player.disabled = false;
15
19
  },
@@ -1,2 +1,3 @@
1
1
  import { IPlayer, ITeam } from "../types";
2
+ export type IPublicTeam = Pick<ITeam, "players" | "points">;
2
3
  export declare function Team(players: Array<IPlayer>): ITeam;
@@ -1,4 +1,4 @@
1
- import { IPlayInstance, ITeam, ITrucoshi } from "./types";
1
+ import { IHand, IPlayInstance, ITeam, ILobby } from "./types";
2
2
  export type IWinnerCallback = (winner: ITeam, teams: [ITeam, ITeam]) => Promise<void>;
3
3
  export type ITurnCallback = (play: IPlayInstance) => Promise<void>;
4
4
  export type ITrucoCallback = (play: IPlayInstance) => Promise<void>;
@@ -6,13 +6,11 @@ export interface IGameLoop {
6
6
  _onTruco: ITrucoCallback;
7
7
  _onTurn: ITurnCallback;
8
8
  _onWinner: IWinnerCallback;
9
+ teams: Array<ITeam>;
10
+ hands: Array<IHand>;
9
11
  onTurn: (callback: ITurnCallback) => IGameLoop;
10
12
  onWinner: (callback: IWinnerCallback) => IGameLoop;
11
13
  onTruco: (callback: ITrucoCallback) => IGameLoop;
12
14
  begin: () => void;
13
15
  }
14
- export declare function Trucoshi(teamSize?: 1 | 2 | 3): {
15
- addPlayer: (id: string, teamIdx?: 0 | 1 | undefined) => import("./types").IPlayer;
16
- removePlayer: (id: string) => ITrucoshi;
17
- startMatch: (matchPoint?: 9 | 12 | 15 | undefined) => IGameLoop;
18
- };
16
+ export declare function Lobby(teamSize?: 1 | 2 | 3): ILobby;
package/dist/lib/index.js CHANGED
@@ -36,7 +36,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
36
36
  }
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.Trucoshi = void 0;
39
+ exports.Lobby = void 0;
40
40
  var Match_1 = require("./classes/Match");
41
41
  var Player_1 = require("./classes/Player");
42
42
  var Table_1 = require("./classes/Table");
@@ -48,6 +48,8 @@ var GameLoop = function (match) {
48
48
  _onTruco: function () { return Promise.resolve(); },
49
49
  _onTurn: function () { return Promise.resolve(); },
50
50
  _onWinner: function () { return Promise.resolve(); },
51
+ teams: [],
52
+ hands: [],
51
53
  onTruco: function (callback) {
52
54
  gameloop._onTruco = callback;
53
55
  return gameloop;
@@ -66,25 +68,29 @@ var GameLoop = function (match) {
66
68
  return __generator(this, function (_a) {
67
69
  switch (_a.label) {
68
70
  case 0:
69
- if (!!match.winner) return [3 /*break*/, 5];
71
+ gameloop.teams = match.teams;
72
+ _a.label = 1;
73
+ case 1:
74
+ if (!!match.winner) return [3 /*break*/, 6];
70
75
  play = match.play();
76
+ gameloop.hands = match.hands;
71
77
  if (!play || !play.player) {
72
- return [3 /*break*/, 0];
78
+ return [3 /*break*/, 1];
73
79
  }
74
- if (!(play.state === types_1.EHandState.WAITING_FOR_TRUCO_ANSWER)) return [3 /*break*/, 2];
80
+ if (!(play.state === types_1.EHandState.WAITING_FOR_TRUCO_ANSWER)) return [3 /*break*/, 3];
75
81
  return [4 /*yield*/, gameloop._onTruco(play)];
76
- case 1:
77
- _a.sent();
78
- return [3 /*break*/, 0];
79
82
  case 2:
80
- if (!(play.state === types_1.EHandState.WAITING_PLAY)) return [3 /*break*/, 4];
81
- return [4 /*yield*/, gameloop._onTurn(play)];
83
+ _a.sent();
84
+ return [3 /*break*/, 1];
82
85
  case 3:
86
+ if (!(play.state === types_1.EHandState.WAITING_PLAY)) return [3 /*break*/, 5];
87
+ return [4 /*yield*/, gameloop._onTurn(play)];
88
+ case 4:
83
89
  _a.sent();
84
- return [3 /*break*/, 0];
85
- case 4: return [3 /*break*/, 0];
86
- case 5: return [4 /*yield*/, gameloop._onWinner(match.winner, match.teams)];
87
- case 6:
90
+ return [3 /*break*/, 1];
91
+ case 5: return [3 /*break*/, 1];
92
+ case 6: return [4 /*yield*/, gameloop._onWinner(match.winner, match.teams)];
93
+ case 7:
88
94
  _a.sent();
89
95
  return [2 /*return*/];
90
96
  }
@@ -94,7 +100,7 @@ var GameLoop = function (match) {
94
100
  };
95
101
  return gameloop;
96
102
  };
97
- function Trucoshi(teamSize) {
103
+ function Lobby(teamSize) {
98
104
  var trucoshi = {
99
105
  lastTeamIdx: 1,
100
106
  _players: new Map(),
@@ -106,6 +112,7 @@ function Trucoshi(teamSize) {
106
112
  maxPlayers: teamSize ? teamSize * 2 : 6,
107
113
  full: false,
108
114
  ready: false,
115
+ gameLoop: undefined,
109
116
  calculateReady: function () {
110
117
  trucoshi.ready = trucoshi.players.reduce(function (prev, curr) { return prev && curr.ready; }, true);
111
118
  return trucoshi.ready;
@@ -114,12 +121,13 @@ function Trucoshi(teamSize) {
114
121
  trucoshi.full = trucoshi._players.size >= trucoshi.maxPlayers;
115
122
  return trucoshi.full;
116
123
  },
117
- addPlayer: function (id, teamIdx) {
124
+ addPlayer: function (id, session, teamIdx) {
118
125
  var maxSize = teamSize ? teamSize : 3;
119
126
  if (trucoshi.full || trucoshi.players.filter(function (p) { return p.teamIdx === teamIdx; }).length > maxSize) {
120
127
  throw new Error(constants_1.GAME_ERROR.TEAM_IS_FULL);
121
128
  }
122
129
  var player = (0, Player_1.Player)(id, teamIdx !== undefined ? teamIdx : Number(!trucoshi.lastTeamIdx));
130
+ player.setSession(session);
123
131
  trucoshi.lastTeamIdx = Number(!trucoshi.lastTeamIdx);
124
132
  trucoshi._players.set(id, player);
125
133
  trucoshi.calculateFull();
@@ -142,20 +150,29 @@ function Trucoshi(teamSize) {
142
150
  if (!trucoshi.ready) {
143
151
  throw new Error(constants_1.GAME_ERROR.TEAM_NOT_READY);
144
152
  }
145
- trucoshi.teams.push((0, Team_1.Team)(trucoshi.players.filter(function (p) { return p.teamIdx === 0; })));
146
- trucoshi.teams.push((0, Team_1.Team)(trucoshi.players.filter(function (p) { return p.teamIdx === 1; })));
153
+ trucoshi.teams = [
154
+ (0, Team_1.Team)(trucoshi.players.filter(function (p) { return p.teamIdx === 0; })),
155
+ (0, Team_1.Team)(trucoshi.players.filter(function (p) { return p.teamIdx === 1; })),
156
+ ];
147
157
  if (trucoshi.teams[0].players.length !== teamSize ||
148
158
  trucoshi.teams[1].players.length !== teamSize) {
149
159
  throw new Error(constants_1.GAME_ERROR.UNEXPECTED_TEAM_SIZE);
150
160
  }
151
161
  trucoshi.table = (0, Table_1.Table)(trucoshi.players, trucoshi.teams);
152
- return GameLoop((0, Match_1.Match)(trucoshi.table, trucoshi.teams, matchPoint));
162
+ trucoshi.gameLoop = GameLoop((0, Match_1.Match)(trucoshi.table, trucoshi.teams, matchPoint));
163
+ return trucoshi.gameLoop;
153
164
  },
154
165
  };
155
166
  return {
156
167
  addPlayer: trucoshi.addPlayer,
157
168
  removePlayer: trucoshi.removePlayer,
158
169
  startMatch: trucoshi.startMatch,
170
+ teams: trucoshi.teams,
171
+ get players() {
172
+ return Array.from(trucoshi._players.values());
173
+ },
174
+ full: trucoshi.full,
175
+ ready: trucoshi.ready,
159
176
  };
160
177
  }
161
- exports.Trucoshi = Trucoshi;
178
+ exports.Lobby = Lobby;
@@ -1,4 +1,5 @@
1
1
  import { IGameLoop } from ".";
2
+ import { IPublicPlayer } from "./classes/Player";
2
3
  import { CARDS } from "./constants";
3
4
  export type ICard = keyof typeof CARDS;
4
5
  export interface IDeck {
@@ -8,17 +9,19 @@ export interface IDeck {
8
9
  shuffle(): IDeck;
9
10
  }
10
11
  export interface IPlayedCard {
11
- player: IPlayer;
12
+ player: IPlayer & IPublicPlayer;
12
13
  card: ICard;
13
14
  }
14
15
  export interface IPlayer {
15
16
  teamIdx: number;
16
17
  id: string;
18
+ session?: string;
17
19
  hand: Array<ICard>;
18
20
  commands: Array<ECommand>;
19
21
  usedHand: Array<ICard>;
20
22
  disabled: boolean;
21
23
  ready: boolean;
24
+ setSession(session: string): void;
22
25
  enable(): void;
23
26
  disable(): void;
24
27
  setReady(ready: boolean): void;
@@ -144,7 +147,8 @@ export interface IHand {
144
147
  setState(state: EHandState): EHandState;
145
148
  getNextPlayer(): IteratorResult<IHand, IHand | void>;
146
149
  }
147
- export interface IPrivateTrucoshi {
150
+ export interface IPrivateLobby {
151
+ gameLoop?: IGameLoop;
148
152
  lastTeamIdx: 0 | 1;
149
153
  _players: Map<string, IPlayer>;
150
154
  get players(): Array<IPlayer>;
@@ -153,13 +157,13 @@ export interface IPrivateTrucoshi {
153
157
  table: ITable | null;
154
158
  ready: boolean;
155
159
  full: boolean;
156
- addPlayer(id: string, teamIdx?: 0 | 1): IPlayer;
157
- removePlayer(id: string): ITrucoshi;
160
+ addPlayer(id: string, session: string, teamIdx?: 0 | 1): IPlayer;
161
+ removePlayer(id: string): ILobby;
158
162
  calculateReady(): boolean;
159
163
  calculateFull(): boolean;
160
164
  startMatch(matchPoint?: 9 | 12 | 15): IGameLoop;
161
165
  }
162
- export interface ITrucoshi extends Pick<IPrivateTrucoshi, 'addPlayer' | 'removePlayer' | 'startMatch'> {
166
+ export interface ILobby extends Pick<IPrivateLobby, "addPlayer" | "removePlayer" | "startMatch" | "ready" | "full" | "teams" | "players" | "gameLoop"> {
163
167
  }
164
168
  export interface ITable {
165
169
  forehandIdx: number;
@@ -0,0 +1,21 @@
1
+ import { IPublicPlayer } from "../../lib/classes/Player";
2
+ import { IPublicTeam } from "../../lib/classes/Team";
3
+ import { ILobby, IPlayedCard } from "../../lib/types";
4
+ export interface IPublicMatch {
5
+ teams: Array<IPublicTeam>;
6
+ players: Array<IPublicPlayer>;
7
+ hands: Array<Array<Array<IPlayedCard>>>;
8
+ }
9
+ export interface IMatchTable {
10
+ matchSessionId: string;
11
+ lobby: ILobby;
12
+ state: EMatchTableState;
13
+ setState(state: EMatchTableState): void;
14
+ getPublicMatch(session?: string): IPublicMatch;
15
+ }
16
+ export declare enum EMatchTableState {
17
+ UNREADY = 0,
18
+ STARTED = 1,
19
+ FINISHED = 2
20
+ }
21
+ export declare function MatchTable(matchSessionId: string, teamSize?: 1 | 2 | 3): IMatchTable;
@@ -0,0 +1,48 @@
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
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.MatchTable = exports.EMatchTableState = void 0;
15
+ var lib_1 = require("../../lib");
16
+ var EMatchTableState;
17
+ (function (EMatchTableState) {
18
+ EMatchTableState[EMatchTableState["UNREADY"] = 0] = "UNREADY";
19
+ EMatchTableState[EMatchTableState["STARTED"] = 1] = "STARTED";
20
+ EMatchTableState[EMatchTableState["FINISHED"] = 2] = "FINISHED";
21
+ })(EMatchTableState = exports.EMatchTableState || (exports.EMatchTableState = {}));
22
+ function MatchTable(matchSessionId, teamSize) {
23
+ var matchTable = {
24
+ matchSessionId: matchSessionId,
25
+ lobby: (0, lib_1.Lobby)(teamSize),
26
+ state: EMatchTableState.UNREADY,
27
+ setState: function (state) {
28
+ matchTable.state = state;
29
+ },
30
+ getPublicMatch: function (userSession) {
31
+ var _a;
32
+ console.log(matchTable.lobby.gameLoop);
33
+ return {
34
+ matchSessionId: matchSessionId,
35
+ teams: [],
36
+ players: matchTable.lobby.players.map(function (player) {
37
+ return player.session === userSession
38
+ ? player
39
+ : __assign(__assign({}, player), { hand: player.hand.map(function () { return "xx"; }) });
40
+ }),
41
+ hands: ((_a = matchTable.lobby.gameLoop) === null || _a === void 0 ? void 0 : _a.hands.map(function (hand) { return hand.rounds.map(function (round) { return round.cards; }); })) ||
42
+ [],
43
+ };
44
+ },
45
+ };
46
+ return matchTable;
47
+ }
48
+ exports.MatchTable = MatchTable;
@@ -0,0 +1,5 @@
1
+ export interface IUser {
2
+ id: string;
3
+ socketId: string;
4
+ }
5
+ export declare function User(id: string, socketId: string): IUser;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.User = void 0;
4
+ function User(id, socketId) {
5
+ var user = {
6
+ id: id,
7
+ socketId: socketId,
8
+ };
9
+ return user;
10
+ }
11
+ exports.User = User;
@@ -1,7 +1,46 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
2
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
+ var crypto_1 = require("crypto");
3
40
  var http_1 = require("http");
4
41
  var socket_io_1 = require("socket.io");
42
+ var MatchTable_1 = require("./classes/MatchTable");
43
+ var user_1 = require("./classes/user");
5
44
  var types_1 = require("./types");
6
45
  var PORT = 4001;
7
46
  var httpServer = (0, http_1.createServer)();
@@ -11,15 +50,222 @@ var io = new socket_io_1.Server(httpServer, {
11
50
  methods: ["GET", "POST"],
12
51
  },
13
52
  });
14
- var sessions = new Map();
15
- io.on("connection", function (socket) {
53
+ var users = new Map(); // sessionId, user
54
+ var tables = new Map(); // sessionId, table
55
+ var getUser = function (session) {
56
+ var user = users.get(session);
57
+ if (user) {
58
+ return user;
59
+ }
60
+ throw new Error("User not found");
61
+ };
62
+ var getTable = function (matchSessionId) {
63
+ var table = tables.get(matchSessionId);
64
+ if (table) {
65
+ return table;
66
+ }
67
+ throw new Error("Match Session not found");
68
+ };
69
+ io.on("connection", function (_socket) {
70
+ var socket = _socket;
71
+ console.error("New connection");
72
+ var getTableSockets = function (table, callback) {
73
+ return new Promise(function (resolve) { return __awaiter(void 0, void 0, void 0, function () {
74
+ var sockets, _i, sockets_1, socket_1;
75
+ return __generator(this, function (_a) {
76
+ switch (_a.label) {
77
+ case 0: return [4 /*yield*/, io.sockets.adapter.fetchSockets({
78
+ rooms: new Set([table.matchSessionId]),
79
+ })];
80
+ case 1:
81
+ sockets = _a.sent();
82
+ _i = 0, sockets_1 = sockets;
83
+ _a.label = 2;
84
+ case 2:
85
+ if (!(_i < sockets_1.length)) return [3 /*break*/, 5];
86
+ socket_1 = sockets_1[_i];
87
+ return [4 /*yield*/, callback(socket_1)];
88
+ case 3:
89
+ _a.sent();
90
+ _a.label = 4;
91
+ case 4:
92
+ _i++;
93
+ return [3 /*break*/, 2];
94
+ case 5:
95
+ resolve();
96
+ return [2 /*return*/];
97
+ }
98
+ });
99
+ }); });
100
+ };
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));
106
+ }
107
+ });
108
+ };
16
109
  socket.on(types_1.EClientEvent.PING, function (msg) {
17
- io.emit(types_1.EServerEvent.PONG, msg);
110
+ socket.emit(types_1.EServerEvent.PONG, msg);
111
+ });
112
+ /**
113
+ * Create Match
114
+ */
115
+ socket.on(types_1.EClientEvent.CREATE_MATCH, function (callback) {
116
+ if (socket.session) {
117
+ var user = getUser(socket.session);
118
+ var existingTable = tables.get(socket.session);
119
+ if (existingTable) {
120
+ return callback({
121
+ success: false,
122
+ match: existingTable.getPublicMatch(socket.session),
123
+ });
124
+ }
125
+ try {
126
+ var table = (0, MatchTable_1.MatchTable)(socket.session);
127
+ table.lobby.addPlayer(user.id, socket.session);
128
+ tables.set(socket.session, table);
129
+ console.log("creating match", socket.session, table.state);
130
+ return callback({ success: true, match: table.getPublicMatch(user.id) });
131
+ }
132
+ catch (e) {
133
+ console.error("ERROR", e);
134
+ return callback({ success: false, error: e });
135
+ }
136
+ }
137
+ callback({ success: false, error: new Error("Can't create match without an ID") });
138
+ });
139
+ /**
140
+ * Start Match
141
+ */
142
+ socket.on(types_1.EClientEvent.START_MATCH, function (callback) {
143
+ if (socket.session && users.has(socket.session)) {
144
+ try {
145
+ var table_1 = getTable(socket.session);
146
+ if (table_1 && !table_1.lobby.gameLoop) {
147
+ table_1.setState(MatchTable_1.EMatchTableState.STARTED);
148
+ var game = table_1.lobby
149
+ .startMatch()
150
+ .onTurn(function (play) { return __awaiter(void 0, void 0, void 0, function () {
151
+ var session, user;
152
+ var _a;
153
+ return __generator(this, function (_b) {
154
+ switch (_b.label) {
155
+ case 0: return [4 /*yield*/, getTableSockets(table_1, function (socket) { return __awaiter(void 0, void 0, void 0, function () {
156
+ return __generator(this, function (_a) {
157
+ socket.emit(types_1.EServerEvent.UPDATE_MATCH, table_1.getPublicMatch(socket.session));
158
+ return [2 /*return*/];
159
+ });
160
+ }); })];
161
+ case 1:
162
+ _b.sent();
163
+ session = (_a = play.player) === null || _a === void 0 ? void 0 : _a.session;
164
+ if (!session) {
165
+ throw new Error("Unexpected Error");
166
+ }
167
+ user = users.get(session);
168
+ if (!user) {
169
+ throw new Error("Unexpected Error");
170
+ }
171
+ return [4 /*yield*/, getTableSockets(table_1, function (socket) {
172
+ return new Promise(function (resolve) {
173
+ if (socket.session === session) {
174
+ socket.emit(types_1.EServerEvent.UPDATE_MATCH, table_1.getPublicMatch(session));
175
+ socket.on(types_1.EClientEvent.PLAY, function () {
176
+ resolve();
177
+ });
178
+ }
179
+ });
180
+ })];
181
+ case 2:
182
+ _b.sent();
183
+ return [2 /*return*/];
184
+ }
185
+ });
186
+ }); })
187
+ .onTruco(function (play) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
188
+ return [2 /*return*/];
189
+ }); }); })
190
+ .onWinner(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
191
+ return [2 /*return*/];
192
+ }); }); })
193
+ .begin();
194
+ emitMatchUpdate(table_1);
195
+ return callback({ success: true, match: table_1.getPublicMatch(socket.session) });
196
+ }
197
+ console.error("ASL:KDJALSk");
198
+ callback({ success: false, match: table_1.getPublicMatch(socket.session) });
199
+ }
200
+ catch (e) {
201
+ console.error("ERROR", e);
202
+ callback({ success: false, error: e });
203
+ }
204
+ }
205
+ });
206
+ /**
207
+ * Join Match
208
+ */
209
+ socket.on(types_1.EClientEvent.JOIN_MATCH, function (matchSessionId, callback) {
210
+ if (!socket.session) {
211
+ return callback({ success: false });
212
+ }
213
+ var user = getUser(socket.session);
214
+ var table = tables.get(matchSessionId);
215
+ if (table && table.state === MatchTable_1.EMatchTableState.UNREADY) {
216
+ table.lobby.addPlayer(user.id || "satoshi", socket.session);
217
+ emitMatchUpdate(table);
218
+ return callback({ success: true, match: table.getPublicMatch(socket.session) });
219
+ }
220
+ callback({ success: false });
221
+ });
222
+ /**
223
+ * Get Match
224
+ */
225
+ socket.on(types_1.EClientEvent.GET_MATCH, function (matchSessionId, callback) {
226
+ var table = tables.get(matchSessionId);
227
+ if (table) {
228
+ return callback({ success: true, match: table.getPublicMatch(socket.session) });
229
+ }
230
+ callback({ success: false });
18
231
  });
19
- socket.on(types_1.EClientEvent.CREATE_MATCH, function (msg) {
232
+ /**
233
+ * Set Session
234
+ */
235
+ socket.on(types_1.EClientEvent.SET_SESSION, function (session, id, callback) {
236
+ if (id === void 0) { id = "satoshi"; }
237
+ var user = users.get(session);
238
+ if (user) {
239
+ var updatedUser = {
240
+ id: id,
241
+ socketId: socket.id,
242
+ };
243
+ users.set(session, updatedUser);
244
+ socket.session = session;
245
+ return callback({ success: true, session: session });
246
+ }
247
+ var newSession = (0, crypto_1.randomUUID)();
248
+ socket.session = newSession;
249
+ users.set(newSession, (0, user_1.User)(id, socket.id));
250
+ callback({ success: true, session: newSession });
20
251
  });
21
- socket.on(types_1.EClientEvent.SET_PLAYER_ID, function (msg) {
22
- if (typeof msg === 'string' && msg.length < 32) {
252
+ /**
253
+ * Set Player Ready
254
+ */
255
+ socket.on(types_1.EClientEvent.SET_PLAYER_READY, function (matchSessionId, ready) {
256
+ try {
257
+ var table = getTable(matchSessionId);
258
+ var player = table.lobby.players.find(function (player) { return player.session === socket.session; });
259
+ if (player) {
260
+ player.setReady(ready);
261
+ if (ready) {
262
+ socket.join(matchSessionId);
263
+ }
264
+ emitMatchUpdate(table);
265
+ }
266
+ }
267
+ catch (e) {
268
+ console.error("ERROR", e);
23
269
  }
24
270
  });
25
271
  });
@@ -1,11 +1,23 @@
1
+ import { Socket } from "socket.io";
1
2
  export declare enum EClientEvent {
2
3
  PING = "PING",
4
+ PLAY = "PLAY",
3
5
  CREATE_MATCH = "CREATE_MATCH",
6
+ GET_MATCH = "GET_MATCH",
4
7
  JOIN_MATCH = "JOIN_MATCH",
5
8
  START_MATCH = "START_MATCH",
6
- SET_PLAYER_ID = "SET_PLAYER_ID"
9
+ SET_PLAYER_READY = "SET_PLAYER_READY",
10
+ SET_SESSION = "SET_SESSION"
7
11
  }
8
12
  export declare enum EServerEvent {
9
- SET_SESSION_ID = "SET_SESSION_ID",
10
- PONG = "PONG"
13
+ PONG = "PONG",
14
+ UPDATE_MATCH = "UPDATE_MATCH"
15
+ }
16
+ export interface TrucoshiSocket extends Socket {
17
+ session?: string;
18
+ }
19
+ export declare enum ETrucoshiMatchState {
20
+ UNREADY = 0,
21
+ STARTED = 1,
22
+ FINISHED = 2
11
23
  }
@@ -1,16 +1,25 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EServerEvent = exports.EClientEvent = void 0;
3
+ exports.ETrucoshiMatchState = exports.EServerEvent = exports.EClientEvent = void 0;
4
4
  var EClientEvent;
5
5
  (function (EClientEvent) {
6
6
  EClientEvent["PING"] = "PING";
7
+ EClientEvent["PLAY"] = "PLAY";
7
8
  EClientEvent["CREATE_MATCH"] = "CREATE_MATCH";
9
+ EClientEvent["GET_MATCH"] = "GET_MATCH";
8
10
  EClientEvent["JOIN_MATCH"] = "JOIN_MATCH";
9
11
  EClientEvent["START_MATCH"] = "START_MATCH";
10
- EClientEvent["SET_PLAYER_ID"] = "SET_PLAYER_ID";
12
+ EClientEvent["SET_PLAYER_READY"] = "SET_PLAYER_READY";
13
+ EClientEvent["SET_SESSION"] = "SET_SESSION";
11
14
  })(EClientEvent = exports.EClientEvent || (exports.EClientEvent = {}));
12
15
  var EServerEvent;
13
16
  (function (EServerEvent) {
14
- EServerEvent["SET_SESSION_ID"] = "SET_SESSION_ID";
15
17
  EServerEvent["PONG"] = "PONG";
18
+ EServerEvent["UPDATE_MATCH"] = "UPDATE_MATCH";
16
19
  })(EServerEvent = exports.EServerEvent || (exports.EServerEvent = {}));
20
+ var ETrucoshiMatchState;
21
+ (function (ETrucoshiMatchState) {
22
+ ETrucoshiMatchState[ETrucoshiMatchState["UNREADY"] = 0] = "UNREADY";
23
+ ETrucoshiMatchState[ETrucoshiMatchState["STARTED"] = 1] = "STARTED";
24
+ ETrucoshiMatchState[ETrucoshiMatchState["FINISHED"] = 2] = "FINISHED";
25
+ })(ETrucoshiMatchState = exports.ETrucoshiMatchState || (exports.ETrucoshiMatchState = {}));
@@ -40,13 +40,13 @@ var lib_1 = require("../lib");
40
40
  (function () { return __awaiter(void 0, void 0, void 0, function () {
41
41
  var trucoshi;
42
42
  return __generator(this, function (_a) {
43
- trucoshi = (0, lib_1.Trucoshi)();
44
- trucoshi.addPlayer("lukini").setReady(true);
45
- trucoshi.addPlayer("denoph").setReady(true);
46
- trucoshi.addPlayer("guada").setReady(true);
47
- trucoshi.addPlayer("juli").setReady(true);
48
- trucoshi.addPlayer("day").setReady(true);
49
- trucoshi.addPlayer("fran").setReady(true);
43
+ trucoshi = (0, lib_1.Lobby)();
44
+ trucoshi.addPlayer("lukini", "lukini").setReady(true);
45
+ trucoshi.addPlayer("denoph", "denoph").setReady(true);
46
+ trucoshi.addPlayer("guada", "guada").setReady(true);
47
+ trucoshi.addPlayer("juli", "juli").setReady(true);
48
+ trucoshi.addPlayer("day", "day").setReady(true);
49
+ trucoshi.addPlayer("fran", "fran").setReady(true);
50
50
  trucoshi
51
51
  .startMatch()
52
52
  .onTurn(function (play) { return __awaiter(void 0, void 0, void 0, function () {
package/dist/test/play.js CHANGED
@@ -158,11 +158,11 @@ var sayCommand = function (play, canPlay) {
158
158
  (function () { return __awaiter(void 0, void 0, void 0, function () {
159
159
  var trucoshi;
160
160
  return __generator(this, function (_a) {
161
- trucoshi = (0, lib_1.Trucoshi)();
162
- trucoshi.addPlayer("lukini", 0).setReady(true);
163
- trucoshi.addPlayer("guada", 0).setReady(true);
164
- trucoshi.addPlayer("denoph", 1).setReady(true);
165
- trucoshi.addPlayer("juli", 1).setReady(true);
161
+ trucoshi = (0, lib_1.Lobby)();
162
+ trucoshi.addPlayer("lukini", "lukini").setReady(true);
163
+ trucoshi.addPlayer("denoph", "denoph").setReady(true);
164
+ trucoshi.addPlayer("guada", "guada").setReady(true);
165
+ trucoshi.addPlayer("juli", "juli").setReady(true);
166
166
  trucoshi
167
167
  .startMatch()
168
168
  .onTruco(function (play) { return __awaiter(void 0, void 0, void 0, function () {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trucoshi",
3
- "version": "0.0.12",
3
+ "version": "0.0.14",
4
4
  "main": "build/lib/trucoshi.js",
5
5
  "license": "GPL-3.0",
6
6
  "scripts": {