#pragma once #include "utils.hpp" #include "types.hpp" #include "StringView.hpp" #include "User.hpp" #include #include #include #include #include namespace dchat { struct RoomMessage { odhtdb::Hash id; std::shared_ptr creator; uint32_t timestampSeconds; std::string text; }; class Rooms; class Room { DISABLE_COPY(Room) public: Room(Rooms *rooms, std::shared_ptr id, std::shared_ptr encryptionKey); std::shared_ptr addUser(const odhtdb::Signature::PublicKey &userPublicKey, const odhtdb::DataView groupId); // Returns null if user doesn't exist in room std::shared_ptr getUserByPublicKey(const odhtdb::Signature::PublicKey &userPublicKey); void publishMessage(const std::string &msg); Rooms *rooms; std::shared_ptr id; std::shared_ptr encryptionKey; std::string name; odhtdb::Signature::MapPublicKey> userByPublicKey; std::vector messages; std::shared_ptr localUser; // Used for local users odhtdb::Signature::MapPublicKey> publicKeyToKeyPairMap; void *userdata; }; struct RoomAddMessageRequest { std::shared_ptr room; bool loadedFromCache; RoomMessage message; }; struct UserChangeNicknameRequest { std::shared_ptr room; std::shared_ptr user; uint32_t timestampSeconds; bool loadedFromCache; std::string newNickname; }; struct RoomChangeNameRequest { std::shared_ptr room; std::shared_ptr user; uint32_t timestampSeconds; bool loadedFromCache; std::string newName; }; // if connection failed then @rooms is null and errMsg contains the error using ConnectBoostrapNodeCallbackFunc = std::function rooms, const char *errMsg)>; using CreateRoomCallbackFunc = std::function room)>; using RoomAddUserCallbackFunc = std::function room, std::shared_ptr user)>; using RoomAddMessageCallbackFunc = std::function; using UserChangeNicknameCallbackFunc = std::function; using ChangeRoomNameCallbackFunc = std::function; struct RoomCallbackFuncs { ConnectBoostrapNodeCallbackFunc connectCallbackFunc; CreateRoomCallbackFunc createRoomCallbackFunc; RoomAddUserCallbackFunc addUserCallbackFunc; RoomAddMessageCallbackFunc addMessageCallbackFunc; UserChangeNicknameCallbackFunc userChangeNicknameCallbackFunc; ChangeRoomNameCallbackFunc changeRoomNameCallbackFunc; }; class Rooms { DISABLE_COPY(Rooms) public: // @callbackFuncs.connectCallbackFunc can't be null static void connect(const char *address, u16 port, RoomCallbackFuncs callbackFuncs); // Throws on failure void loginUser(const std::string &username, const std::string &password); // Throws on failure void registerUser(const std::string &username, const std::string &password); // Throws on failure void createRoom(const std::string &name); std::shared_ptr database; private: Rooms(const char *address, u16 port, RoomCallbackFuncs callbackFuncs); void createNodeCallbackFunc(const odhtdb::DatabaseCreateNodeRequest &request); void addNodeCallbackFunc(const odhtdb::DatabaseAddNodeRequest &request); void addUserCallbackFunc(const odhtdb::DatabaseAddUserRequest &request); private: odhtdb::MapHash> roomById; RoomCallbackFuncs callbackFuncs; bool loggedIn; odhtdb::MapHash> roomLocalUser; odhtdb::MapHash> roomEncryptionKey; std::string currentUsername; std::string currentUserPassword; }; }