123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- /*
- * 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
- #include "../lib/network/NetworkInterface.h"
- #include "LobbyDefines.h"
- VCMI_LIB_NAMESPACE_BEGIN
- class JsonNode;
- VCMI_LIB_NAMESPACE_END
- class LobbyDatabase;
- class LobbyServer final : public INetworkServerListener
- {
- struct AwaitingProxyState
- {
- std::string accountID;
- std::string roomID;
- NetworkConnectionWeakPtr accountConnection;
- NetworkConnectionWeakPtr roomConnection;
- };
- /// list of connected proxies. All messages received from (key) will be redirected to (value) connection
- std::map<NetworkConnectionPtr, NetworkConnectionPtr> 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)
- std::map<NetworkConnectionPtr, std::string> activeAccounts;
- /// list of currently logged in game rooms (vcmiserver's)
- std::map<NetworkConnectionPtr, std::string> activeGameRooms;
- std::unique_ptr<LobbyDatabase> database;
- std::unique_ptr<INetworkHandler> networkHandler;
- std::unique_ptr<INetworkServer> networkServer;
- /// removes any "weird" symbols from chat message that might break UI
- std::string sanitizeChatMessage(const std::string & inputString) const;
- bool isAccountNameValid(const std::string & accountName) const;
- NetworkConnectionPtr findAccount(const std::string & accountID) const;
- NetworkConnectionPtr findGameRoom(const std::string & gameRoomID) const;
- void onNewConnection(const NetworkConnectionPtr & connection) override;
- 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();
- /// Attempts to load json from incoming byte stream and validate it
- /// Returns parsed json on success or empty json node on failure
- JsonNode parseAndValidateMessage(const std::vector<std::byte> & message) const;
- void sendChatMessage(const NetworkConnectionPtr & target, const std::string & channelType, const std::string & channelName, 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);
- void sendOperationFailed(const NetworkConnectionPtr & target, const std::string & reason);
- void sendServerLoginSuccess(const NetworkConnectionPtr & target, const std::string & accountCookie);
- void sendClientLoginSuccess(const NetworkConnectionPtr & target, const std::string & accountCookie, const std::string & displayName);
- void sendFullChatHistory(const NetworkConnectionPtr & target, const std::string & channelType, const std::string & channelName, const std::string & channelNameForClient);
- void sendRecentChatHistory(const NetworkConnectionPtr & target, const std::string & channelType, const std::string & channelName);
- void sendChatHistory(const NetworkConnectionPtr & target, const std::string & channelType, const std::string & channelName, const std::vector<LobbyChatMessage> & history);
- 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 sendMatchesHistory(const NetworkConnectionPtr & target);
- 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);
- void receiveSendChatMessage(const NetworkConnectionPtr & connection, const JsonNode & json);
- void receiveRequestChatHistory(const NetworkConnectionPtr & connection, const JsonNode & json);
- void receiveActivateGameRoom(const NetworkConnectionPtr & connection, const JsonNode & json);
- void receiveJoinGameRoom(const NetworkConnectionPtr & connection, const JsonNode & json);
- void receiveLeaveGameRoom(const NetworkConnectionPtr & connection, const JsonNode & json);
- void receiveChangeRoomDescription(const NetworkConnectionPtr & connection, const JsonNode & json);
- void receiveGameStarted(const NetworkConnectionPtr & connection, const JsonNode & json);
- void receiveSendInvite(const NetworkConnectionPtr & connection, const JsonNode & json);
- public:
- explicit LobbyServer(const boost::filesystem::path & databasePath);
- ~LobbyServer();
- void start(uint16_t port);
- void run();
- };
|