PokerUnicorn
Loading...
Searching...
No Matches
lobby.h
Go to the documentation of this file.
1/*
2 * PokerUnicorn Server
3 * This project uses test network, NO real coin or NO real money involved.
4 * Copyright (C) 2023, Oğuzhan Eroğlu <meowingcate@gmail.com> (https://meowingcat.io)
5 * Licensed under GPLv3 License
6 * See LICENSE for more info
7 */
8
9#pragma once
10
15
21
22#include <stdint.h>
23#include <stdbool.h>
24#include <pthread.h>
25
26#include <libpq-fe.h>
27
28#include "ref.h"
29#include "sugar.h"
30#include "table.h"
31#include "account.h"
32#include "poker.h"
33#include "server.h"
34#include "eventloop.h"
35#include "trie.h"
36#include "auth.h"
37#include "../include/mime.h"
38
46#define PKRSRV_LOBBY_DISCONNECTION_TOLERANCE 20000
47
48typedef struct pkrsrv_lobby pkrsrv_lobby_t;
49typedef struct pkrsrv_lobby_sessions pkrsrv_lobby_sessions_t;
50typedef struct pkrsrv_lobby_session pkrsrv_lobby_session_t;
51typedef struct pkrsrv_lobby_session_clients pkrsrv_lobby_session_clients_t;
52typedef struct pkrsrv_lobby_session_client pkrsrv_lobby_session_client_t;
53typedef struct pkrsrv_lobby_client pkrsrv_lobby_client_t;
54typedef struct pkrsrv_lobby_client_sessions pkrsrv_lobby_client_sessions_t;
55typedef struct pkrsrv_lobby_client_session pkrsrv_lobby_client_session_t;
56
63 pkrsrv_server_t* server;
64 pthread_mutex_t mutex;
66 pkrsrv_lobby_sessions_t* sessions;
67 pkrsrv_eventloop_t* eventloop;
68 pkrsrv_trie__ascii_t* authorized_clients;
69};
70
76 LISTIFY(pkrsrv_lobby_session_t*);
77};
78
83pkrsrv_lobby_sessions_t* pkrsrv_lobby_sessions_new();
88void pkrsrv_lobby_sessions_free(pkrsrv_lobby_sessions_t* sessions);
89
96 ITEMIFY(pkrsrv_lobby_session_t*);
97 PGconn* pg_conn;
98 pkrsrv_lobby_t* lobby;
101 pkrsrv_poker_t* poker;
102 pthread_mutex_t mutex;
104 pkrsrv_eventloop_task_t* proceed_task;
105 pkrsrv_eventloop_task_t* poker_start_task;
106 pkrsrv_eventloop_task_t* poker_restart_task;
107 pkrsrv_lobby_session_clients_t* clients;
109};
110
115 LISTIFY(pkrsrv_lobby_session_client_t*);
116};
117
123 ITEMIFY(pkrsrv_lobby_session_client_t*);
124 pkrsrv_lobby_client_t* client;
127};
128
134 ITEMIFY(pkrsrv_lobby_client_session_t*);
135 pkrsrv_lobby_session_t* session;
138};
139
144 LISTIFY(pkrsrv_lobby_client_session_t*);
146};
147
148pkrsrv_lobby_client_sessions_t *pkrsrv_lobby_client_sessions_new();
149void pkrsrv_lobby_client_sessions_free(pkrsrv_lobby_client_sessions_t *sessions);
150
157 pkrsrv_lobby_t* lobby;
158 pkrsrv_server_client_t* client;
159 pkrsrv_lobby_client_sessions_t* sessions;
160 pkrsrv_account_t* account;
161 pkrsrv_auth_session_t* auth_session;
166 pkrsrv_eventloop_task_t* tolerated_disconnected_task;
167};
168
173 pkrsrv_account_t* account;
174 pkrsrv_lobby_client_t* lobby_client;
175};
176typedef struct on_account_updated_params on_account_updated_params_t;
180void on_account_updated__async(pkrsrv_eventloop_task_t* task);
181
191typedef struct pkrsrv_lobby_new_params pkrsrv_lobby_new_params_t;
195pkrsrv_lobby_t* pkrsrv_lobby_new(pkrsrv_lobby_new_params_t params);
199void pkrsrv_lobby_free(pkrsrv_lobby_t* lobby);
203void pkrsrv_lobby_run(pkrsrv_lobby_t* lobby);
204
208pkrsrv_lobby_client_t* pkrsrv_lobby_client_new(pkrsrv_lobby_t* lobby, pkrsrv_server_client_t* client);
212void pkrsrv_lobby_client_set_account(pkrsrv_lobby_client_t* lobby_client, pkrsrv_account_t* account);
216void pkrsrv_lobby_client_free(pkrsrv_lobby_client_t* lobby_client);
217
223 pkrsrv_auth_session_t* auth_session;
224 pkrsrv_lobby_t* lobby;
226};
227typedef struct pkrsrv_lobby_session_new_params pkrsrv_lobby_session_new_params_t;
232pkrsrv_lobby_session_t* pkrsrv_lobby_session_new(pkrsrv_lobby_session_new_params_t params);
237void pkrsrv_lobby_session_free(pkrsrv_lobby_session_t* session);
238
243void pkrsrv_lobby_sessions_add(pkrsrv_lobby_sessions_t* sessions, pkrsrv_lobby_session_t* session);
248void pkrsrv_lobby_sessions_remove(pkrsrv_lobby_sessions_t* sessions, pkrsrv_lobby_session_t* session);
249
254void pkrsrv_lobby_session_start(pkrsrv_lobby_session_t* session);
259void pkrsrv_lobby_session_stop(pkrsrv_lobby_session_t* session);
264void pkrsrv_lobby_session_free(pkrsrv_lobby_session_t* p_session);
269pkrsrv_lobby_session_t* pkrsrv_lobby_session_getby_id(pkrsrv_lobby_t* lobby, uint64_t id);
274pkrsrv_lobby_session_t* pkrsrv_lobby_session_getby_table_id(pkrsrv_lobby_t* lobby, uint64_t id);
275
281 pkrsrv_lobby_session_t* session;
282};
283typedef struct pkrsrv_lobby_session_proceed__async_params pkrsrv_lobby_session_proceed__async_params_t;
288void pkrsrv_lobby_session_proceed__async(pkrsrv_eventloop_task_t* task);
289
295 pkrsrv_lobby_session_t* session;
296};
297typedef struct pkrsrv_lobby_session_poker_start__async_params pkrsrv_lobby_session_poker_start__async_params_t;
302void pkrsrv_lobby_session_poker_start__async(pkrsrv_eventloop_task_t* task);
303
309 pkrsrv_lobby_session_t* session;
310};
311typedef struct pkrsrv_lobby_session_poker_restart__async_params pkrsrv_lobby_session_poker_restart__async_params_t;
316void pkrsrv_lobby_session_poker_restart__async(pkrsrv_eventloop_task_t* task);
317
322pkrsrv_lobby_session_client_t* pkrsrv_lobby_session_client_new(pkrsrv_lobby_client_t* lobby_client);
327void pkrsrv_lobby_session_client_free(pkrsrv_lobby_session_client_t* session_client);
332void pkrsrv_lobby_session_clients_add(pkrsrv_lobby_session_clients_t* session_clients, pkrsrv_lobby_session_client_t* session_client);
337void pkrsrv_lobby_session_clients_remove(pkrsrv_lobby_session_clients_t* session_clients, pkrsrv_lobby_session_client_t* session_client);
338
343pkrsrv_lobby_client_session_t* pkrsrv_lobby_client_session_new(pkrsrv_lobby_session_t* session);
348void pkrsrv_lobby_client_session_free(pkrsrv_lobby_client_session_t* joined_session);
353void pkrsrv_lobby_client_sessions_add(pkrsrv_lobby_client_sessions_t* client_sessions, pkrsrv_lobby_client_session_t* client_session);
358void pkrsrv_lobby_client_sessions_remove(pkrsrv_lobby_client_sessions_t* client_sessions, pkrsrv_lobby_client_session_t* client_session);
359
364bool pkrsrv_lobby_client_enter_session(pkrsrv_lobby_client_t* client, pkrsrv_lobby_session_t* session);
369bool pkrsrv_lobby_client_leave_session(pkrsrv_lobby_client_t* client, pkrsrv_lobby_client_session_t* client_session);
378bool pkrsrv_lobby_client_join_session(pkrsrv_lobby_client_t* client, pkrsrv_lobby_session_t* session, uint64_t enterance_amount, int position);
384bool pkrsrv_lobby_client_unjoin_session(pkrsrv_lobby_client_t* client, pkrsrv_lobby_session_t* session);
385
390pkrsrv_lobby_client_session_t* pkrsrv_lobby_client_get_session_by_id(pkrsrv_lobby_client_t* client, uint64_t id);
395pkrsrv_lobby_client_session_t* pkrsrv_lobby_client_session_getby_table_id(pkrsrv_lobby_client_t* client, uint64_t id);
403pkrsrv_lobby_session_client_t* pkrsrv_lobby_session_client_getby_socket(pkrsrv_lobby_session_t* session, int socket);
411pkrsrv_lobby_session_client_t* pkrsrv_lobby_session_client_getby_account_id(pkrsrv_lobby_session_t* session, uint64_t account_id);
419pkrsrv_lobby_client_session_t* pkrsrv_lobby_client_session_getby_session_id(pkrsrv_lobby_client_t* lobby_client, uint64_t session_id);
420
421static void on_client_connected(pkrsrv_eventloop_task_t* task);
422static void on_client_disconnected(pkrsrv_eventloop_task_t* task);
423static void on_client_disconnected__tolerated(pkrsrv_eventloop_task_t* task);
424static void on_client_meowed(pkrsrv_eventloop_task_t* task);
425static void on_client_login(pkrsrv_eventloop_task_t* task);
426static void on_client_signup(pkrsrv_eventloop_task_t* task);
427static void on_client_auth_session(pkrsrv_eventloop_task_t* task);
428static void on_client_get_account(pkrsrv_eventloop_task_t* task);
429static void on_client_enter(pkrsrv_eventloop_task_t* task);
430static void on_client_leave(pkrsrv_eventloop_task_t* task);
431static void on_client_join(pkrsrv_eventloop_task_t* task);
432static void on_client_unjoin(pkrsrv_eventloop_task_t* task);
433static void on_client_action(pkrsrv_eventloop_task_t* task);
434static void on_client_get_tables(pkrsrv_eventloop_task_t* task);
435static void on_client_get_sessions(pkrsrv_eventloop_task_t* task);
436static void on_client_update_account(pkrsrv_eventloop_task_t* task);
437static void on_client_json(pkrsrv_eventloop_task_t* task);
438
439static void on_poker_action(pkrsrv_eventloop_task_t* task);
440
446bool reorder_updated_session(pkrsrv_lobby_session_t* updated, int old_length);
447
451void pkrsrv_lobby_broadcast_sessions(pkrsrv_lobby_t* lobby);
452
pkrsrv_lobby_session_t * session
Definition lobby.h:295
pkrsrv_account_t * account
Definition lobby.h:160
pkrsrv_lobby_client_sessions_t * sessions
Definition lobby.h:159
pkrsrv_lobby_session_clients_t * clients
Definition lobby.h:107
int process_latency
Definition lobby.h:100
PGconn * pg_conn
Definition lobby.h:97
pkrsrv_lobby_client_t * lobby_client
Definition lobby.h:174
pkrsrv_uniqid_uuid_t id
Definition lobby.h:99
int port
Definition lobby.h:186
pthread_mutex_t mutex
Definition lobby.h:64
pkrsrv_account_t * account
Definition lobby.h:173
int max_clients
Definition lobby.h:189
pkrsrv_lobby_t * lobby
Definition lobby.h:224
pkrsrv_lobby_sessions_t * sessions
Definition lobby.h:66
pkrsrv_lobby_session_t * session
Definition lobby.h:281
bool is_tolerant_disconnected
Definition lobby.h:162
int joined_clients_count
Definition lobby.h:108
pkrsrv_lobby_session_t * session
Definition lobby.h:135
pkrsrv_lobby_t * lobby
Definition lobby.h:98
pkrsrv_server_t * server
Definition lobby.h:63
bool is_joined
Definition lobby.h:136
pkrsrv_poker_t * poker
Definition lobby.h:101
pkrsrv_trie__ascii_t * authorized_clients
Definition lobby.h:68
pkrsrv_lobby_t * lobby
Definition lobby.h:157
bool is_revived
Definition lobby.h:165
pkrsrv_lobby_client_t * client
Definition lobby.h:124
pkrsrv_eventloop_task_t * proceed_task
Definition lobby.h:104
bool is_connected
Definition lobby.h:164
pkrsrv_eventloop_t * eventloop
Definition lobby.h:67
bool is_running
Definition lobby.h:103
pkrsrv_eventloop_task_t * tolerated_disconnected_task
Definition lobby.h:166
int process_latency
Definition lobby.h:188
pkrsrv_auth_session_t * auth_session
Definition lobby.h:161
pkrsrv_eventloop_task_t * poker_start_task
Definition lobby.h:105
char * bind_address
Definition lobby.h:187
int process_latency
Definition lobby.h:65
pkrsrv_lobby_session_t * session
Definition lobby.h:309
pthread_mutex_t mutex
Definition lobby.h:102
pkrsrv_eventloop_task_t * poker_restart_task
Definition lobby.h:106
bool is_joined
Definition lobby.h:125
pkrsrv_table_t * table
Definition lobby.h:225
pkrsrv_server_client_t * client
Definition lobby.h:158
pkrsrv_auth_session_t * auth_session
Definition lobby.h:223
bool is_disconnected
Definition lobby.h:163
void pkrsrv_lobby_session_proceed__async(pkrsrv_eventloop_task_t *task)
Proceeds the session's game one step to future.
void pkrsrv_lobby_sessions_free(pkrsrv_lobby_sessions_t *sessions)
Frees the lobby sessions list (stops & releases all sessions)
void pkrsrv_lobby_broadcast_sessions(pkrsrv_lobby_t *lobby)
Broadcasts the sessions of the lobby to all clients.
void pkrsrv_lobby_session_start(pkrsrv_lobby_session_t *session)
Starts the session.
void pkrsrv_lobby_client_set_account(pkrsrv_lobby_client_t *lobby_client, pkrsrv_account_t *account)
Sets the account of a lobby client.
void pkrsrv_lobby_free(pkrsrv_lobby_t *lobby)
Frees a lobby object.
void on_account_updated__async(pkrsrv_eventloop_task_t *task)
Used for pkrsrv_account_t::on_updated
void pkrsrv_lobby_run(pkrsrv_lobby_t *lobby)
Runs the lobby.
bool pkrsrv_lobby_client_join_session(pkrsrv_lobby_client_t *client, pkrsrv_lobby_session_t *session, uint64_t enterance_amount, int position)
Makes a lobby join a session.
void pkrsrv_lobby_client_sessions_remove(pkrsrv_lobby_client_sessions_t *client_sessions, pkrsrv_lobby_client_session_t *client_session)
Removes a lobby client session from the lobby client.
pkrsrv_lobby_client_t * pkrsrv_lobby_client_new(pkrsrv_lobby_t *lobby, pkrsrv_server_client_t *client)
Creates a new lobby client object.
pkrsrv_lobby_session_client_t * pkrsrv_lobby_session_client_getby_account_id(pkrsrv_lobby_session_t *session, uint64_t account_id)
Gives the client of a session by its account ID.
void pkrsrv_lobby_sessions_remove(pkrsrv_lobby_sessions_t *sessions, pkrsrv_lobby_session_t *session)
Removes a session from the lobby.
void pkrsrv_lobby_session_free(pkrsrv_lobby_session_t *session)
Frees a session object.
void pkrsrv_lobby_session_client_free(pkrsrv_lobby_session_client_t *session_client)
Frees a session client object.
void pkrsrv_lobby_session_poker_restart__async(pkrsrv_eventloop_task_t *task)
Restarts the poker game of the session.
void pkrsrv_lobby_session_poker_start__async(pkrsrv_eventloop_task_t *task)
Starts the poker game of the session.
pkrsrv_lobby_sessions_t * pkrsrv_lobby_sessions_new()
Creates a new lobby sessions list.
pkrsrv_lobby_client_sessions_t * pkrsrv_lobby_client_sessions_new()
bool pkrsrv_lobby_client_enter_session(pkrsrv_lobby_client_t *client, pkrsrv_lobby_session_t *session)
Makes a lobby enter a session.
void pkrsrv_lobby_client_free(pkrsrv_lobby_client_t *lobby_client)
Frees a lobby client object.
bool pkrsrv_lobby_client_leave_session(pkrsrv_lobby_client_t *client, pkrsrv_lobby_client_session_t *client_session)
Makes a lobby leave a session.
pkrsrv_lobby_session_client_t * pkrsrv_lobby_session_client_getby_socket(pkrsrv_lobby_session_t *session, int socket)
Gives the client of a session by its socket.
pkrsrv_lobby_session_t * pkrsrv_lobby_session_new(pkrsrv_lobby_session_new_params_t params)
Creates a new session object.
bool reorder_updated_session(pkrsrv_lobby_session_t *updated, int old_length)
Efficient session reorderer  
bool pkrsrv_lobby_client_unjoin_session(pkrsrv_lobby_client_t *client, pkrsrv_lobby_session_t *session)
Makes a lobby unjoin a session.
pkrsrv_lobby_client_session_t * pkrsrv_lobby_client_session_getby_table_id(pkrsrv_lobby_client_t *client, uint64_t id)
Gİies the session of a lobby client by its table ID.
void pkrsrv_lobby_client_sessions_free(pkrsrv_lobby_client_sessions_t *sessions)
pkrsrv_lobby_client_session_t * pkrsrv_lobby_client_session_getby_session_id(pkrsrv_lobby_client_t *lobby_client, uint64_t session_id)
Gives the client of a session by its account.
pkrsrv_lobby_client_session_t * pkrsrv_lobby_client_get_session_by_id(pkrsrv_lobby_client_t *client, uint64_t id)
Gives the session of a lobby client by its ID.
void pkrsrv_lobby_client_session_free(pkrsrv_lobby_client_session_t *joined_session)
Frees a lobby client session object.
pkrsrv_lobby_t * pkrsrv_lobby_new(pkrsrv_lobby_new_params_t params)
Creates a new lobby object.
void pkrsrv_lobby_session_clients_add(pkrsrv_lobby_session_clients_t *session_clients, pkrsrv_lobby_session_client_t *session_client)
Adds a session client to the session.
void pkrsrv_lobby_sessions_add(pkrsrv_lobby_sessions_t *sessions, pkrsrv_lobby_session_t *session)
Adds a session to the lobby.
pkrsrv_lobby_session_t * pkrsrv_lobby_session_getby_table_id(pkrsrv_lobby_t *lobby, uint64_t id)
Gives the session by its table ID.
pkrsrv_lobby_session_client_t * pkrsrv_lobby_session_client_new(pkrsrv_lobby_client_t *lobby_client)
Creates a new session client object.
void pkrsrv_lobby_session_clients_remove(pkrsrv_lobby_session_clients_t *session_clients, pkrsrv_lobby_session_client_t *session_client)
Removes a session client from the session.
pkrsrv_lobby_session_t * pkrsrv_lobby_session_getby_id(pkrsrv_lobby_t *lobby, uint64_t id)
Gives the session by its ID.
void pkrsrv_lobby_session_stop(pkrsrv_lobby_session_t *session)
Stops the session.
void pkrsrv_lobby_client_sessions_add(pkrsrv_lobby_client_sessions_t *client_sessions, pkrsrv_lobby_client_session_t *client_session)
Adds a lobby client session to the lobby client.
pkrsrv_lobby_client_session_t * pkrsrv_lobby_client_session_new(pkrsrv_lobby_session_t *session)
Creates a new lobby client session object.
Parameters of on_account_updated__async
Definition lobby.h:172
Lobby object.
Definition lobby.h:61
Lobby client object.
Definition lobby.h:155
Lobby client session object.
Definition lobby.h:133
Lobby client sessions list structure.
Definition lobby.h:143
Parameters of pkrsrv_lobby_new
Definition lobby.h:185
Session object.
Definition lobby.h:94
Session client object.
Definition lobby.h:122
Session clients list structure.
Definition lobby.h:114
Parameters of pkrsrv_lobby_session_new
Definition lobby.h:222
Parameters of pkrsrv_lobby_session_poker_restart__async
Definition lobby.h:308
Parameters of pkrsrv_lobby_session_poker_start__async
Definition lobby.h:294
Parameters of pkrsrv_lobby_session_proceed__async
Definition lobby.h:280
Lobby sessions list structure.
Definition lobby.h:74
#define PKRSRV_REF_COUNTEDIFY()
Makes a structure reference-counted.
Definition ref.h:70
#define LISTIFY(type)
Definition sugar.h:38
#define ITEMIFY(type)
Definition sugar.h:44
Definition table.h:35
Definition uniqid.h:24