#include "stdafx.h" #include "V8DataModel/PersonalServerService.h" #include "Util/LuaWebService.h" #include "Network/Players.h" namespace RBX { const char* const sPersonalServerService = "PersonalServerService"; REFLECTION_BEGIN(); static Reflection::BoundFuncDesc func_SetPersonalServerGetRankUrl(&PersonalServerService::setPersonalServerGetRankUrl, "SetPersonalServerGetRankUrl", "personalServerGetRankUrl", Security::LocalUser); static Reflection::BoundFuncDesc func_SetPersonalServerSetRankUrl(&PersonalServerService::setPersonalServerSetRankUrl, "SetPersonalServerSetRankUrl", "personalServerSetRankUrl", Security::LocalUser); static Reflection::BoundFuncDesc func_SetPersonalServerBuildToolsUrl(&PersonalServerService::setPersonalServerRoleSetsUrl, "SetPersonalServerRoleSetsUrl", "personalServerRoleSetsUrl", Security::LocalUser); static Reflection::BoundFuncDesc)> func_Promote(&PersonalServerService::promote, "Promote", "player", Security::RobloxScript); static Reflection::BoundFuncDesc)> func_Demote(&PersonalServerService::demote, "Demote", "player", Security::RobloxScript); static Reflection::BoundYieldFuncDesc func_GetRoleSets(&PersonalServerService::getWebRoleSets, "GetRoleSets", "placeId", Security::RobloxScript); static Reflection::PropDescriptor prop_roleSets("RoleSets", category_Behavior, &PersonalServerService::getRoleSets, &PersonalServerService::setRoleSets, Reflection::PropertyDescriptor::SCRIPTING, Security::RobloxScript); REFLECTION_END(); namespace Reflection { template<> EnumDesc::EnumDesc() :EnumDescriptor("PrivilegeType") { addPair(PersonalServerService::PRIVILEGE_OWNER, "Owner"); addPair(PersonalServerService::PRIVILEGE_ADMIN, "Admin"); addPair(PersonalServerService::PRIVILEGE_MEMBER, "Member"); addPair(PersonalServerService::PRIVILEGE_VISITOR, "Visitor"); addPair(PersonalServerService::PRIVILEGE_BANNED, "Banned"); } template<> PersonalServerService::PrivilegeType& Variant::convert(void) { return genericConvert(); } }//namespace Reflection template<> bool StringConverter::convertToValue(const std::string& text, PersonalServerService::PrivilegeType& value) { return Reflection::EnumDesc::singleton().convertToValue(text.c_str(),value); } PersonalServerService::PersonalServerService(void) : personalServerGetRankUrl("") , personalServerSetRankUrl("") , personalServerRoleSetsUrl("") , roleSets("") { Instance::propArchivable.setValue(this, false); } void PersonalServerService::setPersonalServerGetRankUrl(std::string url) { personalServerGetRankUrl = url; } void PersonalServerService::setPersonalServerSetRankUrl(std::string url) { personalServerSetRankUrl = url; } void PersonalServerService::setPersonalServerRoleSetsUrl(std::string url) { personalServerRoleSetsUrl = url; } template void PersonalServerService::dispatchRequest(const std::string& url, boost::function resumeFunction, boost::function errorFunction) { if(LuaWebService* luaWebService = ServiceProvider::create(this)) { try { luaWebService->asyncRequest(url, LUA_WEB_SERVICE_STANDARD_PRIORITY, resumeFunction, errorFunction); } catch(RBX::base_exception&) { errorFunction("Error during dispatch"); } } else { errorFunction("Shutting down"); } } void PersonalServerService::getWebRoleSets(int placeId, boost::function resumeFunction, boost::function errorFunction) { if(personalServerRoleSetsUrl.empty()) errorFunction("No personalServerRoleSetsUrl set"); else if(!Network::Players::backendProcessing(this)) errorFunction("getWebRoleSets should only be called from gameserver"); else { std::string url(RBX::format(personalServerRoleSetsUrl.c_str(), placeId)); dispatchRequest(url, resumeFunction, errorFunction); } } void PersonalServerService::moveToRank(Network::Player* player, int rank) { player->setPersonalServerRank(rank); } void PersonalServerService::getRank(Network::Player* player, int placeId, boost::function resumeFunction, boost::function errorFunction) { if(personalServerGetRankUrl.empty()) errorFunction("No personalServerGetRankUrl set"); else { std::string url(RBX::format(personalServerGetRankUrl.c_str(), placeId, player->getUserID())); dispatchRequest(url, resumeFunction, errorFunction); } } void PersonalServerService::setRank(Network::Player* player, int placeId, int newRank, boost::function resumeFunction, boost::function errorFunction) { if(personalServerSetRankUrl.empty()) errorFunction("No personalServerSetRankUrl set"); else { std::string url(RBX::format(personalServerSetRankUrl.c_str(), placeId, player->getUserID(), newRank)); dispatchRequest(url, resumeFunction, errorFunction); } } void PersonalServerService::setPrivilege(Network::Player* player, PrivilegeType privilegeType) { moveToRank(player,(int) privilegeType); } int PersonalServerService::getCurrentPrivilege(int rank) { if(rank < PRIVILEGE_VISITOR) return PRIVILEGE_BANNED; else if( (rank >= PRIVILEGE_VISITOR) && (rank < PRIVILEGE_MEMBER) ) return PRIVILEGE_VISITOR; else if( (rank >= PRIVILEGE_MEMBER) && (rank < PRIVILEGE_ADMIN) ) return PRIVILEGE_MEMBER; else if( (rank >= PRIVILEGE_ADMIN) && (rank < PRIVILEGE_OWNER) ) return PRIVILEGE_ADMIN; else if(rank >= PRIVILEGE_OWNER) return PRIVILEGE_OWNER; return rank; } int PersonalServerService::nextRankUp(int currentRank) { switch(currentRank) { case PRIVILEGE_OWNER: return currentRank; case PRIVILEGE_ADMIN: return PRIVILEGE_OWNER; case PRIVILEGE_MEMBER: return PRIVILEGE_ADMIN; case PRIVILEGE_VISITOR: return PRIVILEGE_MEMBER; case PRIVILEGE_BANNED: return PRIVILEGE_VISITOR; default: return currentRank; } } int PersonalServerService::nextRankDown(int currentRank) { switch(currentRank) { case PRIVILEGE_OWNER: return PRIVILEGE_ADMIN; case PRIVILEGE_ADMIN: return PRIVILEGE_MEMBER; case PRIVILEGE_MEMBER: return PRIVILEGE_VISITOR; case PRIVILEGE_VISITOR: return PRIVILEGE_BANNED; case PRIVILEGE_BANNED: return currentRank; default: return currentRank; } } void PersonalServerService::promote(shared_ptr instance) { if(instance.get()) if(Network::Player* player = dynamic_cast(instance.get())) moveToRank(player, nextRankUp(player->getPersonalServerRank())); } void PersonalServerService::demote(shared_ptr instance) { if(instance.get()) if(Network::Player* player = dynamic_cast(instance.get())) moveToRank(player, nextRankDown(player->getPersonalServerRank())); } }