Cockatrice 2026-10-19-Development-3.1.2-beta.2
A virtual tabletop for multiplayer card games
Loading...
Searching...
No Matches
server.h
Go to the documentation of this file.
1#ifndef SERVER_H
2#define SERVER_H
3
5
6#include <QList>
7#include <QMap>
8#include <QMultiMap>
9#include <QMutex>
10#include <QMutexLocker>
11#include <QObject>
12#include <QReadWriteLock>
13#include <QString>
14#include <QtGlobal>
15#include <qtmetamacros.h>
16
18class Server_Room;
21class IslMessage;
22class SessionEvent;
23class RoomEvent;
24class ServerInfo_Game;
25class ServerInfo_Room;
26class Response;
30class QThread;
31class ServerInfo_User;
32
46
47class Server : public QObject
48{
49 Q_OBJECT
50signals:
52 void sigSendIslMessage(const IslMessage &message, int serverId);
53 void endSession(qint64 sessionId);
54private slots:
55 void broadcastRoomUpdate(const ServerInfo_Room &roomInfo, bool sendToIsl = false);
56
57public:
58 mutable QReadWriteLock clientsLock, roomsLock; // locking order: roomsLock before clientsLock
59 explicit Server(QObject *parent = nullptr);
60 ~Server() override = default;
62 QString &name,
63 const QString &password,
64 bool passwordNeedsHash,
65 QString &reason,
66 int &secondsLeft,
67 QString &clientid,
68 QString &clientVersion,
69 QString &connectionType);
71
73 {
74 return rooms;
75 }
76
77 Server_AbstractUserInterface *findUser(const QString &userName) const;
79 {
80 return users;
81 }
90
91 virtual bool requiresChallengeResponseAuth() const
92 {
93 return false;
94 }
98 virtual QString getLoginMessage() const
99 {
100 return QString();
101 }
103 {
104 return nullptr;
105 }
106 virtual QString getRequiredFeatures() const
107 {
108 return QString();
109 }
110 virtual bool permitUnregisteredUsers() const
111 {
112 return true;
113 }
114 virtual bool getGameShouldPing() const
115 {
116 return false;
117 }
118 virtual bool getClientIDRequiredEnabled() const
119 {
120 return false;
121 }
122 virtual bool getRegOnlyServerEnabled() const
123 {
124 return false;
125 }
126 virtual bool getMaxUserLimitEnabled() const
127 {
128 return false;
129 }
130 virtual bool getEnableLogQuery() const
131 {
132 return false;
133 }
134 virtual bool getStoreReplaysEnabled() const
135 {
136 return true;
137 }
138 virtual int getIdleClientTimeout() const
139 {
140 return 0;
141 }
142 virtual int getClientKeepAlive() const
143 {
144 return 0;
145 }
146 virtual int getMaxGameInactivityTime() const
147 {
148 return 9999999;
149 }
150 virtual int getMaxPlayerInactivityTime() const
151 {
152 return 9999999;
153 }
154 virtual int getMessageCountingInterval() const
155 {
156 return 0;
157 }
159 {
160 return 0;
161 }
163 {
164 return 0;
165 }
166 virtual int getMaxGamesPerUser() const
167 {
168 return -1;
169 }
170 virtual int getCommandCountingInterval() const
171 {
172 return 0;
173 }
175 {
176 return 0;
177 }
178 virtual int getMaxUserTotal() const
179 {
180 return 9999999;
181 }
182 virtual int getServerID() const
183 {
184 return 0;
185 }
186 virtual bool permitCreateGameAsJudge() const
187 {
188 return false;
189 }
190
192 virtual void observeGameStartDurationMs(qint64 /* elapsedMs */)
193 {
194 }
195
202 virtual bool recordFailedLogin(const QString & /*ipAddress*/, const QString & /*userName*/)
203 {
204 return false;
205 }
206
212 virtual bool isLoginRateLimited(const QString & /*ipAddress*/, const QString & /*userName*/)
213 {
214 return false;
215 }
216
220 virtual int loginRateLimitRemainingSeconds(const QString & /*ipAddress*/, const QString & /*userName*/)
221 {
222 return 0;
223 }
224
225 virtual void clearFailedLogins(const QString & /*ipAddress*/, const QString & /*userName*/)
226 {
227 }
228
231 {
232 QMutexLocker locker(&nextLocalGameIdMutex);
233 return ++nextLocalGameId;
234 }
235
236 void sendIsl_Response(const Response &item, int serverId = -1, qint64 sessionId = -1);
237 void sendIsl_SessionEvent(const SessionEvent &item, int serverId = -1, qint64 sessionId = -1);
238 void sendIsl_GameEventContainer(const GameEventContainer &item, int serverId = -1, qint64 sessionId = -1);
239 void sendIsl_RoomEvent(const RoomEvent &item, int serverId = -1, qint64 sessionId = -1);
240 void sendIsl_GameCommand(const CommandContainer &item, int serverId, qint64 sessionId, int roomId, int playerId);
241 void sendIsl_RoomCommand(const CommandContainer &item, int serverId, qint64 sessionId, int roomId);
242
247
248 void addPersistentPlayer(const QString &userName, int roomId, int gameId, int playerId);
249 void removePersistentPlayer(const QString &userName, int roomId, int gameId, int playerId);
250 QList<PlayerReference> getPersistentPlayerReferences(const QString &userName) const;
251 int getUsersCount() const;
252 int getGamesCount() const;
253 int getTCPUserCount() const
254 {
255 return tcpUserCount;
256 }
258 {
259 return webSocketUserCount;
260 }
261
262private:
263 QMultiMap<QString, PlayerReference> persistentPlayers;
264 mutable QReadWriteLock persistentPlayersLock;
267
268protected slots:
269 void externalUserJoined(const ServerInfo_User &userInfo);
270 void externalUserLeft(const QString &userName);
271 void externalRoomUserJoined(int roomId, const ServerInfo_User &userInfo);
272 void externalRoomUserLeft(int roomId, const QString &userName);
273 void externalRoomSay(int roomId, const QString &userName, const QString &message, const QString &channelId);
274 void externalRoomRemoveMessages(int roomId, const QString &userName, int amount);
275 void externalRoomGameListChanged(int roomId, const ServerInfo_Game &gameInfo);
276 void
277 externalJoinGameCommandReceived(const Command_JoinGame &cmd, int cmdId, int roomId, int serverId, qint64 sessionId);
278 void
279 externalGameCommandContainerReceived(const CommandContainer &cont, int playerId, int serverId, qint64 sessionId);
280 void externalGameEventContainerReceived(const GameEventContainer &cont, qint64 sessionId);
281 void externalResponseReceived(const Response &resp, qint64 sessionId);
282
283 virtual void doSendIslMessage(const IslMessage & /* msg */, int /* serverId */)
284 {
285 }
286
287protected:
288 void prepareDestroy();
289 void setDatabaseInterface(Server_DatabaseInterface *_databaseInterface);
297 void addRoom(Server_Room *newRoom);
298};
299
300#endif
Definition remote_connection_controller.h:20
Definition game.h:18
Definition server_abstractuserinterface.h:28
Definition server_database_interface.h:22
Definition server_protocolhandler.h:40
Definition server_room.h:35
int getUsersCount() const
Definition server.cpp:652
virtual bool getMaxUserLimitEnabled() const
Definition server.h:126
void removeClient(Server_ProtocolHandler *player)
Definition server.cpp:280
virtual bool getClientIDRequiredEnabled() const
Definition server.h:118
const QMap< QString, Server_ProtocolHandler * > & getUsers() const
Definition server.h:78
virtual void observeGameStartDurationMs(qint64)
Definition server.h:192
virtual QMap< QString, bool > getServerRequiredFeatureList() const
Definition server.h:86
QReadWriteLock persistentPlayersLock
Definition server.h:264
void externalUserJoined(const ServerInfo_User &userInfo)
Definition server.cpp:341
virtual bool requiresChallengeResponseAuth() const
True when only challenge-response logins are accepted (strict mode).
Definition server.h:91
virtual int getMaxGameInactivityTime() const
Definition server.h:146
virtual bool permitUnregisteredUsers() const
Definition server.h:110
QMap< qint64, Server_AbstractUserInterface * > externalUsersBySessionId
Definition server.h:293
void addPersistentPlayer(const QString &userName, int roomId, int gameId, int playerId)
Definition server.cpp:236
void externalUserLeft(const QString &userName)
Definition server.cpp:367
virtual int getMaxGamesPerUser() const
Definition server.h:166
void broadcastRoomUpdate(const ServerInfo_Room &roomInfo, bool sendToIsl=false)
Definition server.cpp:618
virtual int loginRateLimitRemainingSeconds(const QString &, const QString &)
Seconds remaining before the login rate limit for the (address, username) pair lifts....
Definition server.h:220
virtual QString getRequiredFeatures() const
Definition server.h:106
virtual bool getEnableLogQuery() const
Definition server.h:130
QMultiMap< QString, PlayerReference > persistentPlayers
Definition server.h:263
const QMap< int, Server_Room * > & getRooms()
Definition server.h:72
virtual int getMaxPlayerInactivityTime() const
Definition server.h:150
void removePersistentPlayer(const QString &userName, int roomId, int gameId, int playerId)
Definition server.cpp:242
virtual QString getLoginMessage() const
Definition server.h:98
void prepareDestroy()
Definition server.cpp:79
virtual void doSendIslMessage(const IslMessage &, int)
Definition server.h:283
AuthenticationResult loginUser(Server_ProtocolHandler *session, QString &name, const QString &password, bool passwordNeedsHash, QString &reason, int &secondsLeft, QString &clientid, QString &clientVersion, QString &connectionType)
Definition server.cpp:101
void externalRoomRemoveMessages(int roomId, const QString &userName, int amount)
Definition server.cpp:472
void externalRoomUserJoined(int roomId, const ServerInfo_User &userInfo)
Definition server.cpp:418
QMap< QString, Server_AbstractUserInterface * > externalUsers
Definition server.h:294
int getWebSocketUserCount() const
Definition server.h:257
virtual int getMaxUserTotal() const
Definition server.h:178
void externalJoinGameCommandReceived(const Command_JoinGame &cmd, int cmdId, int roomId, int serverId, qint64 sessionId)
Definition server.cpp:498
void addRoom(Server_Room *newRoom)
Definition server.cpp:642
QReadWriteLock roomsLock
Definition server.h:58
int nextLocalGameId
Definition server.h:265
virtual int getMaxCommandCountPerInterval() const
Definition server.h:174
const QMap< qint64, Server_ProtocolHandler * > & getUsersBySessionId() const
Definition server.h:82
virtual SessionEvent * getLoginSessionEvent() const
Definition server.h:102
void sendIsl_RoomCommand(const CommandContainer &item, int serverId, qint64 sessionId, int roomId)
Definition server.cpp:733
virtual void clearFailedLogins(const QString &, const QString &)
Clear any failed-login lockout for the (address, username) pair, e.g. after a successful login.
Definition server.h:225
void addClient(Server_ProtocolHandler *player)
Definition server.cpp:266
QMap< int, Server_Room * > rooms
Definition server.h:295
virtual int getServerID() const
Definition server.h:182
virtual int getCommandCountingInterval() const
Definition server.h:170
Server_AbstractUserInterface * findUser(const QString &userName) const
Definition server.cpp:254
void sigSendIslMessage(const IslMessage &message, int serverId)
QReadWriteLock clientsLock
Definition server.h:58
virtual int getMessageCountingInterval() const
Definition server.h:154
void externalResponseReceived(const Response &resp, qint64 sessionId)
Definition server.cpp:604
Server(QObject *parent=nullptr)
Definition server.cpp:64
QMap< QThread *, Server_DatabaseInterface * > databaseInterfaces
Definition server.h:296
QList< Server_ProtocolHandler * > clients
Definition server.h:290
QMutex nextLocalGameIdMutex
Definition server.h:266
void externalRoomUserLeft(int roomId, const QString &userName)
Definition server.cpp:431
virtual int getClientKeepAlive() const
Definition server.h:142
void endSession(qint64 sessionId)
int getNextLocalGameId()
Definition server.h:230
const QMap< QString, Server_AbstractUserInterface * > & getExternalUsers() const
Definition server.h:243
QMap< QString, Server_ProtocolHandler * > users
Definition server.h:292
void sendIsl_SessionEvent(const SessionEvent &item, int serverId=-1, qint64 sessionId=-1)
Definition server.cpp:683
virtual bool permitCreateGameAsJudge() const
Definition server.h:186
Server_DatabaseInterface * getDatabaseInterface() const
Definition server.cpp:96
virtual int getMaxMessageCountPerInterval() const
Definition server.h:158
void sendIsl_GameEventContainer(const GameEventContainer &item, int serverId=-1, qint64 sessionId=-1)
Definition server.cpp:695
void sendIsl_GameCommand(const CommandContainer &item, int serverId, qint64 sessionId, int roomId, int playerId)
Definition server.cpp:719
int tcpUserCount
Definition server.h:265
virtual int getIdleClientTimeout() const
Definition server.h:138
void externalGameEventContainerReceived(const GameEventContainer &cont, qint64 sessionId)
Definition server.cpp:590
void sendIsl_Response(const Response &item, int serverId=-1, qint64 sessionId=-1)
Definition server.cpp:671
int webSocketUserCount
Definition server.h:265
void externalGameCommandContainerReceived(const CommandContainer &cont, int playerId, int serverId, qint64 sessionId)
Definition server.cpp:533
QMap< qint64, Server_ProtocolHandler * > usersBySessionId
Definition server.h:291
virtual int getMaxMessageSizePerInterval() const
Definition server.h:162
virtual bool getRegOnlyServerEnabled() const
Definition server.h:122
void broadcastUserInfoUpdate(Server_ProtocolHandler *source)
Definition server.cpp:217
QList< QString > getOnlineModeratorList() const
Definition server.cpp:325
int getGamesCount() const
Definition server.cpp:658
virtual bool getGameShouldPing() const
Definition server.h:114
~Server() override=default
QList< PlayerReference > getPersistentPlayerReferences(const QString &userName) const
Definition server.cpp:248
void setDatabaseInterface(Server_DatabaseInterface *_databaseInterface)
Definition server.cpp:90
void pingClockTimeout()
void sendIsl_RoomEvent(const RoomEvent &item, int serverId=-1, qint64 sessionId=-1)
Definition server.cpp:707
virtual bool isLoginRateLimited(const QString &, const QString &)
True if the (address, username) pair is already locked out of logging in.
Definition server.h:212
int getTCPUserCount() const
Definition server.h:253
void externalRoomSay(int roomId, const QString &userName, const QString &message, const QString &channelId)
Definition server.cpp:444
void externalRoomGameListChanged(int roomId, const ServerInfo_Game &gameInfo)
Definition server.cpp:485
virtual bool getStoreReplaysEnabled() const
Definition server.h:134
virtual bool recordFailedLogin(const QString &, const QString &)
Record a failed login attempt for the (address, username) pair; returns true if now locked out.
Definition server.h:202
AuthenticationResult
Definition server.h:34
@ UserIsInactive
Definition server.h:42
@ PasswordChangeRequired
Definition server.h:44
@ UnknownUser
Definition server.h:37
@ RegistrationRequired
Definition server.h:41
@ UserIsBanned
Definition server.h:39
@ ClientIdRequired
Definition server.h:43
@ PasswordRight
Definition server.h:36
@ WouldOverwriteOldSession
Definition server.h:38
@ UsernameInvalid
Definition server.h:40
@ NotLoggedIn
Definition server.h:35
Definition commands.proto:8
Definition room_commands.proto:79
Definition game_event_container.proto:4
Definition isl_message.proto:7
Definition response.proto:11
Definition room_event.proto:2
Definition serverinfo_game.proto:5
Definition serverinfo_room.proto:6
Definition serverinfo_user.proto:2
Definition session_event.proto:2