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:
unitraxx
2013-09-09 23:10:36 +00:00
parent add8007dcb
commit 095d5a58c1
7 changed files with 91 additions and 20 deletions

View File

@@ -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]);

View File

@@ -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);

View File

@@ -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;

View File

@@ -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

View File

@@ -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; }

View File

@@ -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)

View File

@@ -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);
// ------------------------------------------------------------------------
/**