#pragma once #include "Variable.h" #include #include #include #include #include #include #include "../TSServer.h" #include "../Group.h" #define DEBUG_PERMISSION namespace ts { namespace music { class MusicBotManager; } namespace server { class TSServer; class DataClient { friend class TSServer; friend class QueryServer; friend class music::MusicBotManager; public: struct PropertyWrapper { std::shared_ptr handle; Properties* operator->() { return handle.get(); } const Properties* operator->() const { return handle.get(); } template std::result_of_t operator->*(F &&f) { return std::forward(f)(*handle); } template std::result_of_t operator->*(F &&f) const { return std::forward(f)(*handle); } template ts::PropertyWrapper operator[](T type) { return (*handle)[type]; } }; DataClient(sql::SqlManager*, const std::shared_ptr&); virtual ~DataClient(); PropertyWrapper properties(){ return { this->_properties }; } virtual std::deque> permissionValues(permission::PermissionTestType test, const std::deque&, const std::shared_ptr& channel = nullptr, std::shared_ptr cache = nullptr, std::shared_ptr server = nullptr, bool server_defined = false); inline permission::PermissionValue permissionValue(permission::PermissionType type, const std::shared_ptr& targetChannel = nullptr) { return this->permissionValue(permission::PERMTEST_ORDERED, type, targetChannel); } virtual permission::PermissionValue permissionValue(permission::PermissionTestType test, permission::PermissionType, const std::shared_ptr& channel = nullptr, std::shared_ptr cache = nullptr, std::shared_ptr server = nullptr, bool server_defined = false); virtual bool permissionGranted(permission::PermissionTestType test, permission::PermissionType, permission::PermissionValue, const std::shared_ptr& channel = nullptr, bool required = true, std::shared_ptr cache = nullptr, std::shared_ptr server = nullptr, bool server_defined = false); inline permission::PermissionValue getPermissionGrantValue(permission::PermissionType type, const std::shared_ptr& targetChannel = nullptr) { return this->getPermissionGrantValue(permission::PERMTEST_ORDERED, type, targetChannel); } virtual permission::PermissionValue getPermissionGrantValue(permission::PermissionTestType test, permission::PermissionType, const std::shared_ptr& targetChannel = nullptr); virtual bool permissionGrantGranted(permission::PermissionTestType test, permission::PermissionType, permission::PermissionValue, const std::shared_ptr& targetChannel = nullptr, bool required = true); template inline bool permission_granted(T, permission::PermissionValue, bool = false) = delete; /* only permission values */ [[deprecated]] __always_inline bool permission_granted(ts::permission::PermissionValue value, ts::permission::PermissionValue required, bool enforce_required = true) { return DataClient::permission_granted({value, value != permNotGranted}, required, enforce_required); } static inline bool permission_granted(ts::permission::v2::PermissionFlaggedValue value, ts::permission::PermissionValue required, bool enforce_required = true) { if(required == permNotGranted || required == 0) { if(enforce_required) return value.value == -1 || value.value > 0; else return true; } else if(!value.has_value) { return false; } else { if(value.value == -1) return true; else if(value.value >= required) return true; } return false; } virtual std::vector> assignedServerGroups(); virtual std::shared_ptr assignedChannelGroup(const std::shared_ptr &); virtual bool serverGroupAssigned(const std::shared_ptr &); virtual bool channelGroupAssigned(const std::shared_ptr &, const std::shared_ptr &); virtual std::string getDisplayName() { return this->properties()[property::CLIENT_NICKNAME]; } virtual std::string getLoginName() { return this->properties()[property::CLIENT_LOGIN_NAME]; } virtual void setDisplayName(std::string displayName) { this->properties()[property::CLIENT_NICKNAME] = displayName; } virtual ClientType getExternalType(){ uint8_t type = this->properties()[property::CLIENT_TYPE]; return (ClientType) type; } virtual ClientType getType(){ uint8_t type = this->properties()[property::CLIENT_TYPE_EXACT]; return (ClientType) type; } virtual std::string getUid() { return this->properties()[property::CLIENT_UNIQUE_IDENTIFIER]; } virtual std::string getAvatarId(); virtual ClientDbId getClientDatabaseId() { return this->properties()[property::CLIENT_DATABASE_ID]; } virtual bool loadDataForCurrentServer(); protected: sql::SqlManager* sql; std::shared_ptr server; std::shared_ptr clientPermissions = nullptr; std::shared_ptr _properties; }; } }