trucoshi 1.0.0 → 2.0.1

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.
package/README.md ADDED
@@ -0,0 +1,64 @@
1
+ # Trucoshi
2
+
3
+ ### English
4
+
5
+ Work in progress
6
+
7
+ Pretends to be an Argentinian Truco game socket server that allows you to put Satoshis on the table ;)
8
+
9
+ Try current demo at [Trucoshi](https://trucoshi.com)
10
+
11
+ ### Spanish
12
+
13
+ En construccion
14
+
15
+ Pretende ser un server basado en sockets del juego de Truco Argentino que te permita poner unos Satoshis en la mesa ;)
16
+
17
+ Proba la demo actual en [Trucoshi](https://trucoshi.com)
18
+
19
+ # Client
20
+
21
+ [Trucoshi React Client](https://github.com/jfrader/trucoshi-client)
22
+
23
+ ### Installation
24
+
25
+ `yarn`
26
+
27
+ ### Build
28
+
29
+ `yarn build`
30
+
31
+ # Test
32
+
33
+ `yarn test`
34
+
35
+ ### Play
36
+
37
+ `yarn cli:play`
38
+
39
+ ### Autoplay
40
+
41
+ `yarn cli:autoplay`
42
+
43
+ # Todo
44
+
45
+ [x] Logica de turnos, rondas y battalla de cartas
46
+ [x] Irse al mazo
47
+ [x] Cantar truco
48
+ [x] Cantar envido
49
+ [] Cantar flor
50
+ [x] Socket server
51
+ [x] Unit tests
52
+ [] Bitcoin Lightning integration
53
+
54
+ # Donations
55
+
56
+ Donate Bitcoin at [jfrader.com](https://jfrader.com)
57
+
58
+ # License
59
+
60
+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
61
+
62
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
63
+
64
+ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
@@ -0,0 +1,89 @@
1
+ export declare const PLAYER_ABANDON_TIMEOUT: number;
2
+ export declare const PLAYER_TURN_TIMEOUT: number;
3
+ export declare const PREVIOUS_HAND_ACK_TIMEOUT: number;
4
+ export declare const CARDS: {
5
+ "1e": number;
6
+ "1b": number;
7
+ "7e": number;
8
+ "7o": number;
9
+ "3e": number;
10
+ "3o": number;
11
+ "3b": number;
12
+ "3c": number;
13
+ "2e": number;
14
+ "2o": number;
15
+ "2b": number;
16
+ "2c": number;
17
+ "1o": number;
18
+ "1c": number;
19
+ re: number;
20
+ ro: number;
21
+ rb: number;
22
+ rc: number;
23
+ ce: number;
24
+ co: number;
25
+ cb: number;
26
+ cc: number;
27
+ pe: number;
28
+ po: number;
29
+ pb: number;
30
+ pc: number;
31
+ "7b": number;
32
+ "7c": number;
33
+ "6e": number;
34
+ "6o": number;
35
+ "6b": number;
36
+ "6c": number;
37
+ "5e": number;
38
+ "5o": number;
39
+ "5b": number;
40
+ "5c": number;
41
+ "4e": number;
42
+ "4o": number;
43
+ "4b": number;
44
+ "4c": number;
45
+ };
46
+ export declare const BURNT_CARD: "rb" | "1e" | "1b" | "7e" | "7o" | "3e" | "3o" | "3b" | "3c" | "2e" | "2o" | "2b" | "2c" | "1o" | "1c" | "re" | "ro" | "rc" | "ce" | "co" | "cb" | "cc" | "pe" | "po" | "pb" | "pc" | "7b" | "7c" | "6e" | "6o" | "6b" | "6c" | "5e" | "5o" | "5b" | "5c" | "4e" | "4o" | "4b" | "4c";
47
+ export declare const CARDS_HUMAN_READABLE: {
48
+ "1e": string;
49
+ "1b": string;
50
+ "7e": string;
51
+ "7o": string;
52
+ "3e": string;
53
+ "3o": string;
54
+ "3b": string;
55
+ "3c": string;
56
+ "2e": string;
57
+ "2o": string;
58
+ "2b": string;
59
+ "2c": string;
60
+ "1o": string;
61
+ "1c": string;
62
+ re: string;
63
+ ro: string;
64
+ rb: string;
65
+ rc: string;
66
+ ce: string;
67
+ co: string;
68
+ cb: string;
69
+ cc: string;
70
+ pe: string;
71
+ po: string;
72
+ pb: string;
73
+ pc: string;
74
+ "7b": string;
75
+ "7c": string;
76
+ "6e": string;
77
+ "6o": string;
78
+ "6b": string;
79
+ "6c": string;
80
+ "5e": string;
81
+ "5o": string;
82
+ "5b": string;
83
+ "5c": string;
84
+ "4e": string;
85
+ "4o": string;
86
+ "4b": string;
87
+ "4c": string;
88
+ };
89
+ export declare const TEAM_SIZE_VALUES: number[];
@@ -0,0 +1,89 @@
1
+ export const PLAYER_ABANDON_TIMEOUT = 1000 * 45;
2
+ export const PLAYER_TURN_TIMEOUT = 1000 * 30;
3
+ export const PREVIOUS_HAND_ACK_TIMEOUT = 1000 * 5;
4
+ export const CARDS = {
5
+ "1e": 13,
6
+ "1b": 12,
7
+ "7e": 11,
8
+ "7o": 10,
9
+ "3e": 9,
10
+ "3o": 9,
11
+ "3b": 9,
12
+ "3c": 9,
13
+ "2e": 8,
14
+ "2o": 8,
15
+ "2b": 8,
16
+ "2c": 8,
17
+ "1o": 7,
18
+ "1c": 7,
19
+ re: 6,
20
+ ro: 6,
21
+ rb: 6,
22
+ rc: 6,
23
+ ce: 5,
24
+ co: 5,
25
+ cb: 5,
26
+ cc: 5,
27
+ pe: 4,
28
+ po: 4,
29
+ pb: 4,
30
+ pc: 4,
31
+ "7b": 3,
32
+ "7c": 3,
33
+ "6e": 2,
34
+ "6o": 2,
35
+ "6b": 2,
36
+ "6c": 2,
37
+ "5e": 1,
38
+ "5o": 1,
39
+ "5b": 1,
40
+ "5c": 1,
41
+ "4e": 0,
42
+ "4o": 0,
43
+ "4b": 0,
44
+ "4c": 0,
45
+ };
46
+ export const BURNT_CARD = "xx";
47
+ export const CARDS_HUMAN_READABLE = {
48
+ "1e": "1🗡️",
49
+ "1b": "1🌵",
50
+ "7e": "7🗡️",
51
+ "7o": "7💰",
52
+ "3e": "3🗡️",
53
+ "3o": "3💰",
54
+ "3b": "3🌵",
55
+ "3c": "3🍷",
56
+ "2e": "2🗡️",
57
+ "2o": "2💰",
58
+ "2b": "2🌵",
59
+ "2c": "2🍷",
60
+ "1o": "1💰",
61
+ "1c": "1🍷",
62
+ re: "12🗡️",
63
+ ro: "12💰",
64
+ rb: "12🌵",
65
+ rc: "12🍷",
66
+ ce: "11🗡️",
67
+ co: "11💰",
68
+ cb: "11🌵",
69
+ cc: "11🍷",
70
+ pe: "10🗡️",
71
+ po: "10💰",
72
+ pb: "10🌵",
73
+ pc: "10🍷",
74
+ "7b": "7🌵",
75
+ "7c": "7🍷",
76
+ "6e": "6🗡️",
77
+ "6o": "6💰",
78
+ "6b": "6🌵",
79
+ "6c": "6🍷",
80
+ "5e": "5🗡️",
81
+ "5o": "5💰",
82
+ "5b": "5🌵",
83
+ "5c": "5🍷",
84
+ "4e": "4🗡️",
85
+ "4o": "4💰",
86
+ "4b": "4🌵",
87
+ "4c": "4🍷",
88
+ };
89
+ export const TEAM_SIZE_VALUES = [1, 2, 3];
@@ -0,0 +1,3 @@
1
+ export declare const PLAYER_TIMEOUT_GRACE = 500;
2
+ export declare const PLAYER_LOBBY_TIMEOUT: number;
3
+ export declare const MATCH_FINISHED_CLEANUP_TIMEOUT: number;
@@ -0,0 +1,3 @@
1
+ export const PLAYER_TIMEOUT_GRACE = 500;
2
+ export const PLAYER_LOBBY_TIMEOUT = 1000 * 10;
3
+ export const MATCH_FINISHED_CLEANUP_TIMEOUT = 1000 * 60 * 2;
@@ -0,0 +1,333 @@
1
+ import { User } from "lightning-accounts";
2
+ import { CARDS, IHand } from "./lib";
3
+ import { IUserData } from "./server";
4
+ import { EMatchState } from "@prisma/client";
5
+ export { CARDS, CARDS_HUMAN_READABLE, BURNT_CARD } from "./lib/constants";
6
+ export { EMatchState };
7
+ export interface ILobbyOptions {
8
+ maxPlayers: 2 | 4 | 6;
9
+ faltaEnvido: 1 | 2;
10
+ flor: boolean;
11
+ matchPoint: number;
12
+ handAckTime: number;
13
+ turnTime: number;
14
+ abandonTime: number;
15
+ satsPerPlayer: number;
16
+ }
17
+ export interface ISaidCommand {
18
+ player: IPlayer | IPublicPlayer;
19
+ command: ECommand | number;
20
+ }
21
+ export interface IMatchPreviousHand {
22
+ rounds: IPlayedCard[][];
23
+ points: IHandPoints;
24
+ matchSessionId: string;
25
+ }
26
+ export interface IPublicMatch {
27
+ options: ILobbyOptions;
28
+ state: EMatchState;
29
+ winner: ITeam | null;
30
+ matchSessionId: string;
31
+ teams: Array<IPublicTeam>;
32
+ players: Array<IPublicPlayer>;
33
+ me: IPublicPlayer | null;
34
+ freshHand: boolean;
35
+ rounds: IPlayedCard[][];
36
+ lastCard?: ICard | null;
37
+ lastCommand?: ECommand | number | null;
38
+ }
39
+ export interface IPublicMatchInfo {
40
+ ownerId: string;
41
+ matchSessionId: string;
42
+ players: number;
43
+ options: ILobbyOptions;
44
+ state: EMatchState;
45
+ }
46
+ export type IPublicChatRoom = Pick<IChatRoom, "id" | "messages">;
47
+ export interface IChatMessage {
48
+ id: string;
49
+ date: number;
50
+ user: {
51
+ name: string;
52
+ key: string;
53
+ };
54
+ system?: boolean;
55
+ command?: boolean;
56
+ card?: boolean;
57
+ content: string;
58
+ }
59
+ export interface IChatRoom {
60
+ id: string;
61
+ messages: Array<IChatMessage>;
62
+ socket: {
63
+ emit(socket: string): void;
64
+ };
65
+ send(user: IChatMessage["user"], message: string): void;
66
+ card(user: IChatMessage["user"], card: ICard): void;
67
+ command(team: 0 | 1, command: ECommand | number): void;
68
+ system(message: string): void;
69
+ emit(message?: IChatMessage): void;
70
+ }
71
+ export declare enum EChatSystem {
72
+ TEAM_0 = 0,
73
+ TEAM_1 = 1,
74
+ SYSTEM = "SYSTEM"
75
+ }
76
+ export declare enum ESayCommand {
77
+ MAZO = "MAZO"
78
+ }
79
+ export declare enum EFlorCommand {
80
+ FLOR = "FLOR",
81
+ CONTRAFLOR = "CONTRAFLOR"
82
+ }
83
+ export declare enum ETrucoCommand {
84
+ TRUCO = "TRUCO",
85
+ RE_TRUCO = "RE_TRUCO",
86
+ VALE_CUATRO = "VALE_CUATRO"
87
+ }
88
+ export declare enum EAnswerCommand {
89
+ QUIERO = "QUIERO",
90
+ NO_QUIERO = "NO_QUIERO"
91
+ }
92
+ export declare enum EEnvidoAnswerCommand {
93
+ SON_BUENAS = "SON_BUENAS"
94
+ }
95
+ export declare enum EEnvidoCommand {
96
+ ENVIDO = "ENVIDO",
97
+ REAL_ENVIDO = "REAL_ENVIDO",
98
+ FALTA_ENVIDO = "FALTA_ENVIDO"
99
+ }
100
+ export declare enum EHandState {
101
+ WAITING_PLAY = "WAITING_PLAY",
102
+ WAITING_FOR_TRUCO_ANSWER = "WAITING_FOR_TRUCO_ANSWER",
103
+ WAITING_ENVIDO_ANSWER = "WAITING_ENVIDO_ANSWER",
104
+ WAITING_ENVIDO_POINTS_ANSWER = "WAITING_ENVIDO_POINTS_ANSWER",
105
+ FINISHED = "FINISHED"
106
+ }
107
+ export type ECommand = ESayCommand | EEnvidoCommand | EAnswerCommand | EEnvidoAnswerCommand | ETrucoCommand | EFlorCommand;
108
+ export type IHandCommands = {
109
+ [key in ECommand]: (hand: IHand, player: IPlayer) => void;
110
+ };
111
+ export type IEventCallback<T = {}> = (args: {
112
+ success: boolean;
113
+ } & T) => void;
114
+ export declare enum EServerEvent {
115
+ PONG = "PONG",
116
+ SET_SESSION = "SET_SESSION",
117
+ PREVIOUS_HAND = "PREVIOUS_HAND",
118
+ UPDATE_MATCH = "UPDATE_MATCH",
119
+ MATCH_DELETED = "MATCH_DELETED",
120
+ WAITING_PLAY = "WAITING_PLAY",
121
+ KICK_PLAYER = "PLAYER_KICKED",
122
+ UPDATE_ACTIVE_MATCHES = "UPDATE_ACTIVE_MATCHES",
123
+ PLAYER_USED_CARD = "PLAYER_USED_CARD",
124
+ PLAYER_SAID_COMMAND = "PLAYER_SAID_COMMAND",
125
+ WAITING_POSSIBLE_SAY = "WAITING_POSSIBLE_SAY",
126
+ UPDATE_CHAT = "UPDAET_CHAT"
127
+ }
128
+ export interface ServerToClientEvents {
129
+ [EServerEvent.PONG]: (serverTime: number, clientTime: number) => void;
130
+ [EServerEvent.PREVIOUS_HAND]: (value: IMatchPreviousHand, callback: () => void) => void;
131
+ [EServerEvent.UPDATE_CHAT]: (room: IPublicChatRoom, message?: IChatMessage) => void;
132
+ [EServerEvent.UPDATE_ACTIVE_MATCHES]: (activeMatches: IPublicMatchInfo[]) => void;
133
+ [EServerEvent.UPDATE_MATCH]: (match: IPublicMatch, callback?: () => void) => void;
134
+ [EServerEvent.PLAYER_USED_CARD]: (match: IPublicMatch, card: IPlayedCard) => void;
135
+ [EServerEvent.PLAYER_SAID_COMMAND]: (match: IPublicMatch, command: ISaidCommand) => void;
136
+ [EServerEvent.KICK_PLAYER]: (match: IPublicMatch, session: string, reason?: string) => void;
137
+ [EServerEvent.MATCH_DELETED]: (matchSessionId: string) => void;
138
+ [EServerEvent.SET_SESSION]: (userData: IUserData, serverVersion: string, activeMatches: Array<IPublicMatchInfo>) => void;
139
+ [EServerEvent.WAITING_POSSIBLE_SAY]: (match: IPublicMatch, callback: (data: IWaitingSayData) => void) => void;
140
+ [EServerEvent.WAITING_PLAY]: (match: IPublicMatch, callback: (data: IWaitingPlayData) => void) => void;
141
+ }
142
+ export declare enum EClientEvent {
143
+ LOGIN = "LOGIN",
144
+ LOGOUT = "LOGOUT",
145
+ LEAVE_MATCH = "LEAVE_MATCH",
146
+ CREATE_MATCH = "CREATE_MATCH",
147
+ SET_MATCH_OPTIONS = "SET_MATCH_OPTIONS",
148
+ LIST_MATCHES = "LIST_MATCHES",
149
+ JOIN_MATCH = "JOIN_MATCH",
150
+ START_MATCH = "START_MATCH",
151
+ SET_PLAYER_READY = "SET_PLAYER_READY",
152
+ FETCH_MATCH = "FETCH_MATCH",
153
+ CHAT = "CHAT",
154
+ PING = "PING",
155
+ SAY = "SAY"
156
+ }
157
+ export interface ClientToServerEvents {
158
+ [EClientEvent.LOGOUT]: (callback: IEventCallback<{}>) => void;
159
+ [EClientEvent.PING]: (clientTime: number) => void;
160
+ [EClientEvent.CHAT]: (matchId: string, msg: string, callback: () => void) => void;
161
+ [EClientEvent.LEAVE_MATCH]: (matchId: string, callback?: IEventCallback<{}>) => void;
162
+ [EClientEvent.CREATE_MATCH]: (callback: IEventCallback<{
163
+ match?: IPublicMatch;
164
+ activeMatches?: IPublicMatchInfo[];
165
+ }>) => void;
166
+ [EClientEvent.SET_MATCH_OPTIONS]: (identityJwt: string | null, matchSessionId: string, options: Partial<ILobbyOptions>, callback: IEventCallback<{
167
+ match?: IPublicMatch;
168
+ activeMatches?: IPublicMatchInfo[];
169
+ }>) => void;
170
+ [EClientEvent.SET_PLAYER_READY]: (matchSessionId: string, ready: boolean, callback: IEventCallback<{
171
+ match?: IPublicMatch;
172
+ }>) => void;
173
+ [EClientEvent.JOIN_MATCH]: (matchSessionId: string, teamIdx: 0 | 1 | undefined, callback: IEventCallback<{
174
+ match?: IPublicMatch;
175
+ activeMatches?: IPublicMatchInfo[];
176
+ }>) => void;
177
+ [EClientEvent.START_MATCH]: (identityJwt: string | null, matchId: string, callback: IEventCallback<{
178
+ matchSessionId?: string;
179
+ }>) => void;
180
+ [EClientEvent.FETCH_MATCH]: (matchId: string, callback: IEventCallback<{
181
+ match: IPublicMatch | null;
182
+ }>) => void;
183
+ [EClientEvent.LIST_MATCHES]: (filters: {
184
+ state?: Array<EMatchState>;
185
+ }, callback: IEventCallback<{
186
+ matches: Array<IPublicMatchInfo>;
187
+ }>) => void;
188
+ [EClientEvent.LOGIN]: (user: User, identityToken: string, callback: IEventCallback<{
189
+ activeMatches?: IPublicMatchInfo[];
190
+ }>) => void;
191
+ }
192
+ export type IWaitingPlayData = {
193
+ cardIdx: number;
194
+ card: ICard;
195
+ };
196
+ export type IWaitingPlayCallback = (data: IWaitingPlayData) => void | null;
197
+ export type IWaitingSayData = {
198
+ command: ECommand | number;
199
+ };
200
+ export type IWaitingSayCallback = (data: IWaitingSayData) => void | null;
201
+ export declare class TMap<K, V> extends Map<K, V> {
202
+ find(finder: (value: V) => boolean): V | void;
203
+ findAll(finder: (value: V) => boolean): V[];
204
+ getOrThrow(key?: K): NonNullable<V>;
205
+ }
206
+ export declare enum GAME_ERROR {
207
+ MATCH_ALREADY_STARTED = "MATCH_ALREADY_STARTED",
208
+ LOBBY_IS_FULL = "LOBBY_IS_FULL",
209
+ UNEXPECTED_TEAM_SIZE = "UNEXPECTED_TEAM_SIZE",
210
+ TEAM_NOT_READY = "TEAM_NOT_READY",
211
+ TEAM_IS_FULL = "TEAM_IS_FULL",
212
+ INVALID_ENVIDO_POINTS = "INVALID_ENVIDO_POINTS",
213
+ ENVIDO_NOT_ACCEPTED = "ENVIDO_NOT_ACCEPTED",
214
+ INVALID_COMAND = "INVALID_COMAND",
215
+ INSUFFICIENT_BALANCE = "INSUFFICIENT_BALANCE",
216
+ GAME_REQUIRES_ACCOUNT = "GAME_REQUIRES_ACCOUNT"
217
+ }
218
+ export interface EnvidoState {
219
+ accept: number;
220
+ decline: number;
221
+ teamIdx: 0 | 1 | null;
222
+ }
223
+ export type IEnvidoCalculatorResult = {
224
+ accept: number;
225
+ decline: number;
226
+ replace?: number;
227
+ next: Array<ECommand>;
228
+ };
229
+ export type IFaltaEnvidoCalculatorArgs = {
230
+ teams: [ITeam, ITeam];
231
+ options: ILobbyOptions;
232
+ };
233
+ export type IEnvidoCalculatorArgs = {
234
+ stake: number;
235
+ declineStake: number;
236
+ } & (IFaltaEnvidoCalculatorArgs | never);
237
+ export type IEnvidoCalculator = {
238
+ [key in EEnvidoCommand]: (args?: IEnvidoCalculatorArgs) => IEnvidoCalculatorResult;
239
+ };
240
+ export interface IDeck {
241
+ cards: Array<ICard>;
242
+ usedCards: Array<ICard>;
243
+ takeCard(): ICard;
244
+ takeThree(): [ICard, ICard, ICard];
245
+ shuffle(): IDeck;
246
+ }
247
+ export type ICard = keyof typeof CARDS;
248
+ export interface IPlayedCard {
249
+ key: string;
250
+ player: IPlayer | IPublicPlayer;
251
+ card: ICard;
252
+ }
253
+ export interface IHandPoints {
254
+ 0: number;
255
+ 1: number;
256
+ }
257
+ export type IPublicPlayer = Pick<IPlayer, "name" | "key" | "disabled" | "abandoned" | "ready" | "hand" | "usedHand" | "prevHand" | "teamIdx" | "isTurn" | "turnExpiresAt" | "turnExtensionExpiresAt" | "isEnvidoTurn" | "isOwner"> & ({
258
+ isMe?: true;
259
+ commands: IPlayer["commands"];
260
+ hasFlor: IPlayer["hasFlor"];
261
+ envido: IPlayer["envido"];
262
+ payRequestId?: IPlayer["payRequestId"];
263
+ } | {
264
+ isMe?: false;
265
+ commands?: undefined;
266
+ hasFlor?: undefined;
267
+ envido?: undefined;
268
+ payRequestId?: undefined;
269
+ });
270
+ export type IPublicTeam = Pick<ITeam, "points" | "id" | "name"> & {
271
+ players: Array<IPublicPlayer>;
272
+ };
273
+ export interface IPlayer {
274
+ idx: number;
275
+ teamIdx: number;
276
+ accountId: number | undefined;
277
+ matchPlayerId: number | undefined;
278
+ name: string;
279
+ key: string;
280
+ session: string;
281
+ payRequestId?: number;
282
+ hand: Array<ICard>;
283
+ usedHand: Array<ICard>;
284
+ prevHand: Array<ICard>;
285
+ envido: Array<number>;
286
+ _commands: Set<ECommand>;
287
+ get commands(): Array<ECommand>;
288
+ isTurn: boolean;
289
+ turnExpiresAt: number | null;
290
+ turnExtensionExpiresAt: number | null;
291
+ hasFlor: boolean;
292
+ isEnvidoTurn: boolean;
293
+ isOwner: boolean;
294
+ disabled: boolean;
295
+ abandoned: boolean;
296
+ ready: boolean;
297
+ resetCommands(): void;
298
+ calculateEnvido(): Array<number>;
299
+ setIdx(idx: number): void;
300
+ setPayRequest(id?: number): void;
301
+ setMatchPlayerId(id?: number): void;
302
+ setTurn(turn: boolean): void;
303
+ setTurnExpiration(...args: [number, number | null] | [null, null]): void;
304
+ setEnvidoTurn(turn: boolean): void;
305
+ getPublicPlayer(session?: string): IPublicPlayer;
306
+ setSession(session: string): void;
307
+ setIsOwner(isOwner: boolean): void;
308
+ enable(): void;
309
+ disable(): void;
310
+ abandon(): void;
311
+ setReady(ready: boolean): void;
312
+ setHand(hand: Array<ICard>): Array<ICard>;
313
+ useCard(idx: number, card: ICard): ICard | null;
314
+ }
315
+ export interface ITeam {
316
+ _players: Map<string, IPlayer>;
317
+ id: 0 | 1;
318
+ name: string;
319
+ players: Array<IPlayer>;
320
+ points: ITeamPoints;
321
+ pointsToWin(matchPoint: number): number;
322
+ getPublicTeam(playerSession?: string): IPublicTeam;
323
+ isTeamDisabled(): boolean;
324
+ disable(player: IPlayer): boolean;
325
+ enable(player?: IPlayer): boolean;
326
+ addPoints(matchPoint: number, points: number, simulate?: boolean): ITeamPoints;
327
+ }
328
+ export interface ITeamPoints {
329
+ buenas: number;
330
+ malas: number;
331
+ winner: boolean;
332
+ }
333
+ export type IPublicUser = Pick<User, "id" | "email" | "name" | "role">;
package/dist/types.js ADDED
@@ -0,0 +1,113 @@
1
+ import { EMatchState } from "@prisma/client";
2
+ export { CARDS, CARDS_HUMAN_READABLE, BURNT_CARD } from "./lib/constants";
3
+ export { EMatchState };
4
+ export var EChatSystem;
5
+ (function (EChatSystem) {
6
+ EChatSystem[EChatSystem["TEAM_0"] = 0] = "TEAM_0";
7
+ EChatSystem[EChatSystem["TEAM_1"] = 1] = "TEAM_1";
8
+ EChatSystem["SYSTEM"] = "SYSTEM";
9
+ })(EChatSystem || (EChatSystem = {}));
10
+ export var ESayCommand;
11
+ (function (ESayCommand) {
12
+ ESayCommand["MAZO"] = "MAZO";
13
+ })(ESayCommand || (ESayCommand = {}));
14
+ export var EFlorCommand;
15
+ (function (EFlorCommand) {
16
+ EFlorCommand["FLOR"] = "FLOR";
17
+ EFlorCommand["CONTRAFLOR"] = "CONTRAFLOR";
18
+ })(EFlorCommand || (EFlorCommand = {}));
19
+ export var ETrucoCommand;
20
+ (function (ETrucoCommand) {
21
+ ETrucoCommand["TRUCO"] = "TRUCO";
22
+ ETrucoCommand["RE_TRUCO"] = "RE_TRUCO";
23
+ ETrucoCommand["VALE_CUATRO"] = "VALE_CUATRO";
24
+ })(ETrucoCommand || (ETrucoCommand = {}));
25
+ export var EAnswerCommand;
26
+ (function (EAnswerCommand) {
27
+ EAnswerCommand["QUIERO"] = "QUIERO";
28
+ EAnswerCommand["NO_QUIERO"] = "NO_QUIERO";
29
+ })(EAnswerCommand || (EAnswerCommand = {}));
30
+ export var EEnvidoAnswerCommand;
31
+ (function (EEnvidoAnswerCommand) {
32
+ EEnvidoAnswerCommand["SON_BUENAS"] = "SON_BUENAS";
33
+ })(EEnvidoAnswerCommand || (EEnvidoAnswerCommand = {}));
34
+ export var EEnvidoCommand;
35
+ (function (EEnvidoCommand) {
36
+ EEnvidoCommand["ENVIDO"] = "ENVIDO";
37
+ EEnvidoCommand["REAL_ENVIDO"] = "REAL_ENVIDO";
38
+ EEnvidoCommand["FALTA_ENVIDO"] = "FALTA_ENVIDO";
39
+ })(EEnvidoCommand || (EEnvidoCommand = {}));
40
+ export var EHandState;
41
+ (function (EHandState) {
42
+ EHandState["WAITING_PLAY"] = "WAITING_PLAY";
43
+ EHandState["WAITING_FOR_TRUCO_ANSWER"] = "WAITING_FOR_TRUCO_ANSWER";
44
+ EHandState["WAITING_ENVIDO_ANSWER"] = "WAITING_ENVIDO_ANSWER";
45
+ EHandState["WAITING_ENVIDO_POINTS_ANSWER"] = "WAITING_ENVIDO_POINTS_ANSWER";
46
+ EHandState["FINISHED"] = "FINISHED";
47
+ })(EHandState || (EHandState = {}));
48
+ export var EServerEvent;
49
+ (function (EServerEvent) {
50
+ EServerEvent["PONG"] = "PONG";
51
+ EServerEvent["SET_SESSION"] = "SET_SESSION";
52
+ EServerEvent["PREVIOUS_HAND"] = "PREVIOUS_HAND";
53
+ EServerEvent["UPDATE_MATCH"] = "UPDATE_MATCH";
54
+ EServerEvent["MATCH_DELETED"] = "MATCH_DELETED";
55
+ EServerEvent["WAITING_PLAY"] = "WAITING_PLAY";
56
+ EServerEvent["KICK_PLAYER"] = "PLAYER_KICKED";
57
+ EServerEvent["UPDATE_ACTIVE_MATCHES"] = "UPDATE_ACTIVE_MATCHES";
58
+ EServerEvent["PLAYER_USED_CARD"] = "PLAYER_USED_CARD";
59
+ EServerEvent["PLAYER_SAID_COMMAND"] = "PLAYER_SAID_COMMAND";
60
+ EServerEvent["WAITING_POSSIBLE_SAY"] = "WAITING_POSSIBLE_SAY";
61
+ EServerEvent["UPDATE_CHAT"] = "UPDAET_CHAT";
62
+ })(EServerEvent || (EServerEvent = {}));
63
+ export var EClientEvent;
64
+ (function (EClientEvent) {
65
+ EClientEvent["LOGIN"] = "LOGIN";
66
+ EClientEvent["LOGOUT"] = "LOGOUT";
67
+ EClientEvent["LEAVE_MATCH"] = "LEAVE_MATCH";
68
+ EClientEvent["CREATE_MATCH"] = "CREATE_MATCH";
69
+ EClientEvent["SET_MATCH_OPTIONS"] = "SET_MATCH_OPTIONS";
70
+ EClientEvent["LIST_MATCHES"] = "LIST_MATCHES";
71
+ EClientEvent["JOIN_MATCH"] = "JOIN_MATCH";
72
+ EClientEvent["START_MATCH"] = "START_MATCH";
73
+ EClientEvent["SET_PLAYER_READY"] = "SET_PLAYER_READY";
74
+ EClientEvent["FETCH_MATCH"] = "FETCH_MATCH";
75
+ EClientEvent["CHAT"] = "CHAT";
76
+ EClientEvent["PING"] = "PING";
77
+ EClientEvent["SAY"] = "SAY";
78
+ })(EClientEvent || (EClientEvent = {}));
79
+ export class TMap extends Map {
80
+ find(finder) {
81
+ let result = undefined;
82
+ for (let value of this.values()) {
83
+ const find = finder(value);
84
+ if (!result && find) {
85
+ result = value;
86
+ }
87
+ }
88
+ return result;
89
+ }
90
+ findAll(finder) {
91
+ return Array.from(this.values()).filter(finder);
92
+ }
93
+ getOrThrow(key) {
94
+ const result = key && this.get(key);
95
+ if (!result) {
96
+ throw new Error(`getOrThrow(${key}) not found`);
97
+ }
98
+ return result;
99
+ }
100
+ }
101
+ export var GAME_ERROR;
102
+ (function (GAME_ERROR) {
103
+ GAME_ERROR["MATCH_ALREADY_STARTED"] = "MATCH_ALREADY_STARTED";
104
+ GAME_ERROR["LOBBY_IS_FULL"] = "LOBBY_IS_FULL";
105
+ GAME_ERROR["UNEXPECTED_TEAM_SIZE"] = "UNEXPECTED_TEAM_SIZE";
106
+ GAME_ERROR["TEAM_NOT_READY"] = "TEAM_NOT_READY";
107
+ GAME_ERROR["TEAM_IS_FULL"] = "TEAM_IS_FULL";
108
+ GAME_ERROR["INVALID_ENVIDO_POINTS"] = "INVALID_ENVIDO_POINTS";
109
+ GAME_ERROR["ENVIDO_NOT_ACCEPTED"] = "ENVIDO_NOT_ACCEPTED";
110
+ GAME_ERROR["INVALID_COMAND"] = "INVALID_COMAND";
111
+ GAME_ERROR["INSUFFICIENT_BALANCE"] = "INSUFFICIENT_BALANCE";
112
+ GAME_ERROR["GAME_REQUIRES_ACCOUNT"] = "GAME_REQUIRES_ACCOUNT";
113
+ })(GAME_ERROR || (GAME_ERROR = {}));