1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-14 10:12:59 +02:00
vcmi/lobby/LobbyServer.h

93 lines
4.1 KiB
C++
Raw Normal View History

/*
* LobbyServer.h, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/
#pragma once
2024-01-12 01:10:41 +02:00
#include "../lib/network/NetworkInterface.h"
2024-01-11 22:51:36 +02:00
#include "LobbyDefines.h"
VCMI_LIB_NAMESPACE_BEGIN
class JsonNode;
VCMI_LIB_NAMESPACE_END
class LobbyDatabase;
2024-02-02 00:29:15 +02:00
class LobbyServer final : public INetworkServerListener
{
struct AwaitingProxyState
{
std::string accountID;
std::string roomID;
2024-02-02 00:29:15 +02:00
NetworkConnectionWeakPtr accountConnection;
NetworkConnectionWeakPtr roomConnection;
};
/// list of connected proxies. All messages received from (key) will be redirected to (value) connection
2024-02-02 00:29:15 +02:00
std::map<NetworkConnectionPtr, NetworkConnectionWeakPtr> activeProxies;
/// list of half-established proxies from server that are still waiting for client to connect
std::vector<AwaitingProxyState> awaitingProxies;
/// list of logged in accounts (vcmiclient's)
2024-02-02 00:29:15 +02:00
std::map<NetworkConnectionPtr, std::string> activeAccounts;
/// list of currently logged in game rooms (vcmiserver's)
2024-02-02 00:29:15 +02:00
std::map<NetworkConnectionPtr, std::string> activeGameRooms;
std::unique_ptr<LobbyDatabase> database;
2024-01-12 01:10:41 +02:00
std::unique_ptr<INetworkHandler> networkHandler;
std::unique_ptr<INetworkServer> networkServer;
std::string sanitizeChatMessage(const std::string & inputString) const;
2024-01-26 17:40:31 +02:00
bool isAccountNameValid(const std::string & accountName) const;
2024-01-26 17:40:31 +02:00
NetworkConnectionPtr findAccount(const std::string & accountID) const;
NetworkConnectionPtr findGameRoom(const std::string & gameRoomID) const;
void onNewConnection(const NetworkConnectionPtr & connection) override;
2024-02-02 01:27:19 +02:00
void onDisconnected(const NetworkConnectionPtr & connection, const std::string & errorMessage) override;
void onPacketReceived(const NetworkConnectionPtr & connection, const std::vector<std::byte> & message) override;
void sendMessage(const NetworkConnectionPtr & target, const JsonNode & json);
void broadcastActiveAccounts();
void broadcastActiveGameRooms();
JsonNode prepareActiveGameRooms();
2024-01-26 17:40:31 +02:00
void sendChatMessage(const NetworkConnectionPtr & target, const std::string & roomMode, const std::string & roomName, const std::string & accountID, const std::string & displayName, const std::string & messageText);
void sendAccountCreated(const NetworkConnectionPtr & target, const std::string & accountID, const std::string & accountCookie);
2024-02-02 00:12:30 +02:00
void sendOperationFailed(const NetworkConnectionPtr & target, const std::string & reason);
void sendLoginSuccess(const NetworkConnectionPtr & target, const std::string & accountCookie, const std::string & displayName);
void sendChatHistory(const NetworkConnectionPtr & target, const std::vector<LobbyChatMessage> &);
void sendAccountJoinsRoom(const NetworkConnectionPtr & target, const std::string & accountID);
void sendJoinRoomSuccess(const NetworkConnectionPtr & target, const std::string & gameRoomID, bool proxyMode);
void sendInviteReceived(const NetworkConnectionPtr & target, const std::string & accountID, const std::string & gameRoomID);
void receiveClientRegister(const NetworkConnectionPtr & connection, const JsonNode & json);
void receiveClientLogin(const NetworkConnectionPtr & connection, const JsonNode & json);
void receiveServerLogin(const NetworkConnectionPtr & connection, const JsonNode & json);
void receiveClientProxyLogin(const NetworkConnectionPtr & connection, const JsonNode & json);
void receiveServerProxyLogin(const NetworkConnectionPtr & connection, const JsonNode & json);
2023-12-27 14:24:49 +02:00
void receiveSendChatMessage(const NetworkConnectionPtr & connection, const JsonNode & json);
void receiveOpenGameRoom(const NetworkConnectionPtr & connection, const JsonNode & json);
void receiveJoinGameRoom(const NetworkConnectionPtr & connection, const JsonNode & json);
void receiveLeaveGameRoom(const NetworkConnectionPtr & connection, const JsonNode & json);
void receiveSendInvite(const NetworkConnectionPtr & connection, const JsonNode & json);
void receiveDeclineInvite(const NetworkConnectionPtr & connection, const JsonNode & json);
public:
explicit LobbyServer(const boost::filesystem::path & databasePath);
~LobbyServer();
void start(uint16_t port);
void run();
};