-
Notifications
You must be signed in to change notification settings - Fork 0
/
client.h
182 lines (146 loc) · 3.95 KB
/
client.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
////////////
//
// auteur: Louis Devroye (000523920)
//
// date: 03-03-2022
//
// description : Client capable de se connecter à un server via un port (8080 par défaut).
// Il doit avoir un pseudo. le client gère l'envoi et la réception de messages via le multithreading
//
// cours: info-f-209 groupe 7
//
////////////
#ifndef CLIENT_H
#define CLIENT_H
#include "utils.h"
#include "lobby.h"
#include "database.h"
#include "observer_subject.h"
#include <pthread.h>
#include <vector>
#include <iostream>
#define TRUE 1
#define FALSE 0
using namespace std;
/**
* @brief Un client se réfère à un utilisateur.
* L'utilisateur peut chatter, créer un lobby, lancer une partie (s'il est l'hôte) et voir ses amis (en ligne ou non).
*/
class Client : public Subject {
string ip="127.0.0.1";
Lobby* lobby=nullptr;
int port_server=8080, sock=0, port_lobby=0;
bool isConnect = false;
string pseudo;
pthread_t tids[1];
bool host, inUi;
static inline Client* me;
public:
Database database;
Client(string pseudo, const int& port, bool inUi=true);
~Client()=default;
// getters & setters
string getPseudo();
string getIP();
pthread_t getTid();
int getSocket();
int getPortLobby();
void setSocket(const int &newSocket);
void setHost();
void removeHost();
void setLobbyPort(const int& port);
bool isHost();
bool isConnected();
bool isTerminal();
/**
* @brief Créer un terminal et connect un client du même nom au lobby à port
*
* @param port port sur lequel se connecter au lobby
*/
void connectClientToLobby(const string &port);
/**
* @brief Créer un terminal et lance un lobby dedans
*
*/
void createLobby();
/**
* @brief Créer un lobby et le lie au client en tant qu'hôte de ce lobby (pour le client) puis connect ce client au lobby
*
* @param newPort port du lobby sur lequel le client est hote
* @return true si tout s'est bien déroulé
* @return false si le client est déjà hôte d'un lobby;
*/
int setLobby(const string& nameLobby);
/**
* @brief Délie le client du lobby pour lequel il est l'hôte et ferme ce lobby
*
* @return true le lobby s'est bien fermé
* @return false si le client n'est pas l'hôte d'un lobby
*/
void killLobby();
/**
* @brief fonction de thread pour recevoir des messages
*
* @param param pointeur inutilisé
* @return void* nécessairement void * pour pthread_create
*/
static void *userThreadFun(void *param);
/**
* @brief Envoie le pseudo de l'utilisateur au server
*
*/
void sendUserName();
/**
* @brief Essaie de se connecter au server
*
* @return -1 = erreur, 0 = pas réussi, 1 = réussi
*/
int tryConnect();
/**
* @brief Envoie un message à un autre utilisateur grâce à son ID_USER
*
* @param id_user identifiant unique de l'utilisateur auquel envoyer le message
* @param line message à envoyer
*
*/
void TrySendMessage(const string& line);
/**
* @brief Montre le leaderboard
*/
void consultLeaderBoard();
/**
* @brief Construct a new consult Friends List object
*
*/
void consultFriendsList();
/**
* @brief Imprime pseudonyme
*/
void whoAmI();
/**
* @brief Imprime les listes des commandes et son syntax/fonctionnements.
*/
void showHelp();
/**
* @brief gère la commande reçue
*
* @param msg message contenant la taille, le txt et la taille du txt
*/
void processCmd(Message& msg);
/**
* @brief ajoute des informations nécessaires au server et test si la commande est permise dans l'état actuel
*
* @param msg message qui va être modifié
*
* @return true si la commande peut être envoyée
*/
bool HandleCmdSend(Message &msg);
/**
* @brief change l'état de la connexion et envoie un message si NEWCO est false
*
* @param newCo nouvel état de la connexion
*/
void setConnection(bool newCo);
void changePseudo(string &str);
};
#endif //CLIENT_H