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
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 "../include/mime.h"
36
37typedef struct pkrsrv_lobby pkrsrv_lobby_t;
38typedef struct pkrsrv_lobby_sessions pkrsrv_lobby_sessions_t;
39typedef struct pkrsrv_lobby_session pkrsrv_lobby_session_t;
40typedef struct pkrsrv_lobby_session_clients pkrsrv_lobby_session_clients_t;
41typedef struct pkrsrv_lobby_session_client pkrsrv_lobby_session_client_t;
42typedef struct pkrsrv_lobby_client pkrsrv_lobby_client_t;
43typedef struct pkrsrv_lobby_client_sessions pkrsrv_lobby_client_sessions_t;
44typedef struct pkrsrv_lobby_client_session pkrsrv_lobby_client_session_t;
45
52 pkrsrv_server_t* server;
53 pthread_mutex_t mutex;
55 pkrsrv_lobby_sessions_t* sessions;
56 pkrsrv_eventloop_t* eventloop;
57};
58
64 LISTIFY(pkrsrv_lobby_session_t*);
65};
66
73 ITEMIFY(pkrsrv_lobby_session_t*);
74 PGconn* pg_conn;
75 pkrsrv_lobby_t* lobby;
78 pkrsrv_poker_t* poker;
79 pthread_mutex_t mutex;
81 pkrsrv_eventloop_task_t* proceed_task;
82 pkrsrv_eventloop_task_t* poker_start_task;
83 pkrsrv_eventloop_task_t* poker_restart_task;
84 pkrsrv_lobby_session_clients_t* clients;
86};
87
92 LISTIFY(pkrsrv_lobby_session_client_t*);
93};
94
100 ITEMIFY(pkrsrv_lobby_session_client_t*);
101 pkrsrv_lobby_client_t* client;
104};
105
111 ITEMIFY(pkrsrv_lobby_client_session_t*);
112 pkrsrv_lobby_session_t* session;
115};
116
121 LISTIFY(pkrsrv_lobby_client_session_t*);
122};
123
130 pkrsrv_lobby_t* lobby;
131 pkrsrv_server_client_t* client;
132 pkrsrv_lobby_client_sessions_t* sessions;
133 pkrsrv_account_t* account;
134};
135
140 pkrsrv_account_t* account;
141 pkrsrv_lobby_client_t* lobby_client;
142};
143typedef struct on_account_updated_params on_account_updated_params_t;
147void on_account_updated__async(pkrsrv_eventloop_task_t* task);
148
158typedef struct pkrsrv_lobby_new_params pkrsrv_lobby_new_params_t;
162pkrsrv_lobby_t* pkrsrv_lobby_new(pkrsrv_lobby_new_params_t params);
166void pkrsrv_lobby_free(pkrsrv_lobby_t* lobby);
170void pkrsrv_lobby_run(pkrsrv_lobby_t* lobby);
171
175pkrsrv_lobby_client_t* pkrsrv_lobby_client_new(pkrsrv_lobby_t* lobby, pkrsrv_server_client_t* client);
179void pkrsrv_lobby_client_set_account(pkrsrv_lobby_client_t* lobby_client, pkrsrv_account_t* account);
183void pkrsrv_lobby_client_free(pkrsrv_lobby_client_t* lobby_client);
184
193typedef struct pkrsrv_lobby_session_new_params pkrsrv_lobby_session_new_params_t;
198pkrsrv_lobby_session_t* pkrsrv_lobby_session_new(pkrsrv_lobby_session_new_params_t params);
203void pkrsrv_lobby_session_free(pkrsrv_lobby_session_t* session);
204
209void pkrsrv_lobby_sessions_add(pkrsrv_lobby_sessions_t* sessions, pkrsrv_lobby_session_t* session);
214void pkrsrv_lobby_sessions_remove(pkrsrv_lobby_sessions_t* sessions, pkrsrv_lobby_session_t* session);
215
220void pkrsrv_lobby_session_start(pkrsrv_lobby_session_t* session);
225void pkrsrv_lobby_session_stop(pkrsrv_lobby_session_t* session);
230void pkrsrv_lobby_session_free(pkrsrv_lobby_session_t* p_session);
235pkrsrv_lobby_session_t* pkrsrv_lobby_session_getby_id(pkrsrv_lobby_t* lobby, uint64_t id);
240pkrsrv_lobby_session_t* pkrsrv_lobby_session_getby_table_id(pkrsrv_lobby_t* lobby, uint64_t id);
241
247 pkrsrv_lobby_session_t* session;
248};
249typedef struct pkrsrv_lobby_session_proceed__async_params pkrsrv_lobby_session_proceed__async_params_t;
254void pkrsrv_lobby_session_proceed__async(pkrsrv_eventloop_task_t* task);
255
261 pkrsrv_lobby_session_t* session;
262};
263typedef struct pkrsrv_lobby_session_poker_start__async_params pkrsrv_lobby_session_poker_start__async_params_t;
268void pkrsrv_lobby_session_poker_start__async(pkrsrv_eventloop_task_t* task);
269
275 pkrsrv_lobby_session_t* session;
276};
277typedef struct pkrsrv_lobby_session_poker_restart__async_params pkrsrv_lobby_session_poker_restart__async_params_t;
282void pkrsrv_lobby_session_poker_restart__async(pkrsrv_eventloop_task_t* task);
283
288pkrsrv_lobby_session_client_t* pkrsrv_lobby_session_client_new(pkrsrv_lobby_client_t* lobby_client);
293void pkrsrv_lobby_session_client_free(pkrsrv_lobby_session_client_t* session_client);
298void pkrsrv_lobby_session_clients_add(pkrsrv_lobby_session_clients_t* session_clients, pkrsrv_lobby_session_client_t* session_client);
303void pkrsrv_lobby_session_clients_remove(pkrsrv_lobby_session_clients_t* session_clients, pkrsrv_lobby_session_client_t* session_client);
304
309pkrsrv_lobby_client_session_t* pkrsrv_lobby_client_session_new(pkrsrv_lobby_session_t* session);
314void pkrsrv_lobby_client_session_free(pkrsrv_lobby_client_session_t* joined_session);
319void pkrsrv_lobby_client_sessions_add(pkrsrv_lobby_client_sessions_t* client_sessions, pkrsrv_lobby_client_session_t* client_session);
324void pkrsrv_lobby_client_sessions_remove(pkrsrv_lobby_client_sessions_t* client_sessions, pkrsrv_lobby_client_session_t* client_session);
325
330bool pkrsrv_lobby_client_enter_session(pkrsrv_lobby_client_t* client, pkrsrv_lobby_session_t* session);
335bool pkrsrv_lobby_client_leave_session(pkrsrv_lobby_client_t* client, pkrsrv_lobby_client_session_t* client_session);
344bool pkrsrv_lobby_client_join_session(pkrsrv_lobby_client_t* client, pkrsrv_lobby_session_t* session, uint64_t enterance_amount, int position);
350bool pkrsrv_lobby_client_unjoin_session(pkrsrv_lobby_client_t* client, pkrsrv_lobby_session_t* session);
351
356pkrsrv_lobby_client_session_t* pkrsrv_lobby_client_get_session_by_id(pkrsrv_lobby_client_t* client, uint64_t id);
361pkrsrv_lobby_client_session_t* pkrsrv_lobby_client_session_getby_table_id(pkrsrv_lobby_client_t* client, uint64_t id);
369pkrsrv_lobby_session_client_t* pkrsrv_lobby_session_client_getby_socket(pkrsrv_lobby_session_t* session, int socket);
377pkrsrv_lobby_session_client_t* pkrsrv_lobby_session_client_getby_account_id(pkrsrv_lobby_session_t* session, uint64_t account_id);
385pkrsrv_lobby_client_session_t* pkrsrv_lobby_client_session_getby_session_id(pkrsrv_lobby_client_t* lobby_client, uint64_t session_id);
386
387static void on_client_connected(pkrsrv_eventloop_task_t* task);
388static void on_client_disconnected(pkrsrv_eventloop_task_t* task);
389static void on_client_meowed(pkrsrv_eventloop_task_t* task);
390static void on_client_login(pkrsrv_eventloop_task_t* task);
391static void on_client_signup(pkrsrv_eventloop_task_t* task);
392static void on_client_get_account(pkrsrv_eventloop_task_t* task);
393static void on_client_enter(pkrsrv_eventloop_task_t* task);
394static void on_client_leave(pkrsrv_eventloop_task_t* task);
395static void on_client_join(pkrsrv_eventloop_task_t* task);
396static void on_client_unjoin(pkrsrv_eventloop_task_t* task);
397static void on_client_action(pkrsrv_eventloop_task_t* task);
398static void on_client_get_tables(pkrsrv_eventloop_task_t* task);
399static void on_client_get_sessions(pkrsrv_eventloop_task_t* task);
400static void on_client_update_account(pkrsrv_eventloop_task_t* task);
401static void on_client_json(pkrsrv_eventloop_task_t* task);
402
403static void on_poker_action(pkrsrv_eventloop_task_t* task);
404
410bool reorder_updated_session(pkrsrv_lobby_session_t* updated, int old_length);
411
415void pkrsrv_lobby_broadcast_sessions(pkrsrv_lobby_t* lobby);
416
pkrsrv_lobby_session_t * session
Definition lobby.h:261
pkrsrv_account_t * account
Definition lobby.h:133
pkrsrv_lobby_client_sessions_t * sessions
Definition lobby.h:132
pkrsrv_lobby_session_clients_t * clients
Definition lobby.h:84
int process_latency
Definition lobby.h:77
PGconn * pg_conn
Definition lobby.h:74
pkrsrv_lobby_client_t * lobby_client
Definition lobby.h:141
pkrsrv_uniqid_uuid_t id
Definition lobby.h:76
int port
Definition lobby.h:153
pthread_mutex_t mutex
Definition lobby.h:53
pkrsrv_account_t * account
Definition lobby.h:140
int max_clients
Definition lobby.h:156
pkrsrv_lobby_t * lobby
Definition lobby.h:190
pkrsrv_lobby_sessions_t * sessions
Definition lobby.h:55
pkrsrv_lobby_session_t * session
Definition lobby.h:247
int joined_clients_count
Definition lobby.h:85
pkrsrv_lobby_session_t * session
Definition lobby.h:112
pkrsrv_lobby_t * lobby
Definition lobby.h:75
pkrsrv_server_t * server
Definition lobby.h:52
bool is_joined
Definition lobby.h:113
pkrsrv_poker_t * poker
Definition lobby.h:78
pkrsrv_lobby_t * lobby
Definition lobby.h:130
pkrsrv_lobby_client_t * client
Definition lobby.h:101
pkrsrv_eventloop_task_t * proceed_task
Definition lobby.h:81
pkrsrv_eventloop_t * eventloop
Definition lobby.h:56
bool is_running
Definition lobby.h:80
int process_latency
Definition lobby.h:155
pkrsrv_eventloop_task_t * poker_start_task
Definition lobby.h:82
char * bind_address
Definition lobby.h:154
int process_latency
Definition lobby.h:54
pkrsrv_lobby_session_t * session
Definition lobby.h:275
pthread_mutex_t mutex
Definition lobby.h:79
pkrsrv_eventloop_task_t * poker_restart_task
Definition lobby.h:83
bool is_joined
Definition lobby.h:102
pkrsrv_table_t * table
Definition lobby.h:191
pkrsrv_server_client_t * client
Definition lobby.h:131
void pkrsrv_lobby_session_proceed__async(pkrsrv_eventloop_task_t *task)
Proceeds the session's game one step to future.
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.
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.
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:139
Lobby object.
Definition lobby.h:50
Lobby client object.
Definition lobby.h:128
Lobby client session object.
Definition lobby.h:110
Lobby client sessions list structure.
Definition lobby.h:120
Parameters of pkrsrv_lobby_new
Definition lobby.h:152
Session object.
Definition lobby.h:71
Session client object.
Definition lobby.h:99
Session clients list structure.
Definition lobby.h:91
Parameters of pkrsrv_lobby_session_new
Definition lobby.h:189
Parameters of pkrsrv_lobby_session_poker_restart__async
Definition lobby.h:274
Parameters of pkrsrv_lobby_session_poker_start__async
Definition lobby.h:260
Parameters of pkrsrv_lobby_session_proceed__async
Definition lobby.h:246
Lobby sessions list structure.
Definition lobby.h:62
#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