#pragma once #include "V8Tree/Service.h" #include "V8DataModel/PartInstance.h" namespace RBX { extern const char *const sBadgeService; class BadgeService : public DescribedCreatable , public Service { private: std::string awardBadgeUrl; std::string hasBadgeUrl; std::string isBadgeDisabledUrl; std::string isBadgeLegalUrl; int placeId; int cooldownTime; boost::recursive_mutex badgeAwardSync; std::map > badgeAwardCache; boost::recursive_mutex badgeQuerySync; std::map > badgeQueryCache; boost::recursive_mutex badgeIsDisabledSync; std::map badgeIsDisabledCache; boost::recursive_mutex badgeIsLegalSync; std::map badgeIsLegalCache; struct HotUserHasBadge { int userId; int badgeId; RBX::Time expiration; HotUserHasBadge(int userId, int badgeId, int cooldownTime); bool expired() const; }; std::list hotBadges; bool isHasBadgeHot(int userId, int badgeId); public: BadgeService(); ~BadgeService() {} rbx::remote_signal badgeAwardedSignal; void userHasBadge(int userId, int badgeId, boost::function resumeFunction, boost::function errorFunction); void awardBadge(int userId, int badgeId, boost::function resumeFunction, boost::function errorFunction); void isDisabled(int badgeId, boost::function resumeFunction, boost::function errorFunction); void isLegal(int badgeId, boost::function resumeFunction, boost::function errorFunction); void setPlaceId(int placeId); void setHasBadgeCooldown(int seconds); void setAwardBadgeUrl(std::string); void setHasBadgeUrl(std::string); void setIsBadgeDisabledUrl(std::string); void setIsBadgeLegalUrl(std::string); private: static void hasBadgeResultHelper(weak_ptr, int userId, int badgeId, std::string* response, std::exception* err, boost::function resumeFunction, boost::function errorFunction); void hasBadgeResult(int userId, int badgeId, std::string* response, std::exception* err, boost::function resumeFunction, boost::function errorFunction); static void awardBadgeResultHelper(weak_ptr, int userId, int badgeId, std::string* response, std::exception* err, boost::function resumeFunction, boost::function errorFunction); void awardBadgeResult(int userId, int badgeId, std::string* response, std::exception* err, boost::function resumeFunction, boost::function errorFunction); static void isDiabledResultHelper(weak_ptr, int badgeId, std::string* response, std::exception* err, boost::function resumeFunction, boost::function errorFunction); void isDisabledResult(int badgeId, std::string* response, std::exception* err, boost::function resumeFunction, boost::function errorFunction); static void isLegalResultHelper(weak_ptr, int badgeId, std::string* response, std::exception* err, boost::function resumeFunction, boost::function errorFunction); void isLegalResult(int badgeId, std::string* response, std::exception* err, boost::function resumeFunction, boost::function errorFunction); }; }