Skip to content

Instantly share code, notes, and snippets.

@PumpkinPaul
Created November 4, 2021 20:34
Show Gist options
  • Save PumpkinPaul/7adbd9b1caae6be0e0c30e63ba38f623 to your computer and use it in GitHub Desktop.
Save PumpkinPaul/7adbd9b1caae6be0e0c30e63ba38f623 to your computer and use it in GitHub Desktop.
=====================================================================================================================
=====================================================================================================================
=====================================================================================================================
=====================================================================================================================
XboxOneNativeLeaderboard.h
#pragma once
#ifndef _$H_GAURD_XBOXONENATIVELEADERBOARD
#define _$H_GAURD_XBOXONENATIVELEADERBOARD
#include "mscorlib/System/String.h"
#include "mscorlib/System/String.inl"
#include <xsapi/services.h>
#include <xsapi/leaderboard.h>
#include "Glitchangels/PumpkinGames/Glitchangels/ScoreItem.h"
#include "Glitchangels/PumpkinGames/Glitchangels/GameServices/LeaderboardFilterType.h"
#include "Glitchangels/PumpkinGames/Glitchangels/GameServices/XboxLive/XboxLiveLeaderboard.h"
// Predecls
namespace System { class String; }
namespace PumpkinGames { namespace Glitchangels { namespace Platforms { namespace XboxOne { namespace Native {
void UploadLeaderboardScore(
std::shared_ptr<xbox::services::stats::manager::stats_manager> statsManager,
Windows::Xbox::System::User^ user,
::PumpkinGames::Glitchangels::ScoreItem* scoreItem);
void GetLeaderboard(
::PumpkinGames::Glitchangels::GameServices::XboxLive::XboxLiveLeaderboard* leaderboard,
std::shared_ptr<xbox::services::stats::manager::stats_manager> statsManager,
Windows::Xbox::System::User^ user,
::PumpkinGames::Glitchangels::GameServices::LeaderboardFilterType filterType,
int rangeStart,
int rangeEnd);
void ProcessLeaderboards(
std::shared_ptr<xbox::services::stats::manager::stats_manager> statsManager,
Windows::Xbox::System::User^ user,
xbox::services::xbox_live_result<xbox::services::leaderboard::leaderboard_result> result
);
}}}}} // namespace PumpkinGames.Glitchangels.Platforms.XboxOne.Native
#endif // _$H_GAURD_XBOXONENATIVELEADERBOARD
=====================================================================================================================
=====================================================================================================================
=====================================================================================================================
=====================================================================================================================
XboxOneNativeLeaderboard.cpp
#include <mscorlib/1nternal/Brute.h>
#include <xsapi/services.h>
#include <xsapi/stats_manager.h>
#include <xsapi/leaderboard.h>
#include "mscorlib/System/String.h"
#include "mscorlib/System/Collections/Generic/IList_1.h"
#include "mscorlib/System/Collections/Generic/List_1.h"
#include "mscorlib/System/Collections/Generic/List_1+Enumerator.h"
#include "Glitchangels/PumpkinGames/Glitchangels/ConversionHelper.h"
#include "Glitchangels/PumpkinGames/Glitchangels/ScoreItem.h"
#include "Glitchangels/PumpkinGames/Glitchangels/GameServices/LeaderboardFilterType.h"
#include "Glitchangels/PumpkinGames/Glitchangels/GameServices/XboxLive/XboxLiveLeaderboard.h"
#include "Glitchangels/PumpkinGames/Glitchangels/Platforms/XboxOne/Native/XboxOneNativeStats.h"
using namespace ::Windows::Xbox::System;
using namespace xbox::services;
using namespace xbox::services::leaderboard;
using namespace xbox::services::stats::manager;
using namespace xbox::services::system;
using namespace PumpkinGames::Glitchangels::GameServices;
namespace PumpkinGames {
namespace Glitchangels {
namespace Platforms {
namespace XboxOne {
namespace Native {
const string_t leaderboardName = L"BestScore";
::PumpkinGames::Glitchangels::GameServices::XboxLive::XboxLiveLeaderboard* m_leaderboard = nullptr;
::PumpkinGames::Glitchangels::GameServices::LeaderboardFilterType m_filterType;
::System::Collections::Generic::List$1< ::PumpkinGames::Glitchangels::ScoreItem* >* m_scoreItems = nullptr;
void UploadLeaderboardScore(
std::shared_ptr<xbox::services::stats::manager::stats_manager> statsManager,
Windows::Xbox::System::User^ user,
::PumpkinGames::Glitchangels::ScoreItem* scoreItem)
{
#if _DEBUG
OutputDebugString(L"UploadLeaderboardScore\n");
#endif
auto score = ScoreItem$_get_Score(scoreItem);
statsManager->set_stat_as_integer(user, leaderboardName, score);
StatsFlushStats(statsManager, user);
}
void GetLeaderboard(
::PumpkinGames::Glitchangels::GameServices::XboxLive::XboxLiveLeaderboard* leaderboard,
std::shared_ptr<xbox::services::stats::manager::stats_manager> statsManager,
Windows::Xbox::System::User^ user,
::PumpkinGames::Glitchangels::GameServices::LeaderboardFilterType filterType,
int rangeStart,
int rangeEnd)
{
m_leaderboard = leaderboard;
m_filterType = filterType;
if (m_scoreItems == nullptr)
{
m_scoreItems = ::System::Collections::Generic::List$1$_$Ctor< ::PumpkinGames::Glitchangels::ScoreItem* >(nullptr);
}
::System::Collections::Generic::List$1$_Clear_Void(m_scoreItems);
leaderboard_query leaderboardQuery;
leaderboardQuery.set_max_items(10);
leaderboardQuery.set_order(sort_order::descending);
switch (filterType)
{
case LeaderboardFilterType::Player:
leaderboardQuery.set_skip_result_to_me(true);
statsManager->get_leaderboard(user, leaderboardName, leaderboardQuery);
break;
case LeaderboardFilterType::Friends:
leaderboardQuery.set_skip_result_to_me(true);
statsManager->get_social_leaderboard(user, leaderboardName, xbox::services::social::social_group_constants::people(), leaderboardQuery);
break;
case LeaderboardFilterType::Global:
leaderboardQuery.set_skip_result_to_me(false);
statsManager->get_leaderboard(user, leaderboardName, leaderboardQuery);
break;
case LeaderboardFilterType::Favorite:
leaderboardQuery.set_skip_result_to_me(true);
statsManager->get_social_leaderboard(user, leaderboardName, xbox::services::social::social_group_constants::favorite(), leaderboardQuery);
break;
}
}
void ProcessLeaderboardRows(const leaderboard_result& leaderboard_result)
{
for (const leaderboard_row& row : leaderboard_result.rows())
{
::System::String* score = ::System::String$_$Ctor(nullptr, const_cast<wchar_t*>(row.column_values()[0].c_str()));
::PumpkinGames::Glitchangels::ScoreItem* scoreItem = ::PumpkinGames::Glitchangels::ScoreItem$_$Ctor(nullptr);
ScoreItem$_set_Score(scoreItem, (int)::PumpkinGames::Glitchangels::ConversionHelper$_$S_ToInt32(score));
ScoreItem$_set_Name(scoreItem, ::System::String$_$Ctor(nullptr, const_cast<wchar_t*>(row.gamertag().c_str())));
ScoreItem$_set_Rank(scoreItem, row.rank());
scoreItem->UniqueIdentifier = ::System::String$_$Ctor(nullptr, const_cast<wchar_t*>(row.xbox_user_id().c_str()));;
::PumpkinGames::Glitchangels::ScoreItem$_SetDisplayItems(scoreItem);
::System::Collections::Generic::List$1$_Add_Void< ::PumpkinGames::Glitchangels::ScoreItem* >(m_scoreItems, scoreItem);
}
}
void ProcessLeaderboards(
std::shared_ptr<xbox::services::stats::manager::stats_manager> statsManager,
Windows::Xbox::System::User^ user,
xbox::services::xbox_live_result<xbox::services::leaderboard::leaderboard_result> result
)
{
if (result.err())
{
#if _DEBUG
wchar_t temp[512];
swprintf(temp, 512, L"Failed get_leaderboard - %hs\n", result.err_message().c_str());
OutputDebugString(temp);
#endif
XboxLiveLeaderboard$_FailRemoteScores(m_leaderboard, m_filterType);
return;
}
auto leaderboardResult = result.payload();
ProcessLeaderboardRows(leaderboardResult);
// Keep processing if there is more data in the leaderboard
if (leaderboardResult.has_next())
{
if (!leaderboardResult.get_next_query().err())
{
auto lbQuery = leaderboardResult.get_next_query().payload();
if (lbQuery.social_group().empty())
{
statsManager->get_leaderboard(user, lbQuery.stat_name(), lbQuery);
}
else
{
statsManager->get_social_leaderboard(user, lbQuery.stat_name(), lbQuery.social_group(), lbQuery);
}
}
}
else
{
XboxLiveLeaderboard$_LoadRemoteScores(m_leaderboard, m_filterType, (::System::Collections::Generic::IEnumerable$1< ::PumpkinGames::Glitchangels::ScoreItem* >*)m_scoreItems);
}
}
}
}
}
}
} // namespace PumpkinGames.Glitchangels.Platforms.XboxOne.Native
=====================================================================================================================
=====================================================================================================================
=====================================================================================================================
=====================================================================================================================
XboxOneNativeStats.h
#pragma once
#ifndef _$H_GAURD_XBOXONENATIVESTATS
#define _$H_GAURD_XBOXONENATIVESTATS
#include "mscorlib/System/String.h"
#include "mscorlib/System/String.inl"
#include <xsapi/services.h>
#include <xsapi/stats_manager.h>
// Predecls
namespace System { class String; }
namespace PumpkinGames { namespace Glitchangels { namespace Platforms { namespace XboxOne { namespace Native {
void StatsAddLocalUser(
std::shared_ptr<xbox::services::stats::manager::stats_manager> statsManager,
Windows::Xbox::System::User^ user);
void StatsRemoveLocalUser(
std::shared_ptr<xbox::services::stats::manager::stats_manager> statsManager,
Windows::Xbox::System::User^ user);
void StatsSetStatAsInteger(
std::shared_ptr<xbox::services::stats::manager::stats_manager> statsManager,
Windows::Xbox::System::User^ user, ::System::String* name, int value);
void StatsFlushStats(
std::shared_ptr<xbox::services::stats::manager::stats_manager> statsManager,
Windows::Xbox::System::User^ user);
}}}}} // namespace PumpkinGames.Glitchangels.Platforms.XboxOne.Native
#endif // _$H_GAURD_XBOXONENATIVESTATS
=====================================================================================================================
=====================================================================================================================
=====================================================================================================================
=====================================================================================================================
XboxOneNativeStats.cpp
#include <mscorlib/1nternal/Brute.h>
#include "Glitchangels/PumpkinGames/Glitchangels/Platforms/XboxOne/Native/XboxOneNativeStats.h"
#include <xsapi/services.h>
#include <xsapi/stats_manager.h>
using namespace Windows::Xbox::System;
using namespace xbox::services::stats::manager;
namespace PumpkinGames {
namespace Glitchangels {
namespace Platforms {
namespace XboxOne {
namespace Native {
void StatsAddLocalUser(
std::shared_ptr<xbox::services::stats::manager::stats_manager> statsManager,
Windows::Xbox::System::User^ user)
{
statsManager->add_local_user(user);
}
void StatsRemoveLocalUser(
std::shared_ptr<xbox::services::stats::manager::stats_manager> statsManager,
Windows::Xbox::System::User^ user)
{
if (nullptr == user)
return;
statsManager->remove_local_user(user);
}
void StatsSetStatAsInteger(
std::shared_ptr<xbox::services::stats::manager::stats_manager> statsManager,
Windows::Xbox::System::User^ user,
::System::String* name,
int value)
{
#if _DEBUG
wchar_t temp[512];
swprintf(temp, 512, L"Set stat value - name %s value %i\n", &name->start_char, value);
OutputDebugString(temp);
#endif
statsManager->set_stat_as_integer(user, &name->start_char, value);
}
void StatsFlushStats(
std::shared_ptr<xbox::services::stats::manager::stats_manager> statsManager,
Windows::Xbox::System::User^ user)
{
#if _DEBUG
OutputDebugString(L"Flushing stats\n");
#endif
statsManager->request_flush_to_service(user);
}
}
}
}
}
} // namespace PumpkinGames.Glitchangels.Platforms.XboxOne.Native
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment