Cockatrice 2025-11-30-Development-2.11.0-beta.38
A cross-platform 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);
67
68 const QMap<int, Server_Room *> &getRooms()
69 {
70 return rooms;
71 }
72
73 Server_AbstractUserInterface *findUser(const QString &userName) const;
74 const QMap<QString, Server_ProtocolHandler *> &getUsers() const
75 {
76 return users;
77 }
78 const QMap<qint64, Server_ProtocolHandler *> &getUsersBySessionId() const
79 {
80 return usersBySessionId;
81 }
82 virtual QMap<QString, bool> getServerRequiredFeatureList() const
83 {
84 return QMap<QString, bool>();
85 }
88 QList<QString> getOnlineModeratorList() const;
89 virtual QString getLoginMessage() const
90 {
91 return QString();
92 }
93 virtual QString getRequiredFeatures() const
94 {
95 return QString();
96 }
97 virtual bool permitUnregisteredUsers() const
98 {
99 return true;
100 }
101 virtual bool getGameShouldPing() const
102 {
103 return false;
104 }
105 virtual bool getClientIDRequiredEnabled() const
106 {
107 return false;
108 }
109 virtual bool getRegOnlyServerEnabled() const
110 {
111 return false;
112 }
113 virtual bool getMaxUserLimitEnabled() const
114 {
115 return false;
116 }
117 virtual bool getEnableLogQuery() const
118 {
119 return false;
120 }
121 virtual bool getStoreReplaysEnabled() const
122 {
123 return true;
124 }
125 virtual int getIdleClientTimeout() const
126 {
127 return 0;
128 }
129 virtual int getClientKeepAlive() const
130 {
131 return 0;
132 }
133 virtual int getMaxGameInactivityTime() const
134 {
135 return 9999999;
136 }
137 virtual int getMaxPlayerInactivityTime() const
138 {
139 return 9999999;
140 }
141 virtual int getMessageCountingInterval() const
142 {
143 return 0;
144 }
146 {
147 return 0;
148 }
150 {
151 return 0;
152 }
153 virtual int getMaxGamesPerUser() const
154 {
155 return -1;
156 }
157 virtual int getCommandCountingInterval() const
158 {
159 return 0;
160 }
162 {
163 return 0;
164 }
165 virtual int getMaxUserTotal() const
166 {
167 return 9999999;
168 }
169 virtual int getServerID() const
170 {
171 return 0;
172 }
173 virtual bool permitCreateGameAsJudge() const
174 {
175 return false;
176 }
177
180 {
181 QMutexLocker locker(&nextLocalGameIdMutex);
182 return ++nextLocalGameId;
183 }
184
185 void sendIsl_Response(const Response &item, int serverId = -1, qint64 sessionId = -1);
186 void sendIsl_SessionEvent(const SessionEvent &item, int serverId = -1, qint64 sessionId = -1);
187 void sendIsl_GameEventContainer(const GameEventContainer &item, int serverId = -1, qint64 sessionId = -1);
188 void sendIsl_RoomEvent(const RoomEvent &item, int serverId = -1, qint64 sessionId = -1);
189 void sendIsl_GameCommand(const CommandContainer &item, int serverId, qint64 sessionId, int roomId, int playerId);
190 void sendIsl_RoomCommand(const CommandContainer &item, int serverId, qint64 sessionId, int roomId);
191
192 const QMap<QString, Server_AbstractUserInterface *> &getExternalUsers() const
193 {
194 return externalUsers;
195 }
196
197 void addPersistentPlayer(const QString &userName, int roomId, int gameId, int playerId);
198 void removePersistentPlayer(const QString &userName, int roomId, int gameId, int playerId);
199 QList<PlayerReference> getPersistentPlayerReferences(const QString &userName) const;
200 int getUsersCount() const;
201 int getGamesCount() const;
202 int getTCPUserCount() const
203 {
204 return tcpUserCount;
205 }
207 {
208 return webSocketUserCount;
209 }
210
211private:
212 QMultiMap<QString, PlayerReference> persistentPlayers;
213 mutable QReadWriteLock persistentPlayersLock;
216
217protected slots:
218 void externalUserJoined(const ServerInfo_User &userInfo);
219 void externalUserLeft(const QString &userName);
220 void externalRoomUserJoined(int roomId, const ServerInfo_User &userInfo);
221 void externalRoomUserLeft(int roomId, const QString &userName);
222 void externalRoomSay(int roomId, const QString &userName, const QString &message);
223 void externalRoomRemoveMessages(int roomId, const QString &userName, int amount);
224 void externalRoomGameListChanged(int roomId, const ServerInfo_Game &gameInfo);
225 void
226 externalJoinGameCommandReceived(const Command_JoinGame &cmd, int cmdId, int roomId, int serverId, qint64 sessionId);
227 void
228 externalGameCommandContainerReceived(const CommandContainer &cont, int playerId, int serverId, qint64 sessionId);
229 void externalGameEventContainerReceived(const GameEventContainer &cont, qint64 sessionId);
230 void externalResponseReceived(const Response &resp, qint64 sessionId);
231
232 virtual void doSendIslMessage(const IslMessage & /* msg */, int /* serverId */)
233 {
234 }
235
236protected:
237 void prepareDestroy();
238 void setDatabaseInterface(Server_DatabaseInterface *_databaseInterface);
239 QList<Server_ProtocolHandler *> clients;
240 QMap<qint64, Server_ProtocolHandler *> usersBySessionId;
241 QMap<QString, Server_ProtocolHandler *> users;
242 QMap<qint64, Server_AbstractUserInterface *> externalUsersBySessionId;
243 QMap<QString, Server_AbstractUserInterface *> externalUsers;
244 QMap<int, Server_Room *> rooms;
245 QMap<QThread *, Server_DatabaseInterface *> databaseInterfaces;
246 void addRoom(Server_Room *newRoom);
247};
248
249#endif
Represents a complete deck, including metadata, zones, cards, and sideboard plans.
Definition deck_list.h:127
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:571
virtual bool getMaxUserLimitEnabled() const
Definition server.h:113
void externalRoomSay(int roomId, const QString &userName, const QString &message)
Definition server.cpp:379
void removeClient(Server_ProtocolHandler *player)
Definition server.cpp:227
virtual bool getClientIDRequiredEnabled() const
Definition server.h:105
const QMap< QString, Server_ProtocolHandler * > & getUsers() const
Definition server.h:74
virtual QMap< QString, bool > getServerRequiredFeatureList() const
Definition server.h:82
QReadWriteLock persistentPlayersLock
Definition server.h:213
void externalUserJoined(const ServerInfo_User &userInfo)
Definition server.cpp:283
virtual int getMaxGameInactivityTime() const
Definition server.h:133
virtual bool permitUnregisteredUsers() const
Definition server.h:97
QMap< qint64, Server_AbstractUserInterface * > externalUsersBySessionId
Definition server.h:242
void addPersistentPlayer(const QString &userName, int roomId, int gameId, int playerId)
Definition server.cpp:186
void externalUserLeft(const QString &userName)
Definition server.cpp:307
virtual int getMaxGamesPerUser() const
Definition server.h:153
void broadcastRoomUpdate(const ServerInfo_Room &roomInfo, bool sendToIsl=false)
Definition server.cpp:540
virtual QString getRequiredFeatures() const
Definition server.h:93
virtual bool getEnableLogQuery() const
Definition server.h:117
QMultiMap< QString, PlayerReference > persistentPlayers
Definition server.h:212
const QMap< int, Server_Room * > & getRooms()
Definition server.h:68
virtual int getMaxPlayerInactivityTime() const
Definition server.h:137
void removePersistentPlayer(const QString &userName, int roomId, int gameId, int playerId)
Definition server.cpp:192
virtual QString getLoginMessage() const
Definition server.h:89
void prepareDestroy()
Definition server.cpp:55
virtual void doSendIslMessage(const IslMessage &, int)
Definition server.h:232
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:76
void externalRoomRemoveMessages(int roomId, const QString &userName, int amount)
Definition server.cpp:395
void externalRoomUserJoined(int roomId, const ServerInfo_User &userInfo)
Definition server.cpp:353
QMap< QString, Server_AbstractUserInterface * > externalUsers
Definition server.h:243
int getWebSocketUserCount() const
Definition server.h:206
virtual int getMaxUserTotal() const
Definition server.h:165
void externalJoinGameCommandReceived(const Command_JoinGame &cmd, int cmdId, int roomId, int serverId, qint64 sessionId)
Definition server.cpp:421
void addRoom(Server_Room *newRoom)
Definition server.cpp:561
QReadWriteLock roomsLock
Definition server.h:55
int nextLocalGameId
Definition server.h:214
virtual int getMaxCommandCountPerInterval() const
Definition server.h:161
const QMap< qint64, Server_ProtocolHandler * > & getUsersBySessionId() const
Definition server.h:78
void sendIsl_RoomCommand(const CommandContainer &item, int serverId, qint64 sessionId, int roomId)
Definition server.cpp:648
void addClient(Server_ProtocolHandler *player)
Definition server.cpp:215
QMap< int, Server_Room * > rooms
Definition server.h:244
virtual int getServerID() const
Definition server.h:169
virtual int getCommandCountingInterval() const
Definition server.h:157
Server_AbstractUserInterface * findUser(const QString &userName) const
Definition server.cpp:204
void sigSendIslMessage(const IslMessage &message, int serverId)
QReadWriteLock clientsLock
Definition server.h:55
virtual int getMessageCountingInterval() const
Definition server.h:141
void externalResponseReceived(const Response &resp, qint64 sessionId)
Definition server.cpp:526
Server(QObject *parent=nullptr)
Definition server.cpp:40
QMap< QThread *, Server_DatabaseInterface * > databaseInterfaces
Definition server.h:245
QList< Server_ProtocolHandler * > clients
Definition server.h:239
QMutex nextLocalGameIdMutex
Definition server.h:215
void externalRoomUserLeft(int roomId, const QString &userName)
Definition server.cpp:366
virtual int getClientKeepAlive() const
Definition server.h:129
void endSession(qint64 sessionId)
int getNextLocalGameId()
Definition server.h:179
const QMap< QString, Server_AbstractUserInterface * > & getExternalUsers() const
Definition server.h:192
QMap< QString, Server_ProtocolHandler * > users
Definition server.h:241
void sendIsl_SessionEvent(const SessionEvent &item, int serverId=-1, qint64 sessionId=-1)
Definition server.cpp:601
virtual bool permitCreateGameAsJudge() const
Definition server.h:173
Server_DatabaseInterface * getDatabaseInterface() const
Definition server.cpp:71
virtual int getMaxMessageCountPerInterval() const
Definition server.h:145
void sendIsl_GameEventContainer(const GameEventContainer &item, int serverId=-1, qint64 sessionId=-1)
Definition server.cpp:612
void sendIsl_GameCommand(const CommandContainer &item, int serverId, qint64 sessionId, int roomId, int playerId)
Definition server.cpp:634
int tcpUserCount
Definition server.h:214
virtual int getIdleClientTimeout() const
Definition server.h:125
void externalGameEventContainerReceived(const GameEventContainer &cont, qint64 sessionId)
Definition server.cpp:512
void sendIsl_Response(const Response &item, int serverId=-1, qint64 sessionId=-1)
Definition server.cpp:590
int webSocketUserCount
Definition server.h:214
void externalGameCommandContainerReceived(const CommandContainer &cont, int playerId, int serverId, qint64 sessionId)
Definition server.cpp:456
QMap< qint64, Server_ProtocolHandler * > usersBySessionId
Definition server.h:240
virtual int getMaxMessageSizePerInterval() const
Definition server.h:149
virtual bool getRegOnlyServerEnabled() const
Definition server.h:109
QList< QString > getOnlineModeratorList() const
Definition server.cpp:268
int getGamesCount() const
Definition server.cpp:577
virtual bool getGameShouldPing() const
Definition server.h:101
~Server() override=default
QList< PlayerReference > getPersistentPlayerReferences(const QString &userName) const
Definition server.cpp:198
void setDatabaseInterface(Server_DatabaseInterface *_databaseInterface)
Definition server.cpp:65
void pingClockTimeout()
void sendIsl_RoomEvent(const RoomEvent &item, int serverId=-1, qint64 sessionId=-1)
Definition server.cpp:623
int getTCPUserCount() const
Definition server.h:202
void externalRoomGameListChanged(int roomId, const ServerInfo_Game &gameInfo)
Definition server.cpp:408
virtual bool getStoreReplaysEnabled() const
Definition server.h:121
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