#ifndef YC_LIB_ROOM_H #define YC_LIB_ROOM_H #include #include #include #include #include #include #include #include #include "chat_user.h" namespace Yc { namespace Lib { class Server; class Room: public Base, public std::enable_shared_from_this { public: enum RoomType { none = 0, dice = 1, poker = 2, rounds = 4, password = 8 }; Room(std::shared_ptr parent, Json::Value roomParams); ~Room(); void run(); std::string name(); bool addUser(std::string userName, std::string color, std::string password, int socket); bool addUser(std::shared_ptr user, std::string password); bool userNameExists(std::string userName); void removeUser(std::string _token, bool silent = false); void removeUser(std::shared_ptr user, bool silent = false); void setStop(); void addMessage(ChatUser::MsgType type, const char* messageText, std::string userName = "", std::string color = ""); void addMessage(ChatUser::MsgType type, std::string messageText, std::string userName = "", std::string color = ""); void addMessage(ChatUser::MsgType type, Json::Value messageText, std::string userName = "", std::string color = ""); RoomType type(); bool isType(RoomType type); bool canDice(); unsigned int addDice(std::shared_ptr user, int diceValue); bool accessAllowed(std::string userName, std::string password); bool userIsInRoom(std::string userName); void addUserWhenQueueEmpty(std::shared_ptr user); bool userToNewRoom(std::shared_ptr user, std::string newRoom, std::string password); unsigned int flags(); Json::Value userList(); private: struct Message { ChatUser::MsgType type; std::string messageTr; std::string userName; std::string color; }; std::shared_ptr _parent; std::string _name; std::string _password; std::vector _allowedUsers; RoomType _type; std::vector> _users; bool _blocked; bool _stop; std::queue _msgQueue; std::unique_ptr thread; bool _roundRunning; time_t _roundStart; time_t _lastRoundEnd; int _roundLength; std::vector, int>> _diceValues; void _handleDice(); void _startDiceRound(); void _endDiceRound(); void _initRound(); void _showDiceRoundResults(); }; } // namespace Lib } // namespace Yc #endif // YC_LIB_ROOM_H