Cockatrice 2026-06-27-Development-3.1.0-beta.3
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 <QMultiMap>
7#include <QMutex>
8#include <QObject>
9#include <QReadWriteLock>
10#include <libcockatrice/protocol/pb/commands.pb.h>
11#include <libcockatrice/protocol/pb/serverinfo_ban.pb.h>
12#include <libcockatrice/protocol/pb/serverinfo_user.pb.h>
13
15class Server_Game;
16class Server_Room;
19class GameReplay;
20class IslMessage;
21class SessionEvent;
22class RoomEvent;
23class DeckList;
24class ServerInfo_Game;
25class ServerInfo_Room;
26class Response;
27class GameEventContainer;
28class CommandContainer;
29class Command_JoinGame;
30
43
44class Server : public QObject
45{
46 Q_OBJECT
47signals:
49 void sigSendIslMessage(const IslMessage &message, int serverId);
50 void endSession(qint64 sessionId);
51private slots:
52 void broadcastRoomUpdate(const ServerInfo_Room &roomInfo, bool sendToIsl = false);
53
54public:
55 mutable QReadWriteLock clientsLock, roomsLock; // locking order: roomsLock before clientsLock
56 explicit Server(QObject *parent = nullptr);
57 ~Server() override = default;
59 QString &name,
60 const QString &password,
61 bool passwordNeedsHash,
62 QString &reason,
63 int &secondsLeft,
64 QString &clientid,
65 QString &clientVersion,
66 QString &connectionType);
68
69 const QMap<int, Server_Room *> &getRooms()
70 {
71 return rooms;
72 }
73
74 Server_AbstractUserInterface *findUser(const QString &userName) const;
75 const QMap<QString, Server_ProtocolHandler *> &getUsers() const
76 {
77 return users;
78 }
79 const QMap<qint64, Server_ProtocolHandler *> &getUsersBySessionId() const
80 {
81 return usersBySessionId;
82 }
83 virtual QMap<QString, bool> getServerRequiredFeatureList() const
84 {
85 return QMap<QString, bool>();
86 }
89 QList<QString> getOnlineModeratorList() const;
90 virtual QString getLoginMessage() const
91 {
92 return QString();
93 }
94 virtual QString getRequiredFeatures() const
95 {
96 return QString();
97 }
98 virtual bool permitUnregisteredUsers() const
99 {
100 return true;
101 }
102 virtual bool getGameShouldPing() const
103 {
104 return false;
105 }
106 virtual bool getClientIDRequiredEnabled() const
107 {
108 return false;
109 }
110 virtual bool getRegOnlyServerEnabled() const
111 {
112 return false;
113 }
114 virtual bool getMaxUserLimitEnabled() const
115 {
116 return false;
117 }
118 virtual bool getEnableLogQuery() const
119 {
120 return false;
121 }
122 virtual bool getStoreReplaysEnabled() const
123 {
124 return true;
125 }
126 virtual int getIdleClientTimeout() const
127 {
128 return 0;
129 }
130 virtual int getClientKeepAlive() const
131 {
132 return 0;
133 }
134 virtual int getMaxGameInactivityTime() const
135 {
136 return 9999999;
137 }
138 virtual int getMaxPlayerInactivityTime() const
139 {
140 return 9999999;
141 }
142 virtual int getMessageCountingInterval() const
143 {
144 return 0;
145 }
147 {
148 return 0;
149 }
151 {
152 return 0;
153 }
154 virtual int getMaxGamesPerUser() const
155 {
156 return -1;
157 }
158 virtual int getCommandCountingInterval() const
159 {
160 return 0;
161 }
163 {
164 return 0;
165 }
166 virtual int getMaxUserTotal() const
167 {
168 return 9999999;
169 }
170 virtual int getServerID() const
171 {
172 return 0;
173 }
174 virtual bool permitCreateGameAsJudge() const
175 {
176 return false;
177 }
178
181 {
182 QMutexLocker locker(&nextLocalGameIdMutex);
183 return ++nextLocalGameId;
184 }
185
186 void sendIsl_Response(const Response &item, int serverId = -1, qint64 sessionId = -1);
187 void sendIsl_SessionEvent(const SessionEvent &item, int serverId = -1, qint64 sessionId = -1);
188 void sendIsl_GameEventContainer(const GameEventContainer &item, int serverId = -1, qint64 sessionId = -1);
189 void sendIsl_RoomEvent(const RoomEvent &item, int serverId = -1, qint64 sessionId = -1);
190 void sendIsl_GameCommand(const CommandContainer &item, int serverId, qint64 sessionId, int roomId, int playerId);
191 void sendIsl_RoomCommand(const CommandContainer &item, int serverId, qint64 sessionId, int roomId);
192
193 const QMap<QString, Server_AbstractUserInterface *> &getExternalUsers() const
194 {
195 return externalUsers;
196 }
197
198 void addPersistentPlayer(const QString &userName, int roomId, int gameId, int playerId);
199 void removePersistentPlayer(const QString &userName, int roomId, int gameId, int playerId);
200 QList<PlayerReference> getPersistentPlayerReferences(const QString &userName) const;
201 int getUsersCount() const;
202 int getGamesCount() const;
203 int getTCPUserCount() const
204 {
205 return tcpUserCount;
206 }
208 {
209 return webSocketUserCount;
210 }
211
212private:
213 QMultiMap<QString, PlayerReference> persistentPlayers;
214 mutable QReadWriteLock persistentPlayersLock;
217
218protected slots:
219 void externalUserJoined(const ServerInfo_User &userInfo);
220 void externalUserLeft(const QString &userName);
221 void externalRoomUserJoined(int roomId, const ServerInfo_User &userInfo);
222 void externalRoomUserLeft(int roomId, const QString &userName);
223 void externalRoomSay(int roomId, const QString &userName, const QString &message);
224 void externalRoomRemoveMessages(int roomId, const QString &userName, int amount);
225 void externalRoomGameListChanged(int roomId, const ServerInfo_Game &gameInfo);
226 void
227 externalJoinGameCommandReceived(const Command_JoinGame &cmd, int cmdId, int roomId, int serverId, qint64 sessionId);
228 void
229 externalGameCommandContainerReceived(const CommandContainer &cont, int playerId, int serverId, qint64 sessionId);
230 void externalGameEventContainerReceived(const GameEventContainer &cont, qint64 sessionId);
231 void externalResponseReceived(const Response &resp, qint64 sessionId);
232
233 virtual void doSendIslMessage(const IslMessage & /* msg */, int /* serverId */)
234 {
235 }
236
237protected:
238 void prepareDestroy();
239 void setDatabaseInterface(Server_DatabaseInterface *_databaseInterface);
240 QList<Server_ProtocolHandler *> clients;
241 QMap<qint64, Server_ProtocolHandler *> usersBySessionId;
242 QMap<QString, Server_ProtocolHandler *> users;
243 QMap<qint64, Server_AbstractUserInterface *> externalUsersBySessionId;
244 QMap<QString, Server_AbstractUserInterface *> externalUsers;
245 QMap<int, Server_Room *> rooms;
246 QMap<QThread *, Server_DatabaseInterface *> databaseInterfaces;
247 void addRoom(Server_Room *newRoom);
248};
249
250#endif
Represents a complete deck, including metadata, zones, cards, and sideboard plans.
Definition deck_list.h:63
Definition server_abstractuserinterface.h:20
Definition server_database_interface.h:9
Definition server_game.h:47
Definition server_protocolhandler.h:46
Definition server_room.h:27
int getUsersCount() const
Definition server.cpp:616
virtual bool getMaxUserLimitEnabled() const
Definition server.h:114
void externalRoomSay(int roomId, const QString &userName, const QString &message)
Definition server.cpp:420
void removeClient(Server_ProtocolHandler *player)
Definition server.cpp:256
virtual bool getClientIDRequiredEnabled() const
Definition server.h:106
const QMap< QString, Server_ProtocolHandler * > & getUsers() const
Definition server.h:75
virtual QMap< QString, bool > getServerRequiredFeatureList() const
Definition server.h:83
QReadWriteLock persistentPlayersLock
Definition server.h:214
void externalUserJoined(const ServerInfo_User &userInfo)
Definition server.cpp:317
virtual int getMaxGameInactivityTime() const
Definition server.h:134
virtual bool permitUnregisteredUsers() const
Definition server.h:98
QMap< qint64, Server_AbstractUserInterface * > externalUsersBySessionId
Definition server.h:243
void addPersistentPlayer(const QString &userName, int roomId, int gameId, int playerId)
Definition server.cpp:212
void externalUserLeft(const QString &userName)
Definition server.cpp:343
virtual int getMaxGamesPerUser() const
Definition server.h:154
void broadcastRoomUpdate(const ServerInfo_Room &roomInfo, bool sendToIsl=false)
Definition server.cpp:582
virtual QString getRequiredFeatures() const
Definition server.h:94
virtual bool getEnableLogQuery() const
Definition server.h:118
QMultiMap< QString, PlayerReference > persistentPlayers
Definition server.h:213
const QMap< int, Server_Room * > & getRooms()
Definition server.h:69
virtual int getMaxPlayerInactivityTime() const
Definition server.h:138
void removePersistentPlayer(const QString &userName, int roomId, int gameId, int playerId)
Definition server.cpp:218
virtual QString getLoginMessage() const
Definition server.h:90
void prepareDestroy()
Definition server.cpp:55
virtual void doSendIslMessage(const IslMessage &, int)
Definition server.h:233
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:77
void externalRoomRemoveMessages(int roomId, const QString &userName, int amount)
Definition server.cpp:436
void externalRoomUserJoined(int roomId, const ServerInfo_User &userInfo)
Definition server.cpp:394
QMap< QString, Server_AbstractUserInterface * > externalUsers
Definition server.h:244
int getWebSocketUserCount() const
Definition server.h:207
virtual int getMaxUserTotal() const
Definition server.h:166
void externalJoinGameCommandReceived(const Command_JoinGame &cmd, int cmdId, int roomId, int serverId, qint64 sessionId)
Definition server.cpp:462
void addRoom(Server_Room *newRoom)
Definition server.cpp:606
QReadWriteLock roomsLock
Definition server.h:55
int nextLocalGameId
Definition server.h:215
virtual int getMaxCommandCountPerInterval() const
Definition server.h:162
const QMap< qint64, Server_ProtocolHandler * > & getUsersBySessionId() const
Definition server.h:79
void sendIsl_RoomCommand(const CommandContainer &item, int serverId, qint64 sessionId, int roomId)
Definition server.cpp:697
void addClient(Server_ProtocolHandler *player)
Definition server.cpp:242
QMap< int, Server_Room * > rooms
Definition server.h:245
virtual int getServerID() const
Definition server.h:170
virtual int getCommandCountingInterval() const
Definition server.h:158
Server_AbstractUserInterface * findUser(const QString &userName) const
Definition server.cpp:230
void sigSendIslMessage(const IslMessage &message, int serverId)
QReadWriteLock clientsLock
Definition server.h:55
virtual int getMessageCountingInterval() const
Definition server.h:142
void externalResponseReceived(const Response &resp, qint64 sessionId)
Definition server.cpp:568
Server(QObject *parent=nullptr)
Definition server.cpp:40
QMap< QThread *, Server_DatabaseInterface * > databaseInterfaces
Definition server.h:246
QList< Server_ProtocolHandler * > clients
Definition server.h:240
QMutex nextLocalGameIdMutex
Definition server.h:216
void externalRoomUserLeft(int roomId, const QString &userName)
Definition server.cpp:407
virtual int getClientKeepAlive() const
Definition server.h:130
void endSession(qint64 sessionId)
int getNextLocalGameId()
Definition server.h:180
const QMap< QString, Server_AbstractUserInterface * > & getExternalUsers() const
Definition server.h:193
QMap< QString, Server_ProtocolHandler * > users
Definition server.h:242
void sendIsl_SessionEvent(const SessionEvent &item, int serverId=-1, qint64 sessionId=-1)
Definition server.cpp:647
virtual bool permitCreateGameAsJudge() const
Definition server.h:174
Server_DatabaseInterface * getDatabaseInterface() const
Definition server.cpp:72
virtual int getMaxMessageCountPerInterval() const
Definition server.h:146
void sendIsl_GameEventContainer(const GameEventContainer &item, int serverId=-1, qint64 sessionId=-1)
Definition server.cpp:659
void sendIsl_GameCommand(const CommandContainer &item, int serverId, qint64 sessionId, int roomId, int playerId)
Definition server.cpp:683
int tcpUserCount
Definition server.h:215
virtual int getIdleClientTimeout() const
Definition server.h:126
void externalGameEventContainerReceived(const GameEventContainer &cont, qint64 sessionId)
Definition server.cpp:554
void sendIsl_Response(const Response &item, int serverId=-1, qint64 sessionId=-1)
Definition server.cpp:635
int webSocketUserCount
Definition server.h:215
void externalGameCommandContainerReceived(const CommandContainer &cont, int playerId, int serverId, qint64 sessionId)
Definition server.cpp:497
QMap< qint64, Server_ProtocolHandler * > usersBySessionId
Definition server.h:241
virtual int getMaxMessageSizePerInterval() const
Definition server.h:150
virtual bool getRegOnlyServerEnabled() const
Definition server.h:110
void broadcastUserInfoUpdate(Server_ProtocolHandler *source)
Definition server.cpp:193
QList< QString > getOnlineModeratorList() const
Definition server.cpp:301
int getGamesCount() const
Definition server.cpp:622
virtual bool getGameShouldPing() const
Definition server.h:102
~Server() override=default
QList< PlayerReference > getPersistentPlayerReferences(const QString &userName) const
Definition server.cpp:224
void setDatabaseInterface(Server_DatabaseInterface *_databaseInterface)
Definition server.cpp:66
void pingClockTimeout()
void sendIsl_RoomEvent(const RoomEvent &item, int serverId=-1, qint64 sessionId=-1)
Definition server.cpp:671
int getTCPUserCount() const
Definition server.h:203
void externalRoomGameListChanged(int roomId, const ServerInfo_Game &gameInfo)
Definition server.cpp:449
virtual bool getStoreReplaysEnabled() const
Definition server.h:122
static constexpr int amount
Definition deck_hash_performance_test.cpp:5
AuthenticationResult
Definition server.h:32
@ UserIsInactive
Definition server.h:40
@ UnknownUser
Definition server.h:35
@ RegistrationRequired
Definition server.h:39
@ UserIsBanned
Definition server.h:37
@ ClientIdRequired
Definition server.h:41
@ PasswordRight
Definition server.h:34
@ WouldOverwriteOldSession
Definition server.h:36
@ UsernameInvalid
Definition server.h:38
@ NotLoggedIn
Definition server.h:33