Cockatrice 2026-09-01-Development-3.1.0-beta.10
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;
30
44
45class Server : public QObject
46{
47 Q_OBJECT
48signals:
50 void sigSendIslMessage(const IslMessage &message, int serverId);
51 void endSession(qint64 sessionId);
52private slots:
53 void broadcastRoomUpdate(const ServerInfo_Room &roomInfo, bool sendToIsl = false);
54
55public:
56 mutable QReadWriteLock clientsLock, roomsLock; // locking order: roomsLock before clientsLock
57 explicit Server(QObject *parent = nullptr);
58 ~Server() override = default;
60 QString &name,
61 const QString &password,
62 bool passwordNeedsHash,
63 QString &reason,
64 int &secondsLeft,
65 QString &clientid,
66 QString &clientVersion,
67 QString &connectionType);
69
70 const QMap<int, Server_Room *> &getRooms()
71 {
72 return rooms;
73 }
74
75 Server_AbstractUserInterface *findUser(const QString &userName) const;
76 const QMap<QString, Server_ProtocolHandler *> &getUsers() const
77 {
78 return users;
79 }
80 const QMap<qint64, Server_ProtocolHandler *> &getUsersBySessionId() const
81 {
82 return usersBySessionId;
83 }
84 virtual QMap<QString, bool> getServerRequiredFeatureList() const
85 {
86 return QMap<QString, bool>();
87 }
90 QList<QString> getOnlineModeratorList() const;
91 virtual QString getLoginMessage() const
92 {
93 return QString();
94 }
96 {
97 return nullptr;
98 }
99 virtual QString getRequiredFeatures() const
100 {
101 return QString();
102 }
103 virtual bool permitUnregisteredUsers() const
104 {
105 return true;
106 }
107 virtual bool getGameShouldPing() const
108 {
109 return false;
110 }
111 virtual bool getClientIDRequiredEnabled() const
112 {
113 return false;
114 }
115 virtual bool getRegOnlyServerEnabled() const
116 {
117 return false;
118 }
119 virtual bool getMaxUserLimitEnabled() const
120 {
121 return false;
122 }
123 virtual bool getEnableLogQuery() const
124 {
125 return false;
126 }
127 virtual bool getStoreReplaysEnabled() const
128 {
129 return true;
130 }
131 virtual int getIdleClientTimeout() const
132 {
133 return 0;
134 }
135 virtual int getClientKeepAlive() const
136 {
137 return 0;
138 }
139 virtual int getMaxGameInactivityTime() const
140 {
141 return 9999999;
142 }
143 virtual int getMaxPlayerInactivityTime() const
144 {
145 return 9999999;
146 }
147 virtual int getMessageCountingInterval() const
148 {
149 return 0;
150 }
152 {
153 return 0;
154 }
156 {
157 return 0;
158 }
159 virtual int getMaxGamesPerUser() const
160 {
161 return -1;
162 }
163 virtual int getCommandCountingInterval() const
164 {
165 return 0;
166 }
168 {
169 return 0;
170 }
171 virtual int getMaxUserTotal() const
172 {
173 return 9999999;
174 }
175 virtual int getServerID() const
176 {
177 return 0;
178 }
179 virtual bool permitCreateGameAsJudge() const
180 {
181 return false;
182 }
183
186 {
187 QMutexLocker locker(&nextLocalGameIdMutex);
188 return ++nextLocalGameId;
189 }
190
191 void sendIsl_Response(const Response &item, int serverId = -1, qint64 sessionId = -1);
192 void sendIsl_SessionEvent(const SessionEvent &item, int serverId = -1, qint64 sessionId = -1);
193 void sendIsl_GameEventContainer(const GameEventContainer &item, int serverId = -1, qint64 sessionId = -1);
194 void sendIsl_RoomEvent(const RoomEvent &item, int serverId = -1, qint64 sessionId = -1);
195 void sendIsl_GameCommand(const CommandContainer &item, int serverId, qint64 sessionId, int roomId, int playerId);
196 void sendIsl_RoomCommand(const CommandContainer &item, int serverId, qint64 sessionId, int roomId);
197
198 const QMap<QString, Server_AbstractUserInterface *> &getExternalUsers() const
199 {
200 return externalUsers;
201 }
202
203 void addPersistentPlayer(const QString &userName, int roomId, int gameId, int playerId);
204 void removePersistentPlayer(const QString &userName, int roomId, int gameId, int playerId);
205 QList<PlayerReference> getPersistentPlayerReferences(const QString &userName) const;
206 int getUsersCount() const;
207 int getGamesCount() const;
208 int getTCPUserCount() const
209 {
210 return tcpUserCount;
211 }
213 {
214 return webSocketUserCount;
215 }
216
217private:
218 QMultiMap<QString, PlayerReference> persistentPlayers;
219 mutable QReadWriteLock persistentPlayersLock;
222
223protected slots:
224 void externalUserJoined(const ServerInfo_User &userInfo);
225 void externalUserLeft(const QString &userName);
226 void externalRoomUserJoined(int roomId, const ServerInfo_User &userInfo);
227 void externalRoomUserLeft(int roomId, const QString &userName);
228 void externalRoomSay(int roomId, const QString &userName, const QString &message);
229 void externalRoomRemoveMessages(int roomId, const QString &userName, int amount);
230 void externalRoomGameListChanged(int roomId, const ServerInfo_Game &gameInfo);
231 void
232 externalJoinGameCommandReceived(const Command_JoinGame &cmd, int cmdId, int roomId, int serverId, qint64 sessionId);
233 void
234 externalGameCommandContainerReceived(const CommandContainer &cont, int playerId, int serverId, qint64 sessionId);
235 void externalGameEventContainerReceived(const GameEventContainer &cont, qint64 sessionId);
236 void externalResponseReceived(const Response &resp, qint64 sessionId);
237
238 virtual void doSendIslMessage(const IslMessage & /* msg */, int /* serverId */)
239 {
240 }
241
242protected:
243 void prepareDestroy();
244 void setDatabaseInterface(Server_DatabaseInterface *_databaseInterface);
245 QList<Server_ProtocolHandler *> clients;
246 QMap<qint64, Server_ProtocolHandler *> usersBySessionId;
247 QMap<QString, Server_ProtocolHandler *> users;
248 QMap<qint64, Server_AbstractUserInterface *> externalUsersBySessionId;
249 QMap<QString, Server_AbstractUserInterface *> externalUsers;
250 QMap<int, Server_Room *> rooms;
251 QMap<QThread *, Server_DatabaseInterface *> databaseInterfaces;
252 void addRoom(Server_Room *newRoom);
253};
254
255#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:52
Definition server_protocolhandler.h:46
Definition server_room.h:27
int getUsersCount() const
Definition server.cpp:616
virtual bool getMaxUserLimitEnabled() const
Definition server.h:119
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:111
const QMap< QString, Server_ProtocolHandler * > & getUsers() const
Definition server.h:76
virtual QMap< QString, bool > getServerRequiredFeatureList() const
Definition server.h:84
QReadWriteLock persistentPlayersLock
Definition server.h:219
void externalUserJoined(const ServerInfo_User &userInfo)
Definition server.cpp:317
virtual int getMaxGameInactivityTime() const
Definition server.h:139
virtual bool permitUnregisteredUsers() const
Definition server.h:103
QMap< qint64, Server_AbstractUserInterface * > externalUsersBySessionId
Definition server.h:248
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:159
void broadcastRoomUpdate(const ServerInfo_Room &roomInfo, bool sendToIsl=false)
Definition server.cpp:582
virtual QString getRequiredFeatures() const
Definition server.h:99
virtual bool getEnableLogQuery() const
Definition server.h:123
QMultiMap< QString, PlayerReference > persistentPlayers
Definition server.h:218
const QMap< int, Server_Room * > & getRooms()
Definition server.h:70
virtual int getMaxPlayerInactivityTime() const
Definition server.h:143
void removePersistentPlayer(const QString &userName, int roomId, int gameId, int playerId)
Definition server.cpp:218
virtual QString getLoginMessage() const
Definition server.h:91
void prepareDestroy()
Definition server.cpp:55
virtual void doSendIslMessage(const IslMessage &, int)
Definition server.h:238
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:249
int getWebSocketUserCount() const
Definition server.h:212
virtual int getMaxUserTotal() const
Definition server.h:171
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:56
int nextLocalGameId
Definition server.h:220
virtual int getMaxCommandCountPerInterval() const
Definition server.h:167
const QMap< qint64, Server_ProtocolHandler * > & getUsersBySessionId() const
Definition server.h:80
virtual SessionEvent * getLoginSessionEvent() const
Definition server.h:95
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:250
virtual int getServerID() const
Definition server.h:175
virtual int getCommandCountingInterval() const
Definition server.h:163
Server_AbstractUserInterface * findUser(const QString &userName) const
Definition server.cpp:230
void sigSendIslMessage(const IslMessage &message, int serverId)
QReadWriteLock clientsLock
Definition server.h:56
virtual int getMessageCountingInterval() const
Definition server.h:147
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:251
QList< Server_ProtocolHandler * > clients
Definition server.h:245
QMutex nextLocalGameIdMutex
Definition server.h:221
void externalRoomUserLeft(int roomId, const QString &userName)
Definition server.cpp:407
virtual int getClientKeepAlive() const
Definition server.h:135
void endSession(qint64 sessionId)
int getNextLocalGameId()
Definition server.h:185
const QMap< QString, Server_AbstractUserInterface * > & getExternalUsers() const
Definition server.h:198
QMap< QString, Server_ProtocolHandler * > users
Definition server.h:247
void sendIsl_SessionEvent(const SessionEvent &item, int serverId=-1, qint64 sessionId=-1)
Definition server.cpp:647
virtual bool permitCreateGameAsJudge() const
Definition server.h:179
Server_DatabaseInterface * getDatabaseInterface() const
Definition server.cpp:72
virtual int getMaxMessageCountPerInterval() const
Definition server.h:151
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:220
virtual int getIdleClientTimeout() const
Definition server.h:131
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:220
void externalGameCommandContainerReceived(const CommandContainer &cont, int playerId, int serverId, qint64 sessionId)
Definition server.cpp:497
QMap< qint64, Server_ProtocolHandler * > usersBySessionId
Definition server.h:246
virtual int getMaxMessageSizePerInterval() const
Definition server.h:155
virtual bool getRegOnlyServerEnabled() const
Definition server.h:115
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:107
~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:208
void externalRoomGameListChanged(int roomId, const ServerInfo_Game &gameInfo)
Definition server.cpp:449
virtual bool getStoreReplaysEnabled() const
Definition server.h:127
static constexpr int amount
Definition deck_hash_performance_test.cpp:5
AuthenticationResult
Definition server.h:32
@ UserIsInactive
Definition server.h:40
@ PasswordChangeRequired
Definition server.h:42
@ 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
Definition commands.proto:7
Definition room_commands.proto:71
Definition game_event_container.proto:4
Definition game_replay.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:5
Definition serverinfo_user.proto:2
Definition session_event.proto:2