Core for viewing achievements of others
git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/uni@13656 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
@@ -116,14 +116,8 @@ Achievement * AchievementsSlot::getAchievement(uint32_t id)
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
void AchievementsSlot::sync(const std::string & achieved_string)
|
||||
void AchievementsSlot::sync(const std::vector<uint32_t> & achieved_ids)
|
||||
{
|
||||
std::vector<std::string> parts = StringUtils::split(achieved_string, ' ');
|
||||
std::vector<uint32_t> achieved_ids;
|
||||
for(unsigned int i = 0; i < parts.size(); ++i)
|
||||
{
|
||||
achieved_ids.push_back(atoi(parts[i].c_str()));
|
||||
}
|
||||
for(unsigned int i =0; i < achieved_ids.size(); ++i)
|
||||
{
|
||||
Achievement * achievement = getAchievement(achieved_ids[i]);
|
||||
|
||||
@@ -50,7 +50,7 @@ public :
|
||||
bool isValid() const { return m_valid;}
|
||||
void save(std::ofstream & out);
|
||||
bool isOnline() const {return m_online;}
|
||||
void sync(const std::string & achieved_string);
|
||||
void sync(const std::vector<uint32_t> & achieved_ids);
|
||||
void onRaceEnd();
|
||||
const std::string & getID() const {return m_id;}
|
||||
Achievement * getAchievement(uint32_t id);
|
||||
|
||||
@@ -156,7 +156,10 @@ namespace Online{
|
||||
AchievementsManager::get()->updateCurrentPlayer();
|
||||
std::string achieved_string("");
|
||||
if(input->get("achieved", &achieved_string) == 1)
|
||||
AchievementsManager::get()->getActive()->sync(achieved_string);
|
||||
{
|
||||
std::vector<uint32_t> achieved_ids = StringUtils::splitToUInt(achieved_string, ' ');
|
||||
AchievementsManager::get()->getActive()->sync(achieved_ids);
|
||||
}
|
||||
m_profile->fetchFriends();
|
||||
}
|
||||
else
|
||||
@@ -512,12 +515,7 @@ namespace Online{
|
||||
std::string online_friends_string("");
|
||||
if(m_result->get("online", &online_friends_string) == 1)
|
||||
{
|
||||
std::vector<std::string> parts = StringUtils::split(online_friends_string, ' ');
|
||||
std::vector<uint32_t> online_friends;
|
||||
for(unsigned int i = 0; i < parts.size(); ++i)
|
||||
{
|
||||
online_friends.push_back(atoi(parts[i].c_str()));
|
||||
}
|
||||
std::vector<uint32_t> online_friends = StringUtils::splitToUInt(online_friends_string, ' ');
|
||||
bool went_offline = false;
|
||||
std::vector<uint32_t> friends = CurrentUser::get()->getProfile()->getFriends();
|
||||
std::vector<irr::core::stringw> to_notify;
|
||||
|
||||
@@ -109,6 +109,51 @@ namespace Online{
|
||||
delete m_relation_info;
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
void Profile::fetchAchievements()
|
||||
{
|
||||
assert(CurrentUser::get()->isRegisteredUser());
|
||||
if(m_has_fetched_achievements || m_is_current_user)
|
||||
return;
|
||||
m_state = S_FETCHING;
|
||||
requestAchievements();
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
void Profile::achievementsCallback(const XMLNode * input)
|
||||
{
|
||||
m_achievements.clear();
|
||||
std::string achieved_string("");
|
||||
if(input->get("achieved", &achieved_string) == 1)
|
||||
{
|
||||
m_achievements = StringUtils::splitToUInt(achieved_string, ' ');
|
||||
}
|
||||
m_has_fetched_achievements = true;
|
||||
m_state = S_READY;
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
|
||||
void Profile::requestAchievements()
|
||||
{
|
||||
assert(CurrentUser::get()->isRegisteredUser() && !m_is_current_user);
|
||||
AchievementsRequest * request = new AchievementsRequest();
|
||||
request->setURL((std::string)UserConfigParams::m_server_multiplayer + "client-user.php");
|
||||
request->setParameter("action",std::string("get-achievements"));
|
||||
request->setParameter("token", CurrentUser::get()->getToken());
|
||||
request->setParameter("userid", CurrentUser::get()->getID());
|
||||
request->setParameter("visitingid", m_id);
|
||||
HTTPManager::get()->addRequest(request);
|
||||
}
|
||||
|
||||
void Profile::AchievementsRequest::callback()
|
||||
{
|
||||
uint32_t user_id(0);
|
||||
m_result->get("visitingid", &user_id);
|
||||
if( ProfileManager::get()->getProfileByID(user_id) != NULL )
|
||||
ProfileManager::get()->getProfileByID(user_id)->achievementsCallback(m_result);
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
void Profile::fetchFriends()
|
||||
{
|
||||
@@ -119,8 +164,6 @@ namespace Online{
|
||||
requestFriendsList();
|
||||
}
|
||||
// ============================================================================
|
||||
|
||||
|
||||
void Profile::friendsListCallback(const XMLNode * input)
|
||||
{
|
||||
const XMLNode * friends_xml = input->getNode("friends");
|
||||
@@ -144,11 +187,11 @@ namespace Online{
|
||||
m_state = S_READY;
|
||||
}
|
||||
|
||||
|
||||
// ============================================================================
|
||||
|
||||
void Profile::requestFriendsList()
|
||||
{
|
||||
assert(CurrentUser::get()->isRegisteredUser());
|
||||
FriendsListRequest * request = new FriendsListRequest();
|
||||
request->setURL((std::string)UserConfigParams::m_server_multiplayer + "client-user.php");
|
||||
request->setParameter("action",std::string("get-friends-list"));
|
||||
@@ -201,12 +244,17 @@ namespace Online{
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
|
||||
const std::vector<uint32_t> & Profile::getFriends()
|
||||
{
|
||||
assert (m_has_fetched_friends && m_state == S_READY);
|
||||
return m_friends;
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
const std::vector<uint32_t> & Profile::getAchievements()
|
||||
{
|
||||
assert (m_has_fetched_achievements && m_state == S_READY && !m_is_current_user);
|
||||
return m_achievements;
|
||||
}
|
||||
|
||||
} // namespace Online
|
||||
|
||||
@@ -66,6 +66,12 @@ namespace Online{
|
||||
public:
|
||||
FriendsListRequest() : XMLRequest(0, true) {}
|
||||
};
|
||||
class AchievementsRequest : public XMLRequest
|
||||
{
|
||||
virtual void callback ();
|
||||
public:
|
||||
AchievementsRequest() : XMLRequest(0, true) {}
|
||||
};
|
||||
|
||||
typedef std::vector<uint32_t> IDList;
|
||||
private:
|
||||
@@ -86,11 +92,17 @@ namespace Online{
|
||||
bool m_has_fetched_friends;
|
||||
std::vector<uint32_t> m_friends;
|
||||
|
||||
bool m_has_fetched_achievements;
|
||||
std::vector<uint32_t> m_achievements;
|
||||
|
||||
bool m_cache_bit;
|
||||
|
||||
void requestFriendsList();
|
||||
void friendsListCallback(const XMLNode * input);
|
||||
|
||||
void requestAchievements();
|
||||
void achievementsCallback(const XMLNode * input);
|
||||
|
||||
public:
|
||||
Profile( const uint32_t & userid,
|
||||
const irr::core::stringw & username,
|
||||
@@ -102,6 +114,10 @@ namespace Online{
|
||||
const std::vector<uint32_t> & getFriends();
|
||||
bool hasFetchedFriends() { return m_has_fetched_friends;}
|
||||
|
||||
void fetchAchievements();
|
||||
const std::vector<uint32_t> & getAchievements();
|
||||
bool hasFetchedAchievements() { return m_has_fetched_achievements;}
|
||||
|
||||
bool isFetching() const { return m_state == S_FETCHING; }
|
||||
bool isReady() const { return m_state == S_READY; }
|
||||
|
||||
|
||||
@@ -263,6 +263,18 @@ namespace StringUtils
|
||||
} // split
|
||||
|
||||
|
||||
std::vector<uint32_t> splitToUInt(const std::string& s, char c, bool keepSplitChar)
|
||||
{
|
||||
std::vector<std::string> parts = split(s, c, keepSplitChar);
|
||||
std::vector<uint32_t> ints;
|
||||
for(unsigned int i = 0; i < parts.size(); ++i)
|
||||
{
|
||||
ints.push_back(atoi(parts[i].c_str()));
|
||||
}
|
||||
return ints;
|
||||
}
|
||||
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
/** Splits a : separated string (like PATH) into its individual components.
|
||||
* It especially handles Windows-style paths (c:/mydir1:d:/mydir2)
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <vector>
|
||||
#include <sstream>
|
||||
#include <irrString.h>
|
||||
#include "utils/types.hpp"
|
||||
|
||||
namespace StringUtils
|
||||
{
|
||||
@@ -92,7 +93,9 @@ namespace StringUtils
|
||||
bool keepSplitChar=false);
|
||||
std::vector<irr::core::stringw> split(const irr::core::stringw& s,
|
||||
char c, bool keepSplitChar=false);
|
||||
std::vector<std::string> splitPath(const std::string& path);
|
||||
std::vector<uint32_t> splitToUInt(const std::string& s, char c,
|
||||
bool keepSplitChar=false);
|
||||
std::vector<std::string> splitPath(const std::string& path);
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user