// SPDX-FileCopyrightText: 2025 Contributors to Chatterino // // SPDX-License-Identifier: MIT #pragma once #include "common/Aliases.hpp" #include #include namespace chatterino { struct Emote; using EmotePtr = std::shared_ptr; class BadgeRegistry { public: virtual ~BadgeRegistry() = default; /// Return the badge, if any, that is assigned to the user std::optional getBadge(const UserId &id) const; /// Assign the given badge to the user void assignBadgeToUser(const QString &badgeID, const UserId &userID); /// Remove the given badge from the user void clearBadgeFromUser(const QString &badgeID, const UserId &userID); /// Register a new known badge /// The json object will contain all information about the badge, like its ID & its images /// @returns The badge's ID QString registerBadge(const QJsonObject &badgeJson); protected: BadgeRegistry() = default; virtual QString idForBadge(const QJsonObject &badgeJson) const = 0; virtual EmotePtr createBadge(const QString &id, const QJsonObject &badgeJson) const = 0; private: /// Mutex for both `badgeMap_` and `knownBadges_` mutable std::shared_mutex mutex_; /// user-id => badge std::unordered_map badgeMap_; /// badge-id => badge std::unordered_map knownBadges_; }; } // namespace chatterino