Showing preview only (635K chars total). Download the full file or copy to clipboard to get everything.
Repository: Fumo-Unlockers/Xbox-Achievement-Unlocker
Branch: Main
Commit: 1608ac50faa7
Files: 148
Total size: 590.9 KB
Directory structure:
gitextract_1b3dwlvx/
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ ├── config.yml
│ │ ├── feature_request.yml
│ │ └── game_request.yml
│ └── workflows/
│ ├── Build-Events-Zip.yml
│ └── Build-Pre-Release.yml
├── .gitignore
├── .gitmodules
├── .idea/
│ └── .idea.XAU/
│ └── .idea/
│ ├── .gitignore
│ ├── encodings.xml
│ ├── indexLayout.xml
│ ├── riderPublish.xml
│ └── vcs.xml
├── .run/
│ ├── Debug.run.xml
│ ├── Publish Debug.run.xml
│ └── Publish Release.run.xml
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Clown-Behaviour.md
├── Doc/
│ └── Events.md
├── LICENSE
├── LICENSE.MIT
├── README.md
├── XAU/
│ ├── App.xaml
│ ├── App.xaml.cs
│ ├── AssemblyInfo.cs
│ ├── Models/
│ │ ├── GitHubResponse.cs
│ │ ├── MiscItems.cs
│ │ ├── XAUSettings.cs
│ │ ├── XboxApiRequest.cs
│ │ └── XboxApiResponse.cs
│ ├── Networking/
│ │ ├── DBoxRestAPI.cs
│ │ ├── GithubRestApi.cs
│ │ └── XboxRestApi.cs
│ ├── Services/
│ │ ├── ApplicationHostService.cs
│ │ └── HttpServer/
│ │ ├── AchievementRoutes.cs
│ │ ├── EndpointRoutes.cs
│ │ ├── GameRoutes.cs
│ │ ├── HttpServer.cs
│ │ ├── ProfileRoutes.cs
│ │ ├── Routes.cs
│ │ └── SpoofingRoutes.cs
│ ├── Theme/
│ │ └── ThemeConstants.xaml
│ ├── Usings.cs
│ ├── Util/
│ │ ├── Constants/
│ │ │ └── Constants.cs
│ │ ├── Etw/
│ │ │ └── EtwTokenCapture.cs
│ │ ├── Files/
│ │ │ └── FileDownloader.cs
│ │ ├── Memory/
│ │ │ ├── Methods/
│ │ │ │ ├── AoB.cs
│ │ │ │ └── Read.cs
│ │ │ ├── Structures/
│ │ │ │ ├── Imports.cs
│ │ │ │ ├── MemoryRegionResult.cs
│ │ │ │ └── Process.cs
│ │ │ └── memory.cs
│ │ └── XboxAuthNet/
│ │ ├── Base64UrlHelper.cs
│ │ ├── ErrorCodes.cs
│ │ ├── ErrorHelper.cs
│ │ ├── FodyWeavers.xml
│ │ ├── HttpHelper.cs
│ │ ├── Jwt/
│ │ │ └── JwtDecoder.cs
│ │ ├── OAuth/
│ │ │ ├── CodeFlow/
│ │ │ │ ├── AuthCodeException.cs
│ │ │ │ ├── CodeFlowAuthenticator.cs
│ │ │ │ ├── CodeFlowAuthorizationResult.cs
│ │ │ │ ├── CodeFlowBuilder.cs
│ │ │ │ ├── CodeFlowLiveApiClient.cs
│ │ │ │ ├── CodeFlowUriChecker.cs
│ │ │ │ ├── ICodeFlowApiClient.cs
│ │ │ │ ├── ICodeFlowUrlChecker.cs
│ │ │ │ ├── IWebUI.cs
│ │ │ │ ├── MicrosoftOAuthPromptModes.cs
│ │ │ │ ├── Parameters/
│ │ │ │ │ ├── CodeFlowAccessTokenParameter.cs
│ │ │ │ │ ├── CodeFlowAuthorizationParameter.cs
│ │ │ │ │ ├── CodeFlowParameter.cs
│ │ │ │ │ └── CodeFlowRefreshTokenParameter.cs
│ │ │ │ └── WebUIOptions.cs
│ │ │ ├── MicrosoftOAuthException.cs
│ │ │ ├── MicrosoftOAuthResponse.cs
│ │ │ └── MicrosoftUserPayload.cs
│ │ ├── PlatformManager.cs
│ │ ├── Platforms/
│ │ │ └── WinForm/
│ │ │ ├── StaTaskScheduler.cs
│ │ │ ├── UIThreadHelper.cs
│ │ │ ├── WebView2WebUI.cs
│ │ │ ├── Win32Window.cs
│ │ │ ├── WinFormsPanelWithWebView2.cs
│ │ │ └── WindowsDpiHelper.cs
│ │ ├── XboxAuthNet.csproj
│ │ └── XboxLive/
│ │ ├── Crypto/
│ │ │ ├── ECDCertificatePopCryptoProvider.cs
│ │ │ ├── IPopCryptoProvider.cs
│ │ │ ├── IXboxRequestSigner.cs
│ │ │ └── XboxRequestSigner.cs
│ │ ├── Requests/
│ │ │ ├── AbstractXboxAuthRequest.cs
│ │ │ ├── AbstractXboxSignedAuthRequest.cs
│ │ │ ├── CommonRequestHeaders.cs
│ │ │ ├── XboxDeviceTokenRequest.cs
│ │ │ ├── XboxSignedUserTokenRequest.cs
│ │ │ ├── XboxSignedXstsRequest.cs
│ │ │ ├── XboxSisuAuthRequest.cs
│ │ │ ├── XboxTitleTokenRequest.cs
│ │ │ ├── XboxUserTokenRequest.cs
│ │ │ └── XboxXstsRequest.cs
│ │ ├── Responses/
│ │ │ ├── XErrJsonConverter.cs
│ │ │ ├── XboxAuthResponse.cs
│ │ │ ├── XboxAuthResponseHandler.cs
│ │ │ ├── XboxAuthXuiClaims.cs
│ │ │ ├── XboxAuthXuiClaimsJsonConverter.cs
│ │ │ ├── XboxErrorResponse.cs
│ │ │ └── XboxSisuResponse.cs
│ │ ├── XboxAuthClient.cs
│ │ ├── XboxAuthConstants.cs
│ │ ├── XboxAuthException.cs
│ │ ├── XboxAuthXuiClaimNames.cs
│ │ ├── XboxDeviceTypes.cs
│ │ ├── XboxGameTitles.cs
│ │ └── XboxSignedClient.cs
│ ├── ViewModels/
│ │ ├── Pages/
│ │ │ ├── AchievementsViewModel.cs
│ │ │ ├── DebugViewModel.cs
│ │ │ ├── GamesViewModel.cs
│ │ │ ├── HomeViewModel.cs
│ │ │ ├── InfoViewModel.cs
│ │ │ ├── MiscViewModel.cs
│ │ │ ├── SettingsViewModel.cs
│ │ │ └── StatsViewModel.cs
│ │ └── Windows/
│ │ └── MainWindowViewModel.cs
│ ├── Views/
│ │ ├── Pages/
│ │ │ ├── AchievementsPage.xaml
│ │ │ ├── AchievementsPage.xaml.cs
│ │ │ ├── DebugPage.xaml
│ │ │ ├── DebugPage.xaml.cs
│ │ │ ├── GamesPage.xaml
│ │ │ ├── GamesPage.xaml.cs
│ │ │ ├── HomePage.xaml
│ │ │ ├── HomePage.xaml.cs
│ │ │ ├── InfoPage.xaml
│ │ │ ├── InfoPage.xaml.cs
│ │ │ ├── MiscPage.xaml
│ │ │ ├── MiscPage.xaml.cs
│ │ │ ├── PlaceholderPage.xaml
│ │ │ ├── PlaceholderPage.xaml.cs
│ │ │ ├── SettingsPage.xaml
│ │ │ ├── SettingsPage.xaml.cs
│ │ │ ├── StatsPage.xaml
│ │ │ └── StatsPage.xaml.cs
│ │ └── Windows/
│ │ ├── MainWindow.xaml
│ │ └── MainWindow.xaml.cs
│ ├── XAU.csproj
│ └── app.manifest
└── XAU.sln
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
# Remove the line below if you want to inherit .editorconfig settings from higher directories
root = true
# C# files
[*.cs]
#### Core EditorConfig Options ####
# Indentation and spacing
indent_size = 4
indent_style = space
tab_width = 4
insert_final_newline = true
trim_trailing_whitespace = true
# charset
charset = utf-8
end_of_line = lf
#### .NET Coding Conventions ####
# this. and Me. preferences
dotnet_style_qualification_for_method = true
#### Diagnostic configuration ####
# CA1000: Do not declare static members on generic types
dotnet_diagnostic.CA1000.severity = warning
================================================
FILE: .gitattributes
================================================
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain
================================================
FILE: .github/FUNDING.yml
================================================
github: ItsLogic
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug Report
description: File a bug report
title: "[Bug]: "
labels: ["bug"]
body:
- type: markdown
attributes:
value: |
Make sure you fill in every section correctly and with as much detail as possible.
- type: input
id: XAU-Ver
attributes:
label: What version of the Xbox Achievement Unlocker were you using (you can see this in the info page)?
placeholder: 2.x
validations:
required: true
- type: dropdown
id: Tool-Section
attributes:
label: Tool Section
description: What area of the tool did the issue occur?
options:
- Home
- Games
- Achievements
- Misc- Spoofer
- Misc- Search
- Settings
- Other- Please put more information in the box below
validations:
required: true
- type: textarea
id: issue-description
attributes:
label: What is the bug?
description: What did you expect to happen and what actually happened? If the error dialog popped up paste the error message into this box (include images/video where applicable)
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: Feature/Improvement request
description: Make a request for a new feature or an improvement to an existing feature
title: "[Enhancement]: "
labels: ["enhancement"]
body:
- type: markdown
attributes:
value: |
Make sure you fill in every section correctly and with as much detail as possible.
- type: dropdown
id: RequestSelection
attributes:
label: Request Selection
description: Are you asking for an improvement or a new feature?
options:
- New Feature
- Improvement
validations:
required: true
- type: textarea
id: RequestDescription
attributes:
label: What is your request?
description: What do you want? Where do you want it? What do you want it to do?
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/game_request.yml
================================================
name: Game Request
description: Request support for an event-based game
title: "[Game]: "
labels: ["Game"]
body:
- type: markdown
attributes:
value: "Please fill in each section accurately."
- type: checkboxes
id: duplicate
attributes:
label: Confirmation
description: Confirm before submitting
options:
- label: I have verified that this is not a duplicate request.
required: true
- type: input
id: GameLink
attributes:
label: Game Link
description: Provide a True Achievements or Xbox store link for the game you want supported.
placeholder: e.g., https://www.trueachievements.com/game/Forza-Horizon-3/achievements
validations:
required: true
- type: dropdown
id: Tool-Section
attributes:
label: Game Platform
description: Specify the platforms on which the Xbox version of this game is available.
options:
- Console only
- Console and PC
- PC only
validations:
required: true
- type: textarea
id: issue-description
attributes:
label: Additional Game Information
description: Provide any additional information about the game or specific achievements you want supported.
validations:
required: true
================================================
FILE: .github/workflows/Build-Events-Zip.yml
================================================
name: Update Events Data
on:
push:
paths:
- 'Events/**'
- 'Events'
branches:
- Main
jobs:
zip-and-push:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
submodules: recursive
fetch-depth: 0
- name: Ensure submodules are initialized and at the recorded commit
run: |
# sync submodule URLs, init and update to the recorded gitlinks
git submodule sync --recursive
git submodule update --init --recursive --force
- name: Install zip
run: sudo apt-get install zip
- name: Zip Events folder
run: zip -r Events.zip Events
- name: Create meta.json
run: |
echo '{
"Timestamp": '$(date +%s)',
"DataVersion": "1.0"
}' > meta.json
- name: Setup Git
run: |
git config --global user.email "38233332+ItsLogic@users.noreply.github.com"
git config --global user.name "Events Data Action"
- name: Create and switch to new branch
run: |
git checkout --orphan Events-Data
git rm --cached -r .
- name: Add files to new branch
run: |
git add Events.zip meta.json
git commit -m "Update events data: $(date -u +'%Y-%m-%d %H:%M:%S')"
- name: Force Push to new branch
run: git push --force origin Events-Data
================================================
FILE: .github/workflows/Build-Pre-Release.yml
================================================
name: .NET 8 Build
on:
push:
branches: [ Main ]
paths-ignore:
- '**.md'
- '**/ISSUE_TEMPLATE/**'
- '**.json'
- '.gitignore'
- '.gitattributes'
jobs:
build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- name: Setup .NET
uses: actions/setup-dotnet@v1
with:
dotnet-version: '9.0.x'
- name: Get latest commit hash
id: get-hash
run: echo "hash=$(git rev-parse HEAD)" >> $env:GITHUB_OUTPUT
- name: Replace ToolVersion with commit hash
run: |
$content = Get-Content -Path "${{github.workspace}}/XAU/ViewModels/Pages/HomeViewModel.cs" -Raw
$content = $content -replace 'public static string ToolVersion = "EmptyDevToolVersion";', 'public static string ToolVersion = "DEV-${{ steps.get-hash.outputs.hash }}";'
$content = $content -replace 'Tool Version: {System.Reflection.Assembly.GetExecutingAssembly().GetName().Version}', 'Tool Version: DEV-${{ steps.get-hash.outputs.hash }}'
Set-Content -Path "${{github.workspace}}/XAU/ViewModels/Pages/HomeViewModel.cs" -Value $content
- name: Restore dependencies
run: dotnet restore /p:EnableWindowsTargeting=true
- name: Build
run: dotnet publish XAU.sln -c Release -r win-x64 --self-contained false /p:PublishSingleFile=true /p:PublishReadyToRun=false /p:IncludeAllContentForSelfExtract=true /p:EnableWindowsTargeting=true -o ./publish
- name: Copy .exe file to temp
run: |
New-Item -ItemType Directory -Force -Path "${{github.workspace}}/../temp"
Copy-Item -Path "./publish/XAU.exe" -Destination "${{github.workspace}}/../temp/"
- name: Copy .exe file to workspace
run: |
Remove-Item -Path "${{github.workspace}}/XAU.exe" -ErrorAction Ignore
Move-Item -Path "${{github.workspace}}/../temp/XAU.exe" -Destination "${{github.workspace}}/XAU.exe"
- name: Write download URL and version to JSON file
run: |
echo "{ `"DownloadURL`": `"https://github.com/${{ github.repository }}/raw/Pre-Release/XAU.exe`", `"LatestBuildVersion`": `"${{ steps.get-hash.outputs.hash }}`" }" | Out-File -FilePath info.json
- name: Create and switch to new branch
run: |
git checkout --orphan Pre-Release
git rm -f --cached -r .
- name: Setup Git
run: |
git config --global user.email "38233332+ItsLogic@users.noreply.github.com"
git config --global user.name "Pre Release Action"
- name: Add files to new branch
run: |
git add XAU.exe info.json
git commit -m "Update pre-release version: $(date -u +'%Y-%m-%d %H:%M:%S')"
- name: Force Push to new branch
run: git push --force origin Pre-Release
================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Oo]ut/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
================================================
FILE: .gitmodules
================================================
[submodule "Events"]
path = Events
url = https://github.com/Fumo-Unlockers/XAU-Events
================================================
FILE: .idea/.idea.XAU/.idea/.gitignore
================================================
# Default ignored files
/shelf/
/workspace.xml
# Rider ignored files
/projectSettingsUpdater.xml
/.idea.XAU.iml
/modules.xml
/contentModel.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
================================================
FILE: .idea/.idea.XAU/.idea/encodings.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" />
</project>
================================================
FILE: .idea/.idea.XAU/.idea/indexLayout.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="UserContentModel">
<attachedFolders />
<explicitIncludes />
<explicitExcludes />
</component>
</project>
================================================
FILE: .idea/.idea.XAU/.idea/riderPublish.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="LocationsWithSilentDeleteHolder">
<option name="locations">
<list>
<option value="$PROJECT_DIR$/XAU/bin/Release/net8.0-windows/win-x64/publish" />
</list>
</option>
</component>
</project>
================================================
FILE: .idea/.idea.XAU/.idea/vcs.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>
================================================
FILE: .run/Debug.run.xml
================================================
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Debug" type="DotNetProject" factoryName=".NET Project">
<option name="EXE_PATH" value="$PROJECT_DIR$/XAU/bin/x64/Debug/net8.0-windows/XAU.exe" />
<option name="PROGRAM_PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/XAU/bin/x64/Debug/net8.0-windows" />
<option name="PASS_PARENT_ENVS" value="1" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="PROJECT_PATH" value="$PROJECT_DIR$/XAU/XAU.csproj" />
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
<option name="PROJECT_KIND" value="DotNetCore" />
<option name="PROJECT_TFM" value="net8.0-windows" />
<method v="2">
<option name="Build" default="false" projectName="XAU" projectPath="$PROJECT_DIR$/XAU/XAU.csproj" />
</method>
</configuration>
</component>
================================================
FILE: .run/Publish Debug.run.xml
================================================
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Publish Debug" type="DotNetFolderPublish" factoryName="Publish to folder">
<riderPublish configuration="Debug" delete_existing_files="true" include_native_libs_for_self_extract="true" platform="x64" produce_single_file="true" runtime="win-x64" target_folder="$PROJECT_DIR$/XAU/bin/Debug/net8.0-windows/win-x64/publish" target_framework="net8.0-windows" uuid_high="3467633360020586717" uuid_low="-5402852396017586348" />
<method v="2" />
</configuration>
</component>
================================================
FILE: .run/Publish Release.run.xml
================================================
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Publish Release" type="DotNetFolderPublish" factoryName="Publish to folder">
<riderPublish configuration="Release" delete_existing_files="true" include_native_libs_for_self_extract="true" platform="x64" produce_single_file="true" runtime="win-x64" target_folder="$PROJECT_DIR$/XAU/bin/Release/net8.0-windows/win-x64/publish" target_framework="net8.0-windows" uuid_high="3467633360020586717" uuid_low="-5402852396017586348" />
<method v="2" />
</configuration>
</component>
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Code of Conduct
## 1. Acceptance
We believe in the inherent dignity of all individuals. We stand for the acceptance of all people, regardless of who they are, where they come from, what they believe, or how they choose to express themselves.
## 2. No Hate
We strictly prohibit any form of hate speech, discrimination, or prejudice. We encourage open-mindedness and respect for all members of our community.
## 3. Respect
We expect all members of our community to treat each other with respect and kindness. Disagreements should be handled with maturity and understanding.
## 4. Violations
Violations of this code of conduct will not be tolerated and may result in expulsion from the community.
By participating in this community, you agree to abide by this code of conduct.
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing Guidelines
We love your input! We want to make contributing to this project as easy and transparent as possible, whether it's:
- Reporting a bug
- Discussing the current state of the code
- Submitting a fix
- Proposing new features
## We Develop with Github
We use github to host code, to track issues and feature requests, as well as accept pull requests.
Pull Requests are the best way to propose changes to the codebase. We actively welcome your pull requests if:
1. They are functional
2. They improve the tool and/or repository
3. They are easy to understand and check
## Any contributions you make will be under the GNU GPL License
In short, when you submit code changes, your submissions are understood to be under the same [MIT License](https://choosealicense.com/licenses/gpl-3.0/) that covers the project. Feel free to contact the maintainers if that's a concern.
## Report bugs using Github's issues
We use GitHub issues to track bugs. Report a bug by [opening a new issue](https://github.com/ItsLogic/Xbox-Achievement-Unlocker/issues/new); it's that easy!
## Write bug reports with detail and background
Great Bug Reports tend to have:
- A quick summary and/or background
- Steps to reproduce
- Be specific!
- What you expected would happen
- What actually happens
================================================
FILE: Clown-Behaviour.md
================================================
# This a fun list of people acting like clowns
## 1. S1MXN (Simon)
This user goes by S1MXN on [youtube](https://www.youtube.com/@S1MXN) and s1mxnyt (285913424716627970) on discord.
He made a [video](https://www.youtube.com/watch?v=aQk5OGRqzQ8) on August 1st and claimed the tool is his within this video. He then goes on to double down in the comments that the tool is his.
In this example he even claims to want to take down other peoples videos for copying his work:

Here are a few other funny images of him claiming that he is fixing the tool (as this version of the tool stopped working after an xbox app update)


He finally spoke to me on discord which resulted in this great interaction where he claims that I actually stole his work and even that I hacked him to upload the code before his video.
I first pretty innocently ask about the tool as a concerned user as it has stopped working

I then link this github repo and ask if the code was stolen from him

He responds to my surprise with yes

I then ask him how the code managed to get there before his video and if his PC was hacked and he once again responds to my surprise with yes


---
## 2. relights
This user goes by relights/em on discord (761088676675321856)
This user first linked the S1MXN video claiming it was the "only legit tool"

They then claim to have made the tool themselves

When called out they double down

I then replied to this message with the file hashes proving they did not edit anything and its just a direct rip

The interaction ends with them repeating the same stuff

================================================
FILE: Doc/Events.md
================================================
# Events Guide
This guide provides information on how to work with events, set up your system to see events, and how to use events in the tool.
## Video Guide
These guides will serve as video guides to getting the prerequisites setup. Please reference the text guide below for details.
### asutermo/Math/Shodan/etc's Guide
[](https://youtu.be/1UrEZi2p6w4)
### Cracked Fisk's Guide
[](https://www.youtube.com/watch?v=9-oAuq6zFVg)
## Table of Contents
- [Events Guide](#events-guide)
- [Video Guide](#video-guide)
- [asutermo/Math/Shodan/etc's Guide](#asutermomathshodanetcs-guide)
- [Cracked Fisk's Guide](#cracked-fisks-guide)
- [Table of Contents](#table-of-contents)
- [Information](#information)
- [Events Overview](#events-overview)
- [Anonymising Events](#anonymising-events)
- [Raw Event](#raw-event)
- [Anonymised Event](#anonymised-event)
- [Setup Guide](#setup-guide)
- [Prerequisites](#prerequisites)
- [Frida](#frida)
- [Wireshark](#wireshark)
- [Windows Settings](#windows-settings)
- [Viewing Events](#viewing-events)
- [Sending Events](#sending-events)
- [Headers](#headers)
- [Body](#body)
- [Errors](#errors)
- [Using Events In The Tool](#using-events-in-the-tool)
- [Support Overview](#support-overview)
- [Obtaining Your Events Token](#obtaining-your-events-token)
- [Adding Your Own Game](#adding-your-own-game)
- [Good Luck Achievements](#good-luck-achievements)
- [Bad Luck Achievements](#bad-luck-achievements)
- [Preparing a Template](#preparing-a-template)
- [Preparing the Criteria](#preparing-the-criteria)
- [Standard Replace](#standard-replace)
- [Range Replace (Int)](#range-replace-int)
- [Range Replace (Float)](#range-replace-float)
- [Special Replacements](#special-replacements)
- [Ordering Criteria](#ordering-criteria)
- [Examples](#examples)
- [Good Luck Achievement](#good-luck-achievement)
- [Step 1. Monitor an event of an achievement unlocking and anonymise that event data](#step-1-monitor-an-event-of-an-achievement-unlocking-and-anonymise-that-event-data)
- [Step 2. Figure out the important values within the data section](#step-2-figure-out-the-important-values-within-the-data-section)
- [Step 3. Create the template](#step-3-create-the-template)
- [Step 4. Create the data](#step-4-create-the-data)
- [Step 5. Add the achievement criteria](#step-5-add-the-achievement-criteria)
- [Bad Luck Achievement](#bad-luck-achievement)
- [Step 1. Monitor an event of an achievement unlocking and anonymise that event data](#step-1-monitor-an-event-of-an-achievement-unlocking-and-anonymise-that-event-data-1)
- [Step 2. Figure out the important values within the data section](#step-2-figure-out-the-important-values-within-the-data-section-1)
- [Step 3. Create the template](#step-3-create-the-template-1)
- [Step 4. Create the data](#step-4-create-the-data-1)
- [Step 5. Add the achievement criteria](#step-5-add-the-achievement-criteria-1)
- [Stats Editor](#stats-editor)
## Information
> [!WARNING]
> This document is techincal and is not intended to be user friendly. This is not intended for normal users.
### Events Overview
Each game has its own set of events that can modify stats. An event from Forza Horizon 3, activated when you purchase a car, as an example. The event is called `Microsoft.XboxLive.T1289871275.CarAddedToGarage`. The `T1289871275` part is the letter T followed by the game's TitleID. Most data outside of the Data section is not required to be valid, as you can see from the Anonymising Events section. Events require additional authentication, which is explained in the "Sending Events" section.
#### Anonymising Events
Events contain lots of identifying information you should remove before sharing them on the github repo. I will provide an example of an event straight from wireshark and one prepared to be put into the [events database github repository](https://github.com/Fumo-Unlockers/Events-Database)
##### Raw Event
```json
{
"ver": "4.0",
"name": "Microsoft.XboxLive.T1289871275.CarAddedToGarage",
"time": "2024-04-07T01:11:53.6748551Z",
"iKey": "o:0890af88a9ed4cc886a14f5e174a2827",
"ext": {
"utc": {
"shellId": 281572416699236352,
"eventFlags": 514,
"pgName": "XBOX",
"flags": 880804513,
"epoch": "903317",
"seq": 807
},
"privacy": {
"isRequired": false
},
"metadata": {
"f": {
"baseData": {
"f": {
"properties": {
"f": {
"BuildNum": 4,
"CarId": 4,
"IsHorizonEdition": 4,
"NumCarsInGarage": 4,
"Track": 4
}
}
}
}
},
"policies": 0
},
"os": {
"bootId": 284,
"name": "Windows",
"ver": "10.0.22621.3296.amd64fre.ni_release.220506-1250",
"expId": "RS:1B54D,MD:283BAEF,ME:28279A6,MD:2A69053,MD:255521A"
},
"app": {
"id": "U:Microsoft.OpusPG_1.0.125.2_x64__8wekyb3d8bbwe!OpusReleaseFinal",
"ver": "1.0.125.2_x64_!2018/06/05:22:52:33!60EF05C!forza_x64_release_final.exe",
"is1P": 1,
"asId": 898
},
"device": {
"localId": "s:0039DA16-8F86-463F-9EBE-CB0619831735",
"deviceClass": "Windows.Desktop"
},
"protocol": {
"devMake": "Micro-Star International Co., Ltd.",
"devModel": "MS-7E06",
"ticketKeys": ["21171495"]
},
"user": {
"localId": "w:EFEB6F6A-3B57-C3DA-5A6B-B5908C25B28C"
},
"loc": {
"tz": "+01:00"
}
},
"data": {
"baseType": "Microsoft.XboxLive.InGame",
"baseData": {
"name": "CarAddedToGarage",
"serviceConfigId": "19020100-9575-4c2b-9916-3d664ce1dfab",
"playerSessionId": "DBF9D623-02F2-4CAB-866E-EDF6908C9491",
"titleId": "1289871275",
"userId": "1234567890123456",
"ver": 1,
"properties": {
"BuildNum": 156858,
"CarId": 302,
"IsHorizonEdition": 0,
"NumCarsInGarage": 20,
"Track": 552
}
}
}
}
```
##### Anonymised Event
```json
{
"ver": "4.0",
"name": "Microsoft.XboxLive.T1289871275.CarAddedToGarage",
"time": "REPLACETIME",
"iKey": "o:0890af88a9ed4cc886a14f5e174a2827",
"ext": {
"utc": {
"shellId": 1,
"eventFlags": 1,
"pgName": "XBOX",
"flags": 1,
"epoch": "1",
"seq": REPLACESEQ
},
"privacy": {
"isRequired": false
},
"metadata": {
"f": {
"baseData": {
"f": {
"properties": {
"f": {
"BuildNum": 1,
"CarId": 1,
"IsHorizonEdition": 1,
"NumCarsInGarage": 1,
"Track": 1
}
}
}
}
},
"policies": 0
},
"os": {
"bootId": 1,
"name": "1",
"ver": "1",
"expId": "1"
},
"app": {
"id": "U:Microsoft.OpusPG_1.0.125.2_x64__8wekyb3d8bbwe!OpusReleaseFinal",
"ver": "1.0.125.2_x64_!2018/06/05:22:52:33!60EF05C!forza_x64_release_final.exe",
"is1P": 1,
"asId": 1
},
"device": {
"localId": "s:11111111-1111-1111-1111-111111111111",
"deviceClass": "Windows.Desktop"
},
"protocol": {
"devMake": "1",
"devModel": "1",
"ticketKeys": [
"1"
]
},
"user": {
"localId": "w:11111111-1111-1111-1111-111111111111"
},
"loc": {
"tz": "+01:00"
}
},
"data": {
"baseType": "Microsoft.XboxLive.InGame",
"baseData": {
"name": "CarAddedToGarage",
"serviceConfigId": "19020100-9575-4c2b-9916-3d664ce1dfab",
"playerSessionId": "11111111-1111-1111-1111-111111111111",
"titleId": "1289871275",
"userId": "REPLACEXUID",
"ver": 1,
"properties": {
"BuildNum": 156858,
"CarId": 302,
"IsHorizonEdition": 0,
"NumCarsInGarage": 20,
"Track": 552
}
}
}
}
```
### Setup Guide
This section guides you through the process of setting up your system to view events.
#### Prerequisites
To monitor events and use the event-based unlocker in the tool, you need to install Wireshark and Frida and configure them.
##### Frida
The easiest way to install frida is using python pip. You can install frida by running the command
```
pip install frida-tools
```
You can view all install methods on the github repository: https://github.com/frida/frida
> [!WARNING]
> You must do the following steps if you are using Windows 11
>
> 1. Open Windows Security
> 2. App & Browser Control>Exploit Protection>Programme Settings
> 3. Press the plus, Select program by name and enter `lsass.exe`
> 4. Scroll down until you see `Hardware Enforced Stack Protection`
> 5. Copy these settings:
>
> 
You also need a script to extract data from lsass.
Download the following [script](https://raw.githubusercontent.com/ngo/win-frida-scripts/master/lsasslkeylog-easy/keylog.js) and save it somewhere you will remember for the Viewing Events section
##### Wireshark
1. Install wireshark using the installer on the [website](https://www.wireshark.org/download.html)
2. Make an empty file on the root of your C: drive `C:\keylog.log`
3. Open wireshark and go to Edit>Preferences
4. Click on Name Resolution and make sure your settings are set like this:

5. Go to Protocols>TLS and then select `C:keylog.log` as (Pre)-Master-Secret log filename
##### Windows Settings
1. Press Win+R and type in `services.msc`
2. Open this and scroll until you see `Connected User Experiences and Telemetry`
3. Double click this and change the `Startup Type` to `Automatic`
4. Restart (maybe?)
#### Viewing Events
This section explains how to use Wireshark and Frida to view events from an event-based game.
1. Open an administrator terminal
2. Run frida using the following command `frida lsass.exe -l \Path\To\keylog.js `
3. You should get output like this:

4. Open wireshark and select your network interface
5. Put the following string into your filter box `tls && http2 && ip.dst_host contains "cloudapp.azure.com"`
6. Open your game of choice and start doing things
7. Look back at wireshark and you will (hopefully) see requests to a few cloudapp.azure.com domains

8. Now click on "DATA" and then navigate to `Uncompressed entity body`
9. You can now read events (yay)
#### Sending Events
This section will be relatively bare as I assume anyone who wants to test and play around with events like this is smart enough to figure stuff out with minimal handholding. I will be using the visual studio code extension `Thunder Client` but any HTTP client will do
To start off you will need an event to work with. Get one from the Viewing Events section
##### Headers
Now not all headers are required. You only need the following headers:

All headers other than `tickets` and `authxtoken` are static.
##### Body
The json body **_cannot_** be formatted. The endpoint will throw back a parsing error if it is. Use a json minifier before sending the data away if you want to edit it while it is formatted nicely.
You must also increment the `seq` value every time after sending an event. This increment does not need to be by 1 so if you lose your place you can just add 100 or 1000 to the value
##### Errors
The endpoint is nice about formatting errors and it tells you when they exist but other than that it is pretty quiet about errors. If any of your auth tokens are expired it will silently fail while giving a 200 response and the same acc 1 json it would on a success.
The same goes for not incrementing seq
## Using Events In The Tool
### Support Overview
The tool supports manually defined achievement criteria and has a stats editor in progress.
#### Obtaining Your Events Token
To use the event-based functionality in the tool, you need to input your own events token.
1. Follow the guide for Viewing Events
2. Instead of clicking on `DATA` click on `HEADERS`
3. You want to scroll until you see a tickets header that starts with something like `"2145125"="x:XBL3.0 x="` (The number will be different)
4. Copy from the start of `x:XBL3.0 x=` and stop before the last `"`. You should completely skip the number and anything before the first x
5. Your copied token should look something like this `x:XBL3.0 x=somenumbers;a very large amount of letters`
6. You now have a usable Events Token to input into the tool
### Adding Your Own Game
This section explains how to add support for a game, find the correct events and stats, and prepare a template and criteria.
#### Good Luck Achievements
These achievements work similarly to title-based games and only require an ID input into a generic "achievement unlocked" event.
As an example here is the data section of a Gears of War 4 event called `Microsoft.XboxLive.T552499398.UnlockAchievement`
```json
"data": {
"baseType": "Microsoft.XboxLive.InGame",
"baseData": {
"name": "UnlockAchievement",
"serviceConfigId": "780f0100-3c66-41ff-b8cc-964f20ee78c6",
"playerSessionId": "11111111-1111-1111-1111-111111111111",
"titleId": "552499398",
"userId": "1234567890123456",
"ver": 1,
"properties": {
"AchievementID": 1,
"MatchId": "Front End",
"MatchJoinId": 0
},
"measurements": {
"ProgressPercent": 1
}
}
}
```
These achievements are very easy to unlock and don't require much work to support as you can just try every AchivementID and then take note of which achievements unlock to then write the criteria.
#### Bad Luck Achievements
These achievements require specific stats to be unlocked. These achievements are much harder to work with and take more work to support (usually due to multiple requirements per achievement). As an example I will use the data section of a Halo MCC event called `Microsoft.XboxLive.T1144039928.MissionCompleted` This is a generic Mission Complete event which means it will handle most if not all mission completion achievements for this game.
```json
"data": {
"baseType": "Microsoft.XboxLive.InGame",
"baseData": {
"name": "MissionCompleted",
"serviceConfigId": "77290100-225e-4768-9373-98164430a9f8",
"titleId": "1144039928",
"userId": "1234567890123456",
"properties": {
"Coop": 0,
"DatePlayedUTC": 133577376536650000,
"DifficultyId": 1,
"GameCategoryId": 18,
"HaloTitleId": "HaloReach",
"Kills": 358,
"MapId": 179,
"MissionScore64": 235767,
"NumPlayers": 1,
"Penalties": 0,
"PlayerSectionStats": "{\\\"scores\\\":[0.0,0.0,1553.0,2669.0,3398.0],\\\"interpolatedScores\\\":[0.0,0.0,4659.0,7995.43408203125,7169.02197265625],\\\"times\\\":[0,1,2,3,4],\\\"sectionIDs\\\":[652215696,534971578,329253778,976357054,976684729],\\\"deaths\\\":0,\\\"numPlayers\\\":1,\\\"skullMask\\\":0,\\\"skullCount\\\":0}",
"SkullUsedFlags": 0,
"TimePlayedMS": 92356,
"TotalCoopMissionsComplete": 0,
"TotalSoloMissionsComplete": 2
},
"measurements": {
"Multiplier": 2.35,
"SkullMultiplier": 1
}
}
}
```
As you can see there is a significant amount of data in this data section. For example, to meet criteria for a mission complete the only thing needed is the correct `MapId` however if you wanted to unlock the achievement for par score you would also need a `MissionScore64` value above the par score criteria, the same goes for par time and `TimePlayedMS` although you would want it under the criteria in that case. Guessing from other data available this event could also be used to get the achievements for LASO runs and possibly even some kill related achievements.
#### Preparing a Template
Each game needs a template, I will be using Halo MCC as an example for this section. I will show criteria for both a Good Luck and a Bad Luck achievement.
You first need to anonymise the event using the [Anonymising Events](#anonymising-events) section
Now you need to figure out which criteria you need to create and where you would need to place these criteria
#### Preparing the Criteria
The criteria replace certain strings within the template.
##### Standard Replace
This is the most common type of replacement for criteria and the most simple.
Example from Achievement 900 from halo MCC
```json
"Replacement1": {
"ReplacementType": "Replace",
"Target": "REPLACEMAPID",
"Replacement": 179
},
```
This replaces the string `REPLACEMAPID` with the number `179`
##### Range Replace (Int)
This type of replacement will be required when data is on leaderboards like halo MCC where I would not like all users to have exactly the same statistics as well as for other achievements relating to clearing something within a certain time.
Example from Achievement 900 from halo MCC:
```json
"Replacement3": {
"ReplacementType": "RangeInt",
"Target": "REPLACEMISSIONSCORE",
"Min": 12750,
"Max": 14999
},
```
This replaces the string `REPLACEMISSIONSCORE` with a number between `12750` and `14999`
##### Range Replace (Float)
This type of replacement is the same as the above but for Float numbers instead of Integers
Example from Achievement 900 from halo MCC:
```json
"Replacement5": {
"ReplacementType": "RangeFloat",
"Target": "REPLACEMULTIPLIER",
"Min": 1,
"Max": 2
},
```
This replaces the string `REPLACEMULTIPLIER` with a float between `1` and `2`
##### Special Replacements
These replacements are either required by the tool or are created as exceptions to fill out data otherwise impossible.
They currently consist of:
- REPLACEXUID (Required)
- REPLACETIME (Required)
- REPLACESEQ (Required)
- LDAP timestamp (Exception: Created for Halo MCC mission completion timestamp)
##### Ordering Criteria
The order of the criteria within the data.json file is important as the tool starts from the top and works its way down. This allows you to replace parts of data you have previously placed.
#### Examples
##### Good Luck Achievement
In this example, I will be using Gears Of War 4
###### Step 1. Monitor an event of an achievement unlocking and anonymise that event data
```json
{
"ver": "4.0",
"name": "Microsoft.XboxLive.T552499398.UnlockAchievement",
"time": "REPLACETIME",
"iKey": "o:0890af88a9ed4cc886a14f5e174a2827",
"ext": {
"utc": {
"shellId": 1,
"eventFlags": 1,
"pgName": "XBOX",
"flags": 1,
"epoch": "1",
"seq": REPLACESEQ
},
"privacy": {
"isRequired": false
},
"metadata": {
"f": {
"baseData": {
"f": {
"properties": {
"f": {
"AchievementID": 1,
"MatchJoinId": 1
}
},
"measurements": {
"f": {
"ProgressPercent": 1
}
}
}
}
},
"policies": 0
},
"os": {
"bootId": 1,
"name": "1",
"ver": "1",
"expId": "1"
},
"app": {
"id": "U:Microsoft.SpartaUWP_14.4.0.2_x64__8wekyb3d8bbwe!GearGameShippingPublic",
"ver": "14.4.0.2_x64_!2019/06/27:23:38:26!9474C5E!geargame.exe",
"is1P": 1,
"asId": 1
},
"device": {
"localId": "s:11111111-1111-1111-1111-111111111111",
"deviceClass": "Windows.Desktop"
},
"protocol": {
"devMake": "1",
"devModel": "1",
"ticketKeys": [
"1"
]
},
"user": {
"localId": "s:11111111-1111-1111-1111-111111111111"
},
"loc": {
"tz": "00:00"
}
},
"data": {
"baseType": "Microsoft.XboxLive.InGame",
"baseData": {
"name": "UnlockAchievement",
"serviceConfigId": "780f0100-3c66-41ff-b8cc-964f20ee78c6",
"playerSessionId": "11111111-1111-1111-1111-111111111111",
"titleId": "552499398",
"userId": "REPLACEXUID",
"ver": 1,
"properties": {
"AchievementID": 4,
"MatchId": "11111111-1111-1111-1111-111111111111",
"MatchJoinId": 0
},
"measurements": {
"ProgressPercent": 1
}
}
}
}
```
###### Step 2. Figure out the important values within the data section
In this case, it would be the AchievementID which is 4. We can check our recently unlocked achievements to see that this ID matches up with the Triple Play achievement which is ID 70 on the API
###### Step 3. Create the template
Knowing that AchievementId is our only important value we can set up the template like this:
```json
{
"ver": "4.0",
"name": "Microsoft.XboxLive.T552499398.UnlockAchievement",
"time": "REPLACETIME",
"iKey": "o:0890af88a9ed4cc886a14f5e174a2827",
"ext": {
"utc": {
"shellId": 1,
"eventFlags": 1,
"pgName": "XBOX",
"flags": 1,
"epoch": "1",
"seq": REPLACESEQ
},
"privacy": {
"isRequired": false
},
"metadata": {
"f": {
"baseData": {
"f": {
"properties": {
"f": {
"AchievementID": 1,
"MatchJoinId": 1
}
},
"measurements": {
"f": {
"ProgressPercent": 1
}
}
}
}
},
"policies": 0
},
"os": {
"bootId": 1,
"name": "1",
"ver": "1",
"expId": "1"
},
"app": {
"id": "U:Microsoft.SpartaUWP_14.4.0.2_x64__8wekyb3d8bbwe!GearGameShippingPublic",
"ver": "14.4.0.2_x64_!2019/06/27:23:38:26!9474C5E!geargame.exe",
"is1P": 1,
"asId": 1
},
"device": {
"localId": "s:11111111-1111-1111-1111-111111111111",
"deviceClass": "Windows.Desktop"
},
"protocol": {
"devMake": "1",
"devModel": "1",
"ticketKeys": [
"1"
]
},
"user": {
"localId": "s:11111111-1111-1111-1111-111111111111"
},
"loc": {
"tz": "00:00"
}
},
"data": {
"baseType": "Microsoft.XboxLive.InGame",
"baseData": {
"name": "UnlockAchievement",
"serviceConfigId": "780f0100-3c66-41ff-b8cc-964f20ee78c6",
"playerSessionId": "11111111-1111-1111-1111-111111111111",
"titleId": "552499398",
"userId": "REPLACEXUID",
"ver": 1,
"properties": {
"AchievementID": REPLACECRITERIA1,
"MatchId": "11111111-1111-1111-1111-111111111111",
"MatchJoinId": 0
},
"measurements": {
"ProgressPercent": 1
}
}
}
}
```
`REPLACECRITERIA1` is the only thing we need to change to unlock these Good Luck achievements.
This file will be saved as the TitleID `552499398.json`
###### Step 4. Create the data
Open `Data.json` and check to see if `552499398` is already in the `SupportedTitleIDs` list. It is not, meaning we need to add a new game entry to this file. The only supported game is currently Halo MCC

First, add the title ID to `SupportedTitleIDs`
```json
"SupportedTitleIDs": [
1144039928,
552499398
]
```
Secondly, create a new section within the json file
```json
"552499398": {
"FullySupported": false,
"Achievements": {
}
}
```
The json file should now look like this:

###### Step 5. Add the achievement criteria
We know that 4 matches up with achievement id 70 so we will add this
```json
"552499398": {
"FullySupported": false,
"Achievements": {
"70": {
"CriteriaReplacement": {
"ReplacementType": "Replace",
"Target": "REPLACECRITERIA1",
"Replacement": "4"
}
}
}
},
```
##### Bad Luck Achievement
The majority of this guide is the same as Good Luck achievement so I will only go over the changes
###### Step 1. Monitor an event of an achievement unlocking and anonymise that event data
```json
{
"ver": "4.0",
"name": "Microsoft.XboxLive.T1144039928.MissionCompleted",
"time": "REPLACETIME",
"iKey": "o:0890af88a9ed4cc886a14f5e174a2827",
"ext": {
"utc": {
"shellId": 1,
"eventFlags": 1,
"pgName": "XBOX",
"flags": 1,
"epoch": "1",
"seq": REPLACESEQ
},
"privacy": {
"dataType": 1,
"isRequired": false
},
"metadata": {
"f": {
"baseData": {
"f": {
"properties": {
"f": {
"AchievementId": 1
}
},
"ver": 1
}
}
},
"privTags": 1,
"policies": 0
},
"os": {
"bootId": 1,
"name": "1",
"ver": "1",
"expId": "1"
},
"app": {
"id": "U:Microsoft.Chelan_1.3385.0.0_x64__8wekyb3d8bbwe!HaloMCCShipping",
"ver": "1.3385.0.0_x64_!2024/01/03:17:50:38!3E58AE2!mccwinstore-win64-shipping.exe",
"is1P": 1,
"asId": 1
},
"device": {
"localId": "s:11111111-1111-1111-1111-111111111111",
"deviceClass": "Windows.Desktop"
},
"protocol": {
"devMake": "1",
"devModel": "1",
"ticketKeys": [
"1"
]
},
"user": {
"localId": "m:11111111111111111"
},
"loc": {
"tz": "00:00"
}
},
"data": {
"baseType": "Microsoft.XboxLive.InGame",
"baseData": {
"name": "MissionCompleted",
"serviceConfigId": "77290100-225e-4768-9373-98164430a9f8",
"titleId": "1144039928",
"userId": "REPLACEXUID",
"properties": {
"Coop": 0,
"DatePlayedUTC": 133583987328905914,
"DifficultyId": 1,
"GameCategoryId": 18,
"HaloTitleId": "HaloReach",
"Kills": 257,
"MapId": 179,
"MissionScore64": 13327,
"NumPlayers": 1,
"Penalties": 0,
"PlayerSectionStats": "{\\\"scores\\\":[0.0,1.0,2.0,3.0,4.0],\\\"interpolatedScores\\\":[0.0,1.0,2.0,3.0,4.0],\\\"times\\\":[0,1,2,3,4],\\\"sectionIDs\\\":[1,2,3,4,5],\\\"deaths\\\":0,\\\"numPlayers\\\":1,\\\"skullMask\\\":0,\\\"skullCount\\\":0}",
"SkullUsedFlags": 0,
"TimePlayedMS": 1014169,
"TotalCoopMissionsComplete": 0,
"TotalSoloMissionsComplete": 1
},
"measurements": {
"Multiplier": 1.3916192,
"SkullMultiplier": 1
}
}
}
}
```
###### Step 2. Figure out the important values within the data section
There are lots of important values in this section however we are only focusing on Par Time, Par score and normal completion achievements. I know this event is for the level winter contingency which I will assume is `MapId` 179. I can assume I will need a `MissionScore64` of >15000 for the Par score achievement and a `TimePlayedMS` of <900000 for the Par time achievement. `Kills` and `DatePlayedUTC` are also important values but have no bearing on the achievement criteria for the achievements we are currently working on
###### Step 3. Create the template
Step not required as MCC is already supported
###### Step 4. Create the data
Step not required as MCC is already supported
###### Step 5. Add the achievement criteria
I will be adding three achievements here. Due to MCC having both bad luck and good luck achievements I need to replace the event name and data section for every achievement. These three achievements will be: `We're Just Getting Started (900)`, `Winter Urgency(915)` `Ice In Your Veins(925)`
```json
"900": {
"EventReplacement": {
"ReplacementType": "Replace",
"Target": "REPLACEEVENT",
"Replacement": "Microsoft.XboxLive.T1144039928.MissionCompleted"
},
"DataReplacement": {
"ReplacementType": "Replace",
"Target": "REPLACEDATA",
"Replacement": "{\"baseType\":\"Microsoft.XboxLive.InGame\",\"baseData\":{\"name\":\"MissionCompleted\",\"serviceConfigId\":\"77290100-225e-4768-9373-98164430a9f8\",\"titleId\":\"1144039928\",\"userId\":\"REPLACEXUID\",\"properties\":{\"Coop\":0,\"DatePlayedUTC\":REPLACEDATEPLAYED,\"DifficultyId\":1,\"GameCategoryId\":18,\"HaloTitleId\":\"HaloReach\",\"Kills\":REPLACEKILLS,\"MapId\":REPLACEMAPID,\"MissionScore64\":REPLACEMISSIONSCORE,\"NumPlayers\":1,\"Penalties\":0,\"PlayerSectionStats\":\"{\\\\\\\"scores\\\\\\\":[0.0,1.0,2.0,3.0,4.0],\\\\\\\"interpolatedScores\\\\\\\":[0.0,1.0,2.0,3.0,4.0],\\\\\\\"times\\\\\\\":[0,1,2,3,4],\\\\\\\"sectionIDs\\\\\\\":[1,2,3,4,5],\\\\\\\"deaths\\\\\\\":0,\\\\\\\"numPlayers\\\\\\\":1,\\\\\\\"skullMask\\\\\\\":0,\\\\\\\"skullCount\\\\\\\":0}\",\"SkullUsedFlags\":0,\"TimePlayedMS\":REPLACETIMEPLAYED,\"TotalCoopMissionsComplete\":0,\"TotalSoloMissionsComplete\":1},\"measurements\":{\"Multiplier\":REPLACEMULTIPLIER,\"SkullMultiplier\":1}}}"
},
"Replacement1": {
"ReplacementType": "Replace",
"Target": "REPLACEMAPID",
"Replacement": 179
},
"Replacement2": {
"ReplacementType": "RangeInt",
"Target": "REPLACEKILLS",
"Min": 200,
"Max": 300
},
"Replacement3": {
"ReplacementType": "RangeInt",
"Target": "REPLACEMISSIONSCORE",
"Min": 12750,
"Max": 14999
},
"Replacement4": {
"ReplacementType": "RangeInt",
"Target": "REPLACETIMEPLAYED",
"Min": 900001,
"Max": 1035000
},
"Replacement5": {
"ReplacementType": "RangeFloat",
"Target": "REPLACEMULTIPLIER",
"Min": 1,
"Max": 2
},
"Replacement6": {
"ReplacementType": "StupidFuckingLDAPTimestamp",
"Target": "REPLACEDATEPLAYED"
}
},
"915": {
"EventReplacement": {
"ReplacementType": "Replace",
"Target": "REPLACEEVENT",
"Replacement": "Microsoft.XboxLive.T1144039928.MissionCompleted"
},
"DataReplacement": {
"ReplacementType": "Replace",
"Target": "REPLACEDATA",
"Replacement": "{\"baseType\":\"Microsoft.XboxLive.InGame\",\"baseData\":{\"name\":\"MissionCompleted\",\"serviceConfigId\":\"77290100-225e-4768-9373-98164430a9f8\",\"titleId\":\"1144039928\",\"userId\":\"REPLACEXUID\",\"properties\":{\"Coop\":0,\"DatePlayedUTC\":REPLACEDATEPLAYED,\"DifficultyId\":1,\"GameCategoryId\":18,\"HaloTitleId\":\"HaloReach\",\"Kills\":REPLACEKILLS,\"MapId\":REPLACEMAPID,\"MissionScore64\":REPLACEMISSIONSCORE,\"NumPlayers\":1,\"Penalties\":0,\"PlayerSectionStats\":\"{\\\\\\\"scores\\\\\\\":[0.0,1.0,2.0,3.0,4.0],\\\\\\\"interpolatedScores\\\\\\\":[0.0,1.0,2.0,3.0,4.0],\\\\\\\"times\\\\\\\":[0,1,2,3,4],\\\\\\\"sectionIDs\\\\\\\":[1,2,3,4,5],\\\\\\\"deaths\\\\\\\":0,\\\\\\\"numPlayers\\\\\\\":1,\\\\\\\"skullMask\\\\\\\":0,\\\\\\\"skullCount\\\\\\\":0}\",\"SkullUsedFlags\":0,\"TimePlayedMS\":REPLACETIMEPLAYED,\"TotalCoopMissionsComplete\":0,\"TotalSoloMissionsComplete\":1},\"measurements\":{\"Multiplier\":REPLACEMULTIPLIER,\"SkullMultiplier\":1}}}"
},
"Replacement1": {
"ReplacementType": "Replace",
"Target": "REPLACEMAPID",
"Replacement": 179
},
"Replacement2": {
"ReplacementType": "RangeInt",
"Target": "REPLACEKILLS",
"Min": 200,
"Max": 300
},
"Replacement3": {
"ReplacementType": "RangeInt",
"Target": "REPLACEMISSIONSCORE",
"Min": 12750,
"Max": 14999
},
"Replacement4": {
"ReplacementType": "RangeInt",
"Target": "REPLACETIMEPLAYED",
"Min": 765000,
"Max": 899999
},
"Replacement5": {
"ReplacementType": "RangeFloat",
"Target": "REPLACEMULTIPLIER",
"Min": 1,
"Max": 2
},
"Replacement6": {
"ReplacementType": "StupidFuckingLDAPTimestamp",
"Target": "REPLACEDATEPLAYED"
}
},
"925": {
"EventReplacement": {
"ReplacementType": "Replace",
"Target": "REPLACEEVENT",
"Replacement": "Microsoft.XboxLive.T1144039928.MissionCompleted"
},
"DataReplacement": {
"ReplacementType": "Replace",
"Target": "REPLACEDATA",
"Replacement": "{\"baseType\":\"Microsoft.XboxLive.InGame\",\"baseData\":{\"name\":\"MissionCompleted\",\"serviceConfigId\":\"77290100-225e-4768-9373-98164430a9f8\",\"titleId\":\"1144039928\",\"userId\":\"REPLACEXUID\",\"properties\":{\"Coop\":0,\"DatePlayedUTC\":REPLACEDATEPLAYED,\"DifficultyId\":1,\"GameCategoryId\":18,\"HaloTitleId\":\"HaloReach\",\"Kills\":REPLACEKILLS,\"MapId\":REPLACEMAPID,\"MissionScore64\":REPLACEMISSIONSCORE,\"NumPlayers\":1,\"Penalties\":0,\"PlayerSectionStats\":\"{\\\\\\\"scores\\\\\\\":[0.0,1.0,2.0,3.0,4.0],\\\\\\\"interpolatedScores\\\\\\\":[0.0,1.0,2.0,3.0,4.0],\\\\\\\"times\\\\\\\":[0,1,2,3,4],\\\\\\\"sectionIDs\\\\\\\":[1,2,3,4,5],\\\\\\\"deaths\\\\\\\":0,\\\\\\\"numPlayers\\\\\\\":1,\\\\\\\"skullMask\\\\\\\":0,\\\\\\\"skullCount\\\\\\\":0}\",\"SkullUsedFlags\":0,\"TimePlayedMS\":REPLACETIMEPLAYED,\"TotalCoopMissionsComplete\":0,\"TotalSoloMissionsComplete\":1},\"measurements\":{\"Multiplier\":REPLACEMULTIPLIER,\"SkullMultiplier\":1}}}"
},
"Replacement1": {
"ReplacementType": "Replace",
"Target": "REPLACEMAPID",
"Replacement": 179
},
"Replacement2": {
"ReplacementType": "RangeInt",
"Target": "REPLACEKILLS",
"Min": 200,
"Max": 300
},
"Replacement3": {
"ReplacementType": "RangeInt",
"Target": "REPLACEMISSIONSCORE",
"Min": 15001,
"Max": 17250
},
"Replacement4": {
"ReplacementType": "RangeInt",
"Target": "REPLACETIMEPLAYED",
"Min": 900001,
"Max": 1035000
},
"Replacement5": {
"ReplacementType": "RangeFloat",
"Target": "REPLACEMULTIPLIER",
"Min": 1,
"Max": 2
},
"Replacement6": {
"ReplacementType": "StupidFuckingLDAPTimestamp",
"Target": "REPLACEDATEPLAYED"
}
}
}
```
### Stats Editor
This section is under construction.
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.
================================================
FILE: LICENSE.MIT
================================================
MIT License
Copyright (c) 2021-2023 Leszek Pomianowski and WPF UI Contributors. https://dev.lepo.co/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# Xbox Achievement Unlocker
![GitHub contributors][contributors-badge]
![GitHub forks][forks-badge]
![GitHub stars][stars-badge]
![GitHub issues][issues-badge]
![GitHub release][release-badge]
[Join our Discord][discord-invite]
Unlock achievements on Microsoft/Xbox games with ease. This tool is inspired by the functionality of Steam Achievements Manager and is completely free to use.
## Table of Contents
- [Xbox Achievement Unlocker](#xbox-achievement-unlocker)
- [Table of Contents](#table-of-contents)
- [About Xbox Achievement Unlocker](#about-xbox-achievement-unlocker)
- [How It Works](#how-it-works)
- [Requirements](#requirements)
- [Features](#features)
- [Screenshots](#screenshots)
- [Events Guide](#events-guide)
- [Usage Guide](#usage-guide)
- [Future Improvements](#future-improvements)
- [Join Our Discord Server](#join-our-discord-server)
- [License](#license)
- [Sponsors](#sponsors)
- [ziqnr](#ziqnr)
## About Xbox Achievement Unlocker
There are numerous paid services offering tools or services to unlock a full game's achievements on your account. Xbox Achievement Unlocker is a free alternative that doesn't randomly add gamerscore from arbitrary games or charge you to unlock a game's achievements.
## How It Works
Xbox Achievement Unlocker uses code from memory.dll to extract the user's XAuth token from one of the Xbox app processes. This token is then used to make web requests to Xbox servers, pulling information on achievements and informing the server which of these achievements have been unlocked.
## Requirements
- [dotnet 8](https://download.visualstudio.microsoft.com/download/pr/77284554-b8df-4697-9a9e-4c70a8b35f29/6763c16069d1ab8fa2bc506ef0767366/dotnet-runtime-8.0.5-win-x64.exe)
- [New Xbox app](https://apps.microsoft.com/store/detail/xbox/9MV0B5HZVK9Z)
## Features
- Extract XAuth from Xbox app or use OAuth to login
- Obtain a list of games from the user or any selected XUID
- Unlock Achievements for any Title Managed game
- Spoof time in any game
- Automatic updates
- Automatically spoof time in the currently viewed game
- Search TA and use the Xbox API to get the titleID for any game with a store page
## Screenshots
Coming soon.
## Events Guide
See [Events](./Doc/Events.md) for details.
## Usage Guide
See [Discord](https://discord.com/channels/1013602813093359657/1233193528553640017) for comprehensive guides by Xolara.
## Future Improvements
- Stats editor
- Support for Event based stats
## Join Our Discord Server
Feel free to join our [Discord server][discord-invite] for updates and discussions.
## License
The UI for this program was built on top of the WPF-UI Fluent template as of [this commit](https://github.com/lepoco/wpfui/tree/c8cd75f6f82414a52a94d2a55fe2a21dd5db83d7) which is MIT licensed. Any and all modifications and/or additions to this template are GNU GPL licensed. You can find a copy of the licenses [here][LICENSE] and [here][MIT-LICENSE].
This tool uses the XboxAuthNet library which is also MIT licensed
## Sponsors
Thanks very much to all of my sponsors. Below are messages included as one of the sponsorship rewards
### ziqnr
"I have brain damage" - [ziqnr](https://github.com/ziqnr) 2024
[contributors-badge]: https://img.shields.io/github/contributors/ItsLogic/Xbox-Achievement-Unlocker?style=for-the-badge
[contributors-url]: https://github.com/ItsLogic/Xbox-Achievement-Unlocker/graphs/contributors
[forks-badge]: https://img.shields.io/github/forks/ItsLogic/Xbox-Achievement-Unlocker?style=for-the-badge
[forks-url]: https://github.com/ItsLogic/Xbox-Achievement-Unlocker/network/members
[stars-badge]: https://img.shields.io/github/stars/ItsLogic/Xbox-Achievement-Unlocker?style=for-the-badge
[stars-url]: https://github.com/ItsLogic/Xbox-Achievement-Unlocker/stargazers
[issues-badge]: https://img.shields.io/github/issues/ItsLogic/Xbox-Achievement-Unlocker?style=for-the-badge
[issues-url]: https://github.com/ItsLogic/Xbox-Achievement-Unlocker/issues
[release-badge]: https://img.shields.io/github/v/release/ItsLogic/Xbox-Achievement-Unlocker?style=for-the-badge
[release-url]: https://github.com/ItsLogic/Xbox-Achievement-Unlocker/releases
[discord-id]: https://img.shields.io/discord/1013602813093359657?logo=discord&style=for-the-badge
[discord-invite]: https://discord.gg/ugDvSw7cns
[WPF-Commit]: https://github.com/lepoco/wpfui/tree/c8cd75f6f82414a52a94d2a55fe2a21dd5db83d7
[LICENSE]:LICENSE
[MIT-LICENSE]:LICENSE.MIT
================================================
FILE: XAU/App.xaml
================================================
<Application x:Class="XAU.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
Exit="OnExit"
Startup="OnStartup">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ui:ThemesDictionary Theme="Dark" />
<ui:ControlsDictionary />
<ResourceDictionary Source="/Theme/ThemeConstants.xaml"/>
</ResourceDictionary.MergedDictionaries>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
</ResourceDictionary>
</Application.Resources>
</Application>
================================================
FILE: XAU/App.xaml.cs
================================================
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Wpf.Ui.Contracts;
using Wpf.Ui.Services;
using XAU.Services;
using XAU.ViewModels.Pages;
using XAU.ViewModels.Windows;
using XAU.Views.Pages;
using XAU.Views.Windows;
namespace XAU;
public partial class App
{
private static readonly IHost Host = Microsoft.Extensions.Hosting.Host
.CreateDefaultBuilder()
.ConfigureServices((_, services) =>
{
services.AddHostedService<ApplicationHostService>();
services.AddSingleton<MainWindow>();
services.AddSingleton<MainWindowViewModel>();
services.AddSingleton<INavigationService, NavigationService>();
services.AddSingleton<ISnackbarService, SnackbarService>();
services.AddSingleton<IContentDialogService, ContentDialogService>();
services.AddSingleton<HomePage>();
services.AddSingleton<HomeViewModel>();
services.AddSingleton<SettingsPage>();
services.AddSingleton<SettingsViewModel>();
services.AddSingleton<GamesPage>();
services.AddSingleton<GamesViewModel>();
services.AddSingleton<AchievementsPage>();
services.AddSingleton<AchievementsViewModel>();
services.AddSingleton<PlaceholderPage>();
services.AddSingleton<StatsPage>();
services.AddSingleton<StatsViewModel>();
services.AddSingleton<MiscPage>();
services.AddSingleton<MiscViewModel>();
services.AddSingleton<InfoPage>();
services.AddSingleton<InfoViewModel>();
services.AddSingleton<DebugPage>();
services.AddSingleton<DebugViewModel>();
}).Build();
private static T? GetService<T>() where T : class
{
return Host.Services.GetService(typeof(T)) as T;
}
private void OnStartup(object sender, StartupEventArgs e)
{
Host.Start();
SetupExceptionHandling();
}
private async void OnExit(object sender, ExitEventArgs e)
{
await Host.StopAsync();
Host.Dispose();
}
private void SetupExceptionHandling()
{
AppDomain.CurrentDomain.UnhandledException += (_, e) =>
{
ReportException((Exception)e.ExceptionObject);
};
DispatcherUnhandledException += (_, e) =>
{
ReportException(e.Exception);
e.Handled = true;
};
TaskScheduler.UnobservedTaskException += (_, e) =>
{
ReportException(e.Exception);
e.SetObserved();
};
}
private static void ReportException(Exception exception)
{
var mainWindowViewModel = GetService<MainWindowViewModel>();
mainWindowViewModel?.ShowErrorDialog(exception);
}
}
================================================
FILE: XAU/AssemblyInfo.cs
================================================
[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)]
================================================
FILE: XAU/Models/GitHubResponse.cs
================================================
using Newtonsoft.Json;
public class EventsUpdateResponse
{
public int Timestamp { get; set; }
public string? DataVersion { get; set; }
}
public class VersionResponse
{
public string? DownloadURL { get; set; }
public string? LatestBuildVersion { get; set; }
}
public class GitHubFile
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("path")]
public string Path { get; set; }
[JsonProperty("sha")]
public string Sha { get; set; }
[JsonProperty("size")]
public long Size { get; set; }
[JsonProperty("download_url")]
public string DownloadUrl { get; set; }
}
================================================
FILE: XAU/Models/MiscItems.cs
================================================
public class GameItem
{
public string Title { get; set; }
public string TitleId { get; set; }
public bool IsTitleBased { get; set; }
}
================================================
FILE: XAU/Models/XAUSettings.cs
================================================
public class XAUSettings
{
public string? SettingsVersion { get; set; }
public string? ToolVersion { get; set; }
public bool UnlockAllEnabled { get; set; }
public bool AutoSpooferEnabled { get; set; }
public bool AutoLaunchXboxAppEnabled { get; set; }
public bool LaunchHidden { get; set; }
public bool FakeSignatureEnabled { get; set; }
public bool RegionOverride { get; set; }
public bool UseAcrylic { get; set; }
public bool PrivacyMode { get; set; }
public bool OAuthLogin { get; set; }
public bool AutoGrabEventsToken { get; set; }
public string? CachedEventsToken { get; set; }
public DateTime? EventsTokenObtainedAt { get; set; }
public string? EventsUserHash { get; set; }
}
================================================
FILE: XAU/Models/XboxApiRequest.cs
================================================
// TODO: Clean up, set names, default fields, minor renames, etc.
public class GameTitleRequest
{
public string? Pfns { get; set; }
public List<string> TitleIds { get; set; } = new List<string>();
}
public class AchievementsArrayEntry
{
public string? id { get; set; }
public string percentComplete { get; set; } = "100";
}
public class UnlockTitleBasedAchievementRequest
{
public string action { get; set; } = @"progressUpdate";
public string serviceConfigId { get; set; } = StringConstants.ZeroUid;
public string? titleId { get; set; }
public string? userId { get; set; }
public List<AchievementsArrayEntry> achievements { get; set; } = new List<AchievementsArrayEntry>();
}
public class GameStat
{
public string Name { get; set; } = "MinutesPlayed";
public string? TitleId { get; set; }
}
public class GameStatsRequest
{
public string ArrangeByField { get; set; } = "xuid";
public List<string> Xuids { get; set; } = new List<string>();
public List<GameStat> Stats { get; set; } = new List<GameStat>();
}
public class HeartbeatRequest
{
public List<TitleRequest> titles { get; set; } = new List<TitleRequest>();
}
public class TitleRequest
{
public int expiration { get; set; } = 600;
public string? id { get; set; }
public string state { get; set; } = "active";
public string sandbox { get; set; } = "RETAIL";
}
public class GamepassProductsRequest
{
public List<string> Products { get; set; } = new List<string>();
}
================================================
FILE: XAU/Models/XboxApiResponse.cs
================================================
// OpenAPI or Swagger doesn't exist. But let's try and type the things we need to make parsing more readable
// https://learn.microsoft.com/en-us/gaming/gdk/_content/gc/reference/live/rest/atoc-xboxlivews-reference
// TODO: Clean up, set names, default fields, minor renames, etc.
public class PersonResponse
{
public string? Xuid { get; set; }
public bool IsFavorite { get; set; }
public bool IsFollowingCaller { get; set; }
public bool IsFollowedByCaller { get; set; }
public bool IsIdentityShared { get; set; }
public DateTime? AddedDateTimeUtc { get; set; }
public string? DisplayName { get; set; }
public string? RealName { get; set; }
public string? DisplayPicRaw { get; set; }
public string? ShowUserAsAvatar { get; set; }
public string? Gamertag { get; set; }
public string? GamerScore { get; set; }
public string? ModernGamertag { get; set; }
public string? ModernGamertagSuffix { get; set; }
public string? UniqueModernGamertag { get; set; }
public string? XboxOneRep { get; set; }
public string? PresenceState { get; set; }
public string? PresenceText { get; set; }
public object? PresenceDevices { get; set; }
public bool IsBroadcasting { get; set; }
public bool? IsCloaked { get; set; }
public bool IsQuarantined { get; set; }
public bool IsXbox360Gamerpic { get; set; }
public DateTime? LastSeenDateTimeUtc { get; set; }
public object? Suggestion { get; set; }
public object? Recommendation { get; set; }
public object? Search { get; set; }
public object? TitleHistory { get; set; }
public MultiplayerSummary? MultiplayerSummary { get; set; }
public object? RecentPlayer { get; set; }
public object? Follower { get; set; }
public PreferredColor? PreferredColor { get; set; }
public List<PresenceDetail> PresenceDetails { get; set; } = new List<PresenceDetail>();
public object? TitlePresence { get; set; }
public object? TitleSummaries { get; set; }
public object? PresenceTitleIds { get; set; }
public Detail? Detail { get; set; }
public object? CommunityManagerTitles { get; set; }
public object? SocialManager { get; set; }
public object? Broadcast { get; set; }
public object? Avatar { get; set; }
public List<LinkedAccount> LinkedAccounts { get; set; } = new List<LinkedAccount>();
public string? ColorTheme { get; set; }
public string? PreferredFlag { get; set; }
public List<object> PreferredPlatforms { get; set; } = new List<object>();
}
public class MultiplayerSummary
{
public List<object> JoinableActivities { get; set; } = new List<object>();
public List<object> PartyDetails { get; set; } = new List<object>();
public int InParty { get; set; }
}
public class PreferredColor
{
public string? PrimaryColor { get; set; }
public string? SecondaryColor { get; set; }
public string? TertiaryColor { get; set; }
}
public class PresenceDetail
{
public bool IsBroadcasting { get; set; }
public string? Device { get; set; }
public object? DeviceSubType { get; set; }
public object? GameplayType { get; set; }
public string? PresenceText { get; set; }
public string? State { get; set; }
public string? TitleId { get; set; }
public object? TitleType { get; set; }
public bool IsPrimary { get; set; }
public bool IsGame { get; set; }
public object? RichPresenceText { get; set; }
}
public class Detail
{
public string? AccountTier { get; set; }
public string? Bio { get; set; }
public bool IsVerified { get; set; }
public string? Location { get; set; }
public string? Tenure { get; set; }
public List<string> Watermarks { get; set; } = new List<string>();
public bool Blocked { get; set; }
public bool Mute { get; set; }
public int FollowerCount { get; set; }
public int FollowingCount { get; set; }
public bool HasGamePass { get; set; }
public List<string>? Genres { get; set; }
}
public class LinkedAccount
{
public string? NetworkName { get; set; }
public string? DisplayName { get; set; }
public bool ShowOnProfile { get; set; }
public bool IsFamilyFriendly { get; set; }
public string? Deeplink { get; set; }
}
public class Profile
{
public List<PersonResponse> People { get; set; } = new List<PersonResponse>();
public object? RecommendationSummary { get; set; }
public object? FriendFinderState { get; set; }
public object? AccountLinkDetails { get; set; }
}
public class XboxTitle
{
public string? TitleId { get; set; }
public string? Pfn { get; set; }
public string? BingId { get; set; }
public string? WindowsPhoneProductId { get; set; }
public required string Name { get; set; }
public string? Type { get; set; }
public List<string> Devices { get; set; } = new List<string>();
public string? DisplayImage { get; set; }
public string? MediaItemType { get; set; }
public string? ModernTitleId { get; set; }
public bool IsBundle { get; set; }
public BasicAchievementDetails? Achievement { get; set; }
public Stats? Stats { get; set; }
public GamePass? GamePass { get; set; }
public object? Images { get; set; }
public object? TitleHistory { get; set; }
public object? TitleRecord { get; set; }
public object? Detail { get; set; }
public object? FriendsWhoPlayed { get; set; }
public object? AlternateTitleIds { get; set; }
public object? ContentBoards { get; set; }
public string? XboxLiveTier { get; set; }
}
public class BasicAchievementDetails
{
public int CurrentAchievements { get; set; }
public int TotalAchievements { get; set; }
public int CurrentGamerscore { get; set; }
public int TotalGamerscore { get; set; }
public double ProgressPercentage { get; set; }
public int SourceVersion { get; set; }
}
public class Stats
{
public int SourceVersion { get; set; }
}
public class GamePass
{
public bool IsGamePass { get; set; }
}
public class GameTitle
{
public string? Xuid { get; set; }
public List<XboxTitle> Titles { get; set; } = new List<XboxTitle>();
}
public class GamepassData
{
public string? GamepassMembership { get; set; }
}
public class Gamepass
{
// This json response is actually massive, but we don't care
// TOOD: maybe we want to look at points/stuff later
public string? GamepassMembership { get; set; }
public GamepassData? Data { get; set; }
}
public class TitleHistory
{
public DateTime LastTimePlayed { get; set; }
public bool Visible { get; set; }
public bool CanHide { get; set; }
}
public class Title
{
public string? TitleId { get; set; }
public string? Pfn { get; set; }
public string? BingId { get; set; }
public string? ServiceConfigId { get; set; }
public string? WindowsPhoneProductId { get; set; }
public string? Name { get; set; }
public string? Type { get; set; }
public List<string> Devices { get; set; } = new List<string>();
public string? DisplayImage { get; set; }
public string? MediaItemType { get; set; }
public string? ModernTitleId { get; set; }
public bool IsBundle { get; set; }
public BasicAchievementDetails? Achievement { get; set; }
public object? Stats { get; set; }
public object? GamePass { get; set; }
public object? Images { get; set; }
public TitleHistory? TitleHistory { get; set; }
public object? TitleRecord { get; set; }
public Detail? Detail { get; set; }
public object? FriendsWhoPlayed { get; set; }
public object? AlternateTitleIds { get; set; }
public object? ContentBoards { get; set; }
public string? XboxLiveTier { get; set; }
}
public class TitlesList
{
public string? Xuid { get; set; }
public List<Title> Titles { get; set; } = new List<Title>();
}
public class ProfileSettings
{
public string? Id { get; set; }
public string? Value { get; set; }
}
public class ProfileUser
{
public string? Id { get; set; }
public string? HostId { get; set; }
public List<ProfileSettings> Settings { get; set; } = new List<ProfileSettings>();
public string? IsSponsoredUser { get; set; }
}
public class BasicProfile
{
public List<ProfileUser> ProfileUsers { get; set; } = new List<ProfileUser>();
}
public class Stat
{
public Dictionary<string, object> GroupProperties { get; set; } = new Dictionary<string, object>();
public string? Xuid { get; set; }
public string? Scid { get; set; }
public string? TitleId { get; set; }
public string? Name { get; set; }
public string? Type { get; set; }
public string? Value { get; set; }
public Dictionary<string, object> Properties { get; set; } = new Dictionary<string, object>();
}
public class StatListCollection
{
public string? ArrangeByField { get; set; }
public string? ArrangeByFieldId { get; set; }
public List<Stat> Stats { get; set; } = new List<Stat>();
}
public class GameStatsResponse
{
public List<object> Groups { get; set; } = new List<object>();
public List<StatListCollection> StatListsCollection { get; set; } = new List<StatListCollection>();
}
public class AchievementRewards
{
public string? name { get; set; }
public string? description { get; set; }
public string? value { get; set; }
public string? type { get; set; }
public MediaAsset? mediaAsset { get; set; }
public string? valueType { get; set; }
}
public class Rarity
{
public string? currentCategory { get; set; }
public string? currentPercentage { get; set; }
}
public class AchievementRequirements
{
public string? id { get; set; }
public string? current { get; set; }
public string? target { get; set; }
public string? operationType { get; set; }
public string? valueType { get; set; }
public string? ruleParticipationType { get; set; }
}
public class AchievementProgression
{
public List<AchievementRequirements> requirements { get; set; } = new List<AchievementRequirements>();
public string? timeUnlocked { get; set; }
}
public class TitleAssociation
{
public string? name { get; set; }
public string? id { get; set; }
}
public class MediaAsset
{
public string? name { get; set; }
public string? type { get; set; }
public string? url { get; set; }
}
public class OneCoreAchievementResponse // Xbox One Achievements
{
public Rarity? rarity { get; set; }
public object? gamerscore { get; set; }
public required string id { get; set; }
public string serviceConfigId { get; set; } = StringConstants.ZeroUid;
public required string name { get; set; }
public List<TitleAssociation> titleAssociations { get; set; } = new List<TitleAssociation>();
public string progressState { get; set; } = "Null";
public AchievementProgression? progression { get; set; }
public List<MediaAsset> mediaAssets { get; set; } = new List<MediaAsset>();
public List<string> platforms { get; set; } = new List<string>();
public bool isSecret { get; set; }
public string? description { get; set; }
public string? lockedDescription { get; set; }
public string? productId { get; set; }
public string? achievementType { get; set; }
public string? participationType { get; set; }
public TimeWindow? timeWindow { get; set; }
public List<AchievementRewards> rewards { get; set; } = new List<AchievementRewards>();
public string? estimatedTime { get; set; }
public string? deeplink { get; set; }
public string? isRevoked { get; set; }
public string? raritycurrentCategory { get; set; }
public string? raritycurrentPercentage { get; set; }
}
public class Xbox360AchievementEntry
{
public int id {get; set;}
public long titleId {get; set;}
public string name {get; set;}
public int gamerscore {get; set;}
public string description {get; set;}
public string lockedDescription {get; set;}
public string timeUnlocked {get; set;}
public bool isSecret {get; set;}
public Rarity? rarity {get; set;}
}
public class Xbox360AchievementResponse
{
public List<Xbox360AchievementEntry> achievements {get;set; } = new List<Xbox360AchievementEntry>();
}
public class AchievementsResponse
{
public List<OneCoreAchievementResponse> achievements { get; set; } = new List<OneCoreAchievementResponse>();
}
public class TimeWindow
{
public required string startDate { get; set; }
public required string endDate { get; set; }
}
public class Image
{
public string? URI { get; set; }
public int Height { get; set; }
public int Width { get; set; }
public string? Caption { get; set; }
}
public class Product
{
public bool PCPlatformPreinstallable { get; set; }
public string? ProductTitle { get; set; }
public string? ProductDescription { get; set; }
public string? ProductDescriptionShort { get; set; }
public string? PackageFamilyName { get; set; }
public string? ProductType { get; set; }
public object? ChildPackageFamilyNames { get; set; }
public string? XboxTitleId { get; set; }
public object? ChildXboxTitleIds { get; set; }
public int MinimumUserAge { get; set; }
public List<object> Children { get; set; } = new List<object>();
public List<string> Categories { get; set; } = new List<string>();
public List<object> Attributes { get; set; } = new List<object>();
public object? HeroTrailer { get; set; }
public Image? ImageBoxArt { get; set; }
public Image? ImageHero { get; set; }
public object? ImageTitledHero { get; set; }
public Image? ImagePoster { get; set; }
public object? ImageTile { get; set; }
public object? PCComingSoonDate { get; set; }
public object? PCExitDate { get; set; }
public object? UltimateComingSoonDate { get; set; }
public object? UltimateExitDate { get; set; }
public bool IsEAPlay { get; set; }
public List<object> XCloudSupportedInputs { get; set; } = new List<object>();
public object? GameCatalogExtensionId { get; set; }
public string? StoreId { get; set; }
}
public class GamePassProducts
{
public Dictionary<string, Product> Products { get; set; } = new Dictionary<string, Product>();
public List<object> InvalidIds { get; set; } = new List<object>();
}
================================================
FILE: XAU/Networking/DBoxRestAPI.cs
================================================
using System.Net;
using System.Net.Http;
using HtmlAgilityPack;
using Newtonsoft.Json.Linq;
public class DBoxRestApi
{
private readonly HttpClient _httpClient;
public DBoxRestApi()
{
// This is a placeholder for the Xbox REST API
var handler = new HttpClientHandler()
{
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};
_httpClient = new HttpClient(handler);
}
private void SetDefaultHeaders()
{
_httpClient.DefaultRequestHeaders.Clear();
_httpClient.DefaultRequestHeaders.Add(HeaderNames.AcceptEncoding, HeaderValues.AcceptEncoding);
_httpClient.DefaultRequestHeaders.Add(HeaderNames.Accept, HeaderValues.Accept);
}
public async Task<JObject> SearchAsync(string searchText)
{
_httpClient.DefaultRequestHeaders.Clear();
_httpClient.DefaultRequestHeaders.Add(HeaderNames.Accept, "application/json");
searchText = Uri.EscapeDataString(searchText);
var response = await _httpClient.GetAsync($"https://dbox.tools/api/title_ids/?name={searchText}&limit=100&offset=0");
var jsonString = await response.Content.ReadAsStringAsync();
if (response.IsSuccessStatusCode)
{
return JObject.Parse(jsonString);
}
else
{
throw new HttpRequestException($"Error fetching data: {response.StatusCode} - {jsonString}");
}
}
}
================================================
FILE: XAU/Networking/GithubRestApi.cs
================================================
using System.Net;
using System.Net.Http;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public class GithubRestApi
{
private readonly HttpClient _httpClient;
// User specifics
public GithubRestApi()
{
var handler = new HttpClientHandler()
{
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};
_httpClient = new HttpClient(handler);
}
private void SetDefaultHeaders()
{
_httpClient.DefaultRequestHeaders.Clear();
_httpClient.DefaultRequestHeaders.Add("User-Agent",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0");
_httpClient.DefaultRequestHeaders.Add(HeaderNames.AcceptEncoding, "gzip, deflate, br");
_httpClient.DefaultRequestHeaders.Add(HeaderNames.Accept,
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8");
}
public async Task<VersionResponse?> GetDevToolVersionAsync()
{
SetDefaultHeaders();
_httpClient.DefaultRequestHeaders.Add(HeaderNames.Host, Hosts.GitHubRaw);
var responseString =
await _httpClient.GetStringAsync("https://raw.githubusercontent.com/Fumo-Unlockers/Xbox-Achievement-Unlocker/Pre-Release/info.json");
return JsonConvert.DeserializeObject<VersionResponse>(responseString);
}
public async Task<dynamic> GetReleaseVersionAsync()
{
SetDefaultHeaders();
_httpClient.DefaultRequestHeaders.Add(HeaderNames.Host, Hosts.GitHubApi);
var responseString =
await _httpClient.GetStringAsync("https://api.github.com/repos/Fumo-Unlockers/Xbox-Achievement-unlocker/releases");
var jsonResponse = (dynamic)JArray.Parse(responseString);
return jsonResponse;
}
public async Task<EventsUpdateResponse?> CheckForEventUpdatesAsync()
{
SetDefaultHeaders();
_httpClient.DefaultRequestHeaders.Add(HeaderNames.Host, Hosts.GitHubRaw);
var responseString = await _httpClient.GetStringAsync("https://raw.githubusercontent.com/Fumo-Unlockers/Xbox-Achievement-Unlocker/Events-Data/meta.json");
return JsonConvert.DeserializeObject<EventsUpdateResponse>(responseString);
}
public async Task<GitHubFile?> GetXboxGamesDatabaseInfoAsync()
{
SetDefaultHeaders();
_httpClient.DefaultRequestHeaders.Add(HeaderNames.Host, Hosts.GitHubApi);
var responseString = await _httpClient.GetStringAsync("https://api.github.com/repos/Fumo-Unlockers/XboxGames/contents");
var files = JsonConvert.DeserializeObject<List<GitHubFile>>(responseString);
return files?.FirstOrDefault(f => f.Name.Equals("xbox_games.db", StringComparison.OrdinalIgnoreCase));
}
}
================================================
FILE: XAU/Networking/XboxRestApi.cs
================================================
using System.Net;
using System.Net.Http;
using System.Text;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using XAU.ViewModels.Pages;
using XAU.ViewModels.Windows;
public class XboxRestAPI
{
private readonly HttpClient _httpClient;
private readonly HttpClient _eventBasedClient; // Dumb, but needed for events for now
private readonly HttpClient _spooferClient;
// User specifics
private readonly string _xauth;
private readonly string _requestedResponseLanguage;
public XboxRestAPI(string xauth)
{
_xauth = xauth;
_requestedResponseLanguage = HomeViewModel.Settings.RegionOverride ? "en-GB" : System.Globalization.CultureInfo.CurrentCulture.Name;
var handler = new HttpClientHandler()
{
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};
_httpClient = new HttpClient(handler);
_spooferClient = new HttpClient(handler);
var insecureEventsHandler = new HttpClientHandler()
{
AutomaticDecompression = System.Net.DecompressionMethods.GZip | System.Net.DecompressionMethods.Deflate,
//This is an absolutely terrible idea but the stupid fucking events API just cries about SSL errors
ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
};
_eventBasedClient = new HttpClient(insecureEventsHandler);
}
private void SetDefaultHeaders()
{
_httpClient.DefaultRequestHeaders.Clear();
_httpClient.DefaultRequestHeaders.Add(HeaderNames.Authorization, _xauth);
_httpClient.DefaultRequestHeaders.Add(HeaderNames.AcceptLanguage, _requestedResponseLanguage);
_httpClient.DefaultRequestHeaders.Add(HeaderNames.AcceptEncoding, HeaderValues.AcceptEncoding);
_httpClient.DefaultRequestHeaders.Add(HeaderNames.Accept, HeaderValues.Accept);
#if DEBUG
Console.WriteLine("Headers in _httpClient:");
foreach (var header in _httpClient.DefaultRequestHeaders)
{
if (header.Key == "Authorization") continue;
Console.WriteLine($"{header.Key}: {string.Join(", ", header.Value)}");
}
#endif
}
private void SetDefaultSpooferHeaders()
{
_spooferClient.DefaultRequestHeaders.Clear();
_spooferClient.DefaultRequestHeaders.Add(HeaderNames.Authorization, _xauth);
_spooferClient.DefaultRequestHeaders.Add(HeaderNames.AcceptLanguage, _requestedResponseLanguage);
_spooferClient.DefaultRequestHeaders.Add(HeaderNames.AcceptEncoding, HeaderValues.AcceptEncoding);
_spooferClient.DefaultRequestHeaders.Add(HeaderNames.Accept, HeaderValues.Accept);
#if DEBUG
Console.WriteLine("Headers in _spooferClient:");
foreach (var header in _spooferClient.DefaultRequestHeaders)
{
if (header.Key == "Authorization") continue;
Console.WriteLine($"{header.Key}: {string.Join(", ", header.Value)}");
}
#endif
}
private void SetDefaultEventBasedHeaders()
{
_eventBasedClient.DefaultRequestHeaders.Clear();
_eventBasedClient.DefaultRequestHeaders.Add("user-agent", "MSDW");
_eventBasedClient.DefaultRequestHeaders.Add("cache-control", "no-cache");
_eventBasedClient.DefaultRequestHeaders.Add(HeaderNames.Accept, HeaderValues.Accept);
_eventBasedClient.DefaultRequestHeaders.Add(HeaderNames.AcceptEncoding, HeaderValues.AcceptEncoding);
_eventBasedClient.DefaultRequestHeaders.Add("reliability-mode", "standard");
_eventBasedClient.DefaultRequestHeaders.Add("client-version", "EUTC-Windows-C++-no-10.0.22621.3296.amd64fre.ni_release.220506-1250-no");
_eventBasedClient.DefaultRequestHeaders.Add("apikey", "0890af88a9ed4cc886a14f5e174a2827-9de66c5e-f867-43a8-a7b8-e0ddd481cca4-7548,95c1f21d6cb047a09e7b423c1cb2222e-9965f07b-54fa-498e-9727-9e8d24dec39e-7027");
_eventBasedClient.DefaultRequestHeaders.Add("Client-Id", "NO_AUTH");
_eventBasedClient.DefaultRequestHeaders.Add(HeaderNames.Host, Hosts.Telemetry);
_eventBasedClient.DefaultRequestHeaders.Add(HeaderNames.Connection, "close");
;
var authxtoken = Regex.Replace(_xauth, @"XBL3\.0 x=\d+;", "XBL3.0 x=-;");
_eventBasedClient.DefaultRequestHeaders.Add("authxtoken", authxtoken);
#if DEBUG
Console.WriteLine("Headers in _eventBasedClient:");
foreach (var header in _eventBasedClient.DefaultRequestHeaders)
{
if (header.Key == "authxtoken") continue;
Console.WriteLine($"{header.Key}: {string.Join(", ", header.Value)}");
}
#endif
}
public async Task<BasicProfile?> GetBasicProfileAsync()
{
SetDefaultHeaders();
_httpClient.DefaultRequestHeaders.Add(HeaderNames.ContractVersion, HeaderValues.ContractVersion2);
_httpClient.DefaultRequestHeaders.Add(HeaderNames.Host, Hosts.Profile);
_httpClient.DefaultRequestHeaders.Add(HeaderNames.Connection, HeaderValues.KeepAlive);
var response = await _httpClient.GetStringAsync(BasicXboxAPIUris.GamertagUrl);
return JsonConvert.DeserializeObject<BasicProfile>(response);
}
public async Task<Profile?> GetProfileAsync(string xuid)
{
SetDefaultHeaders();
_httpClient.DefaultRequestHeaders.Add(HeaderNames.ContractVersion, HeaderValues.ContractVersion5);
_httpClient.DefaultRequestHeaders.Add(HeaderNames.Host, Hosts.PeopleHub);
_httpClient.DefaultRequestHeaders.Add(HeaderNames.Connection, HeaderValues.KeepAlive);
var responseString = await _httpClient.GetStringAsync(string.Format(InterpolatedXboxAPIUrls.ProfileUrl, xuid));
return JsonConvert.DeserializeObject<Profile>(responseString);
}
public async Task<GameTitle?> GetGameTitleAsync(string xuid, string titleId)
{
if (string.IsNullOrWhiteSpace(xuid) || string.IsNullOrWhiteSpace(titleId))
{
// Don't send a request if we don't have the details
return null;
}
SetDefaultHeaders();
_httpClient.DefaultRequestHeaders.Add(HeaderNames.ContractVersion, HeaderValues.ContractVersion2);
var gameTitleRequest = new GameTitleRequest()
{
Pfns = null,
TitleIds = new List<string>() { titleId }
};
var gameTitleHttpResponse = await _httpClient.PostAsync(string.Format(InterpolatedXboxAPIUrls.TitleUrl, xuid), new StringContent(JsonConvert.SerializeObject(gameTitleRequest), Encoding.UTF8, HeaderValues.Accept));
var gameTitleResponse = await gameTitleHttpResponse.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<GameTitle>(gameTitleResponse);
}
public async Task<Gamepass?> GetGamepassMembershipAsync(string xuid)
{
if (string.IsNullOrWhiteSpace(xuid))
{
// Don't send a request if we don't have the details
return null;
}
SetDefaultHeaders();
var gpuHttpResponse = await _httpClient.GetAsync(string.Format(InterpolatedXboxAPIUrls.GamepassMembershipUrl, xuid));
var gpuResponse = await gpuHttpResponse.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<Gamepass>(gpuResponse);
}
public async Task<TitlesList?> GetGamesListAsync(string xuid)
{
if (string.IsNullOrWhiteSpace(xuid))
{
// Don't send a request if we don't have the details
return null;
}
SetDefaultHeaders();
_httpClient.DefaultRequestHeaders.Add(HeaderNames.ContractVersion, HeaderValues.ContractVersion2);
_httpClient.DefaultRequestHeaders.Add(HeaderNames.Host, Hosts.TitleHub);
_httpClient.DefaultRequestHeaders.Add(HeaderNames.Connection, HeaderValues.KeepAlive);
var responseString = await _httpClient.GetStringAsync(string.Format(InterpolatedXboxAPIUrls.TitlesUrl, xuid));
return JsonConvert.DeserializeObject<TitlesList>(responseString);
}
public async Task<JObject?> GetGamertagProfileAsync(string gamertag)
{
if (string.IsNullOrWhiteSpace(gamertag))
{
// Don't send a request if we don't have the details
return null;
}
SetDefaultHeaders();
_httpClient.DefaultRequestHeaders.Add(HeaderNames.ContractVersion, HeaderValues.ContractVersion2);
_httpClient.DefaultRequestHeaders.Add(HeaderNames.Host, Hosts.Profile);
string url = string.Format(InterpolatedXboxAPIUrls.GamertagSearch, gamertag);
var response = await _httpClient.GetAsync(url);
response.EnsureSuccessStatusCode();
var jsonResponse = await response.Content.ReadAsStringAsync();
return JObject.Parse(jsonResponse);
}
public async Task<GameStatsResponse?> GetGameStatsAsync(string xuid, string titleId)
{
if (string.IsNullOrWhiteSpace(xuid) || string.IsNullOrWhiteSpace(titleId))
{
// Don't send a request if we don't have the details
return null;
}
SetDefaultHeaders();
_httpClient.DefaultRequestHeaders.Add(HeaderNames.ContractVersion, HeaderValues.ContractVersion2);
var stat = new GameStat()
{
TitleId = titleId
};
var gameStatsRequest = new GameStatsRequest()
{
Xuids = new List<string>() { xuid },
Stats = new List<GameStat>() { stat }
};
var httpResponse = await _httpClient
.PostAsync(BasicXboxAPIUris.UserStatsUrl, new StringContent(JsonConvert.SerializeObject(gameStatsRequest), Encoding.UTF8, HeaderValues.Accept));
var response = await httpResponse.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<GameStatsResponse>(response);
}
public async Task SendHeartbeatAsync(string xuid, string spoofedTitleId)
{
if (string.IsNullOrWhiteSpace(xuid) || string.IsNullOrWhiteSpace(spoofedTitleId))
{
// Don't send a request if we don't have the details
return;
}
SetDefaultSpooferHeaders();
_spooferClient.DefaultRequestHeaders.Add(HeaderNames.ContractVersion, HeaderValues.ContractVersion3);
var heartbeatRequest = new HeartbeatRequest()
{
titles = new List<TitleRequest>()
{
new TitleRequest()
{
id = spoofedTitleId
}
}
};
await _spooferClient.PostAsync(
string.Format(InterpolatedXboxAPIUrls.HeartbeatUrl, xuid),
new StringContent(JsonConvert.SerializeObject(heartbeatRequest), Encoding.UTF8, HeaderValues.Accept));
}
public async Task StopHeartbeatAsync(string xuid)
{
if (string.IsNullOrWhiteSpace(xuid))
{
// Don't send a request if we don't have the details
return;
}
SetDefaultSpooferHeaders();
_spooferClient.DefaultRequestHeaders.Add(HeaderNames.ContractVersion, HeaderValues.ContractVersion3);
await _spooferClient.DeleteAsync(string.Format(InterpolatedXboxAPIUrls.HeartbeatUrl, xuid));
}
public async Task<AchievementsResponse?> GetAchievementsForTitleAsync(string xuid, string titleId)
{
if (string.IsNullOrWhiteSpace(xuid) || string.IsNullOrWhiteSpace(titleId))
{
// Don't send a request if we don't have the details
return null;
}
SetDefaultHeaders();
_httpClient.DefaultRequestHeaders.Add(HeaderNames.ContractVersion, HeaderValues.ContractVersion4);
_httpClient.DefaultRequestHeaders.Add(HeaderNames.Host, Hosts.Achievements);
_httpClient.DefaultRequestHeaders.Add(HeaderNames.Connection, HeaderValues.KeepAlive);
var httpResponse = await _httpClient.GetAsync(string.Format(InterpolatedXboxAPIUrls.QueryAchievementsUrl, xuid, titleId));
var response = await httpResponse.Content.ReadAsStringAsync();
var achievements = JsonConvert.DeserializeObject<AchievementsResponse>(response);
return achievements;
}
public async Task<Xbox360AchievementResponse?> GetAchievementsFor360TitleAsync(string xuid, string titleId)
{
if (string.IsNullOrWhiteSpace(xuid) || string.IsNullOrWhiteSpace(titleId))
{
// Don't send a request if we don't have the details
return null;
}
SetDefaultHeaders();
_httpClient.DefaultRequestHeaders.Add(HeaderNames.ContractVersion, HeaderValues.ContractVersion3);
_httpClient.DefaultRequestHeaders.Add(HeaderNames.Host, Hosts.Achievements);
_httpClient.DefaultRequestHeaders.Add(HeaderNames.Connection, HeaderValues.KeepAlive);
var httpResponse = await _httpClient.GetAsync(string.Format(InterpolatedXboxAPIUrls.QueryAchievements360Url, xuid, titleId));
var response = await httpResponse.Content.ReadAsStringAsync();
var achievements = JsonConvert.DeserializeObject<Xbox360AchievementResponse>(response);
return achievements;
}
public async Task UnlockTitleBasedAchievementAsync(string serviceConfigId, string titleId, string xuid, string achievementId, bool useFakeSignature = false)
{
// only unlock the specified achievement
await UnlockTitleBasedAchievementsAsync(serviceConfigId, titleId, xuid, new List<string>() { achievementId }, useFakeSignature);
}
public async Task UnlockTitleBasedAchievementsAsync(string serviceConfigId, string titleId, string xuid, List<string> achievementIds, bool useFakeSignature = false)
{
if (string.IsNullOrWhiteSpace(serviceConfigId) || string.IsNullOrWhiteSpace(titleId) || string.IsNullOrWhiteSpace(xuid) || achievementIds.Count == 0)
{
// Don't send a request if we don't have the details
return;
}
SetDefaultHeaders();
_httpClient.DefaultRequestHeaders.Add(HeaderNames.ContractVersion, HeaderValues.ContractVersion2);
_httpClient.DefaultRequestHeaders.Add(HeaderNames.Host, Hosts.Achievements);
_httpClient.DefaultRequestHeaders.Add(HeaderNames.Connection, HeaderValues.KeepAlive);
_httpClient.DefaultRequestHeaders.Add("User-Agent", "XboxServicesAPI/2021.10.20211005.0 c");
if (useFakeSignature)
{
_httpClient.DefaultRequestHeaders.Add(HeaderNames.Signature, HeaderValues.Signature);
}
// Split the requests into 50 achievements each. Anything over 100 seems to BadRequest. TODO: look into
// headers and see if we can send long data or w/e
const int chunkSize = 50;
for (int i = 0; i < achievementIds.Count; i += chunkSize)
{
var chunk = achievementIds.Skip(i).Take(chunkSize).ToList();
var unlockRequest = new UnlockTitleBasedAchievementRequest
{
titleId = titleId,
serviceConfigId = serviceConfigId,
userId = xuid,
achievements = chunk.Select(id => new AchievementsArrayEntry { id = id, percentComplete = "100" }).ToList()
};
var unlockBodyStr = JsonConvert.SerializeObject(unlockRequest);
var bodyconverted = new StringContent(unlockBodyStr, Encoding.UTF8, HeaderValues.Accept);
var response = await _httpClient.PostAsync(
string.Format(InterpolatedXboxAPIUrls.UpdateAchievementsUrl, xuid, serviceConfigId), bodyconverted);
if (response.StatusCode != HttpStatusCode.OK)
{
throw new HttpRequestException($"Failed to unlock achievement(s) for title {titleId} with status code {response.StatusCode}");
}
}
}
// TODO: see if we can handle the actual request body building
public async Task UnlockEventBasedAchievement(string eventsToken, StringContent requestBody)
{
if (string.IsNullOrWhiteSpace(eventsToken))
{
// Don't send a request if we don't have the details
return;
}
SetDefaultEventBasedHeaders();
_eventBasedClient.DefaultRequestHeaders.Add("tickets", $"\"1\"=\"{eventsToken}\"");
var response = await _eventBasedClient.PostAsync(BasicXboxAPIUris.TelemetryUrl, requestBody);
var responseBody = await response.Content.ReadAsStringAsync();
HomeViewModel.EventsLog($"POST {BasicXboxAPIUris.TelemetryUrl} => {(int)response.StatusCode} {response.StatusCode}");
HomeViewModel.EventsLog($"Response: {responseBody}");
if (!response.IsSuccessStatusCode)
{
HomeViewModel.EventsLog("Response headers:");
foreach (var header in response.Headers)
HomeViewModel.EventsLog($" {header.Key}: {string.Join(", ", header.Value)}");
}
}
public async Task<GamePassProducts?> GetTitleIdsFromGamePass(string prodId)
{
if (string.IsNullOrWhiteSpace(prodId))
{
// Don't send a request if we don't have the details
return null;
}
SetDefaultHeaders();
GamepassProductsRequest gamepassProducts = new GamepassProductsRequest()
{
Products = new List<string>() { prodId }
};
var titleIDsHttpResponse = await _httpClient.PostAsync(
BasicXboxAPIUris.GamepassCatalogUrl,
new StringContent(JsonConvert.SerializeObject(gamepassProducts)));
var titleIDsResponse = await titleIDsHttpResponse.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<GamePassProducts>(titleIDsResponse);
}
}
================================================
FILE: XAU/Services/ApplicationHostService.cs
================================================
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using XAU.Views.Pages;
using XAU.Views.Windows;
using Application = System.Windows.Application;
namespace XAU.Services
{
/// <summary>
/// Managed host of the application.
/// </summary>
public class ApplicationHostService : IHostedService
{
private readonly IServiceProvider _serviceProvider;
public ApplicationHostService(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
/// <summary>
/// Triggered when the application host is ready to start the service.
/// </summary>
/// <param name="cancellationToken">Indicates that the start process has been aborted.</param>
public async Task StartAsync(CancellationToken cancellationToken)
{
await HandleActivationAsync();
}
/// <summary>
/// Triggered when the application host is performing a graceful shutdown.
/// </summary>
/// <param name="cancellationToken">Indicates that the shutdown process should no longer be graceful.</param>
public async Task StopAsync(CancellationToken cancellationToken)
{
await Task.CompletedTask;
}
/// <summary>
/// Creates main window during activation.
/// </summary>
private async Task HandleActivationAsync()
{
await Task.CompletedTask;
if (!Application.Current.Windows.OfType<MainWindow>().Any())
{
var navigationWindow = _serviceProvider.GetRequiredService<MainWindow>();
navigationWindow.Loaded += OnNavigationWindowLoaded;
navigationWindow.Show();
}
}
private void OnNavigationWindowLoaded(object sender, RoutedEventArgs e)
{
if (sender is not MainWindow navigationWindow)
{
return;
}
navigationWindow.NavigationView.Navigate(typeof(HomePage));
}
}
}
================================================
FILE: XAU/Services/HttpServer/AchievementRoutes.cs
================================================
using Newtonsoft.Json;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Text;
public static class AchievementRoutes
{
private static readonly Dictionary<string, string> ServiceConfigCache = new();
public static Dictionary<string, Func<HttpListenerContext, Task>> GetRoutes(Func<XboxRestAPI> getXboxRestAPI, Func<string> getXUIDOnly)
{
return new Dictionary<string, Func<HttpListenerContext, Task>>
{
{ "/api/achievements/unlockall", async context => await UnlockAllAchievementsRequest(context, getXboxRestAPI, getXUIDOnly) },
{ "/api/achievements/unlock", async context => await UnlockAchievementRequest(context, getXboxRestAPI, getXUIDOnly) },
{ "/api/achievements/", async context => await AchievementsTitleRequest(context, getXboxRestAPI, getXUIDOnly) }
};
}
private static async Task AchievementsTitleRequest(HttpListenerContext context, Func<XboxRestAPI> getXboxRestAPI, Func<string> getXUIDOnly)
{
var request = context.Request;
var response = context.Response;
try
{
if (request.Url.Segments.Length < 3)
{
response.StatusCode = 400;
await SendJsonResponse(response, new { error = "No Title ID provided in URL" });
return;
}
string titleId = request.Url.Segments.Last().TrimEnd('/');
string xuid = getXUIDOnly?.Invoke();
if (string.IsNullOrWhiteSpace(xuid))
{
response.StatusCode = 400;
await SendJsonResponse(response, new { error = "No XUID found" });
return;
}
var xboxRestAPI = getXboxRestAPI();
var achievements = await xboxRestAPI.GetAchievementsForTitleAsync(xuid, titleId);
if (achievements == null || achievements.achievements == null || !achievements.achievements.Any())
{
var xbox360Achievements = await xboxRestAPI.GetAchievementsFor360TitleAsync(xuid, titleId);
if (xbox360Achievements != null)
{
await SendJsonResponse(response, xbox360Achievements);
return;
}
}
if (achievements == null)
{
response.StatusCode = 404;
await SendJsonResponse(response, new { error = "Achievements not found" });
return;
}
await SendJsonResponse(response, achievements);
}
catch (Exception ex)
{
response.StatusCode = 500;
await SendJsonResponse(response, new
{
error = ex.Message,
innerError = ex.InnerException?.Message
});
}
}
private static async Task UnlockAchievementRequest(HttpListenerContext context, Func<XboxRestAPI> getXboxRestAPI, Func<string> getXUIDOnly)
{
var request = context.Request;
var response = context.Response;
try
{
if (request.HttpMethod != "POST")
{
response.StatusCode = 405;
await SendJsonResponse(response, new { error = "Method not allowed. Use POST." });
return;
}
using var reader = new StreamReader(request.InputStream);
var body = await reader.ReadToEndAsync();
var unlockRequest = JsonConvert.DeserializeObject<UnlockAchievementRequest>(body);
if (unlockRequest == null || string.IsNullOrWhiteSpace(unlockRequest.TitleId) || string.IsNullOrWhiteSpace(unlockRequest.AchievementId))
{
response.StatusCode = 400;
await SendJsonResponse(response, new { error = "Invalid request. Provide TitleId and AchievementId in your body." });
return;
}
string xuid = getXUIDOnly?.Invoke();
if (string.IsNullOrWhiteSpace(xuid))
{
response.StatusCode = 400;
await SendJsonResponse(response, new { error = "No XUID found" });
return;
}
string serviceConfigId = await GetServiceConfigId(getXboxRestAPI, getXUIDOnly, unlockRequest.TitleId);
var xboxRestAPI = getXboxRestAPI();
await xboxRestAPI.UnlockTitleBasedAchievementAsync(
serviceConfigId,
unlockRequest.TitleId,
xuid,
unlockRequest.AchievementId
);
await SendJsonResponse(response, new
{
message = "Achievement unlocked successfully",
achievementId = unlockRequest.AchievementId,
titleId = unlockRequest.TitleId
});
}
catch (Exception ex)
{
response.StatusCode = 500;
await SendJsonResponse(response, new
{
error = ex.Message,
innerError = ex.InnerException?.Message
});
}
}
private static async Task UnlockAllAchievementsRequest(HttpListenerContext context, Func<XboxRestAPI> getXboxRestAPI, Func<string> getXUIDOnly)
{
var request = context.Request;
var response = context.Response;
try
{
if (request.HttpMethod != "POST")
{
response.StatusCode = 405;
await SendJsonResponse(response, new { error = "Method not allowed. Use POST." });
return;
}
using var reader = new StreamReader(request.InputStream);
var body = await reader.ReadToEndAsync();
var unlockRequest = JsonConvert.DeserializeObject<UnlockAllAchievementsRequest>(body);
if (unlockRequest == null || string.IsNullOrWhiteSpace(unlockRequest.TitleId))
{
response.StatusCode = 400;
await SendJsonResponse(response, new { error = "Invalid request. Provide TitleId in your body." });
return;
}
string serviceConfigId = await GetServiceConfigId(getXboxRestAPI, getXUIDOnly, unlockRequest.TitleId);
string xuid = getXUIDOnly?.Invoke();
if (string.IsNullOrWhiteSpace(xuid))
{
response.StatusCode = 400;
await SendJsonResponse(response, new { error = "No XUID found" });
return;
}
var xboxRestAPI = getXboxRestAPI();
var achievements = await xboxRestAPI.GetAchievementsForTitleAsync(xuid, unlockRequest.TitleId);
var achievementIds = achievements.achievements.Select(a => a.id).ToList();
await xboxRestAPI.UnlockTitleBasedAchievementsAsync(
serviceConfigId,
unlockRequest.TitleId,
xuid,
achievementIds
);
await SendJsonResponse(response, new
{
message = "All achievements unlocked successfully",
titleId = unlockRequest.TitleId,
totalAchievements = achievementIds.Count
});
}
catch (Exception ex)
{
response.StatusCode = 500;
await SendJsonResponse(response, new
{
error = ex.Message,
innerError = ex.InnerException?.Message
});
}
}
private static async Task<string> GetServiceConfigId(Func<XboxRestAPI> getXboxRestAPI, Func<string> getXUIDOnly, string titleId)
{
if (ServiceConfigCache.TryGetValue(titleId, out var cachedServiceConfigId))
{
return cachedServiceConfigId;
}
var xuid = getXUIDOnly?.Invoke();
if (string.IsNullOrWhiteSpace(xuid)) throw new Exception("No XUID found.");
var xboxRestAPI = getXboxRestAPI();
var achievements = await xboxRestAPI.GetAchievementsForTitleAsync(xuid, titleId);
if (achievements == null || achievements.achievements == null || !achievements.achievements.Any())
{
throw new Exception("Achievements not found for the title.");
}
var serviceConfigId = achievements.achievements.FirstOrDefault()?.serviceConfigId;
if (string.IsNullOrWhiteSpace(serviceConfigId))
{
throw new Exception("ServiceConfigId not found for the title.");
}
ServiceConfigCache[titleId] = serviceConfigId;
return serviceConfigId;
}
private static async Task SendJsonResponse(HttpListenerResponse response, object data)
{
var json = JsonConvert.SerializeObject(data);
var buffer = Encoding.UTF8.GetBytes(json);
response.ContentLength64 = buffer.Length;
response.ContentType = "application/json";
await response.OutputStream.WriteAsync(buffer);
response.Close();
}
}
public class UnlockAchievementRequest
{
public string TitleId { get; set; }
public string AchievementId { get; set; }
}
public class UnlockAllAchievementsRequest
{
public string TitleId { get; set; }
}
================================================
FILE: XAU/Services/HttpServer/EndpointRoutes.cs
================================================
using Newtonsoft.Json;
using System.Net;
using System.Text;
public static class EndpointRoutes
{
public static Dictionary<string, Func<HttpListenerContext, Task>> GetRoutes()
{
return new Dictionary<string, Func<HttpListenerContext, Task>>
{
{ "/api/", async context => await IndexPageRequest(context) },
{ "/", async context => await IndexPageRequest(context) }
};
}
private static async Task IndexPageRequest(HttpListenerContext context)
{
var response = context.Response;
response.ContentType = "application/json";
string htmlContent = @"
<!-- meow meow :) -->
<!DOCTYPE html>
<html lang=""en"">
<head>
<meta charset=""UTF-8"">
<meta name=""viewport"" content=""width=device-width, initial-scale=1.0"">
<title>XAU API Endpoints</title>
<link rel=""icon"" type=""image/x-icon"" href=""https://raw.githubusercontent.com/Fumo-Unlockers/Xbox-Achievement-Unlocker/refs/heads/Main/XAU/cirno.ico"">
<link href=""https://cdnjs.cloudflare.com/ajax/libs/tailwindcss/2.2.19/tailwind.min.css"" rel=""stylesheet"">
<script>
function openEndpoint(baseUrl, inputId) {
const input = document.getElementById(inputId);
const value = input.value.trim();
if (value) {
window.open(baseUrl + encodeURIComponent(value), '_blank');
} else {
alert('Oopsie Woopsy Fucky Wucky... Enter a value in the text box.');
}
}
function openEndpointWithTwoInputs(baseUrl, inputId1, middlePath, inputId2) {
const input1 = document.getElementById(inputId1);
const input2 = document.getElementById(inputId2);
const value1 = input1.value.trim();
const value2 = input2.value.trim();
if (value1 && value2) {
window.open(baseUrl + encodeURIComponent(value1) + middlePath + encodeURIComponent(value2), '_blank');
} else {
alert('Oopsie Woopsy Fucky Wucky... Enter a value in the text box.');
}
}
</script>
<style>
.placeholder {
color: #ef4444;
font-weight: bold;
}
</style>
</head>
<body class=""bg-gray-100 min-h-screen p-8"">
<div class=""container mx-auto"">
<h1 class=""text-4xl font-bold text-center mb-2 text-gray-800"">XAU API Endpoints</h1>
<p class=""text-center text-red-600 font-medium text-sm mb-6"">
Warning: These endpoints are still in beta and have not been extensively tested. Use at your own risk!
</p>
<div class=""grid md:grid-cols-2 lg:grid-cols-3 gap-6"">
<!-- START ENDPOINTS -->
<!-- Profile Endpoints -->
<div class=""bg-white rounded-xl shadow-lg p-6 relative"">
<span class=""absolute top-4 right-4 bg-blue-500 text-white px-2 py-1 rounded text-sm"">GET</span>
<h2 class=""text-xl font-semibold mb-4 text-gray-700"">/api/profile/me</h2>
<p class=""text-gray-600 mb-4"">Get the current user's profile information</p>
<a href=""/api/profile/me"" target=""_blank"" class=""btn bg-blue-600 text-white px-4 py-2 rounded hover:bg-blue-700"">Open Endpoint</a>
</div>
<div class=""bg-white rounded-xl shadow-lg p-6 relative"">
<span class=""absolute top-4 right-4 bg-blue-500 text-white px-2 py-1 rounded text-sm"">GET</span>
<h2 class=""text-xl font-semibold mb-4 text-gray-700"">/api/profile/xuid/<span class=""placeholder"">{xuid}</span></h2>
<p class=""text-gray-600 mb-4"">Get profile by XUID</p>
<div class=""flex items-center space-x-2"">
<input type=""text"" id=""xuidInput"" placeholder=""Enter XUID"" class=""flex-grow px-3 py-2 border rounded"">
<button onclick=""openEndpoint('/api/profile/xuid/', 'xuidInput')"" class=""bg-gray-500 text-white px-4 py-2 rounded hover:bg-gray-600"">Go</button>
</div>
</div>
<div class=""bg-white rounded-xl shadow-lg p-6 relative"">
<span class=""absolute top-4 right-4 bg-blue-500 text-white px-2 py-1 rounded text-sm"">GET</span>
<h2 class=""text-xl font-semibold mb-4 text-gray-700"">/api/profile/gt/<span class=""placeholder"">{gamertag}</span></h2>
<p class=""text-gray-600 mb-4"">Get profile by Gamertag</p>
<div class=""flex items-center space-x-2"">
<input type=""text"" id=""gamertagInput"" placeholder=""Enter Gamertag"" class=""flex-grow px-3 py-2 border rounded"">
<button onclick=""openEndpoint('/api/profile/gt/', 'gamertagInput')"" class=""bg-gray-500 text-white px-4 py-2 rounded hover:bg-gray-600"">Go</button>
</div>
</div>
<!-- Games Endpoints -->
<div class=""bg-white rounded-xl shadow-lg p-6 relative"">
<span class=""absolute top-4 right-4 bg-blue-500 text-white px-2 py-1 rounded text-sm"">GET</span>
<h2 class=""text-xl font-semibold mb-4 text-gray-700"">/api/games/me</h2>
<p class=""text-gray-600 mb-4"">Get the current user's games list</p>
<a href=""/api/games/me"" target=""_blank"" class=""btn bg-blue-600 text-white px-4 py-2 rounded hover:bg-blue-700"">Open Endpoint</a>
</div>
<div class=""bg-white rounded-xl shadow-lg p-6 relative"">
<span class=""absolute top-4 right-4 bg-blue-500 text-white px-2 py-1 rounded text-sm"">GET</span>
<h2 class=""text-xl font-semibold mb-4 text-gray-700"">/api/games/xuid/<span class=""placeholder"">{xuid}</span></h2>
<p class=""text-gray-600 mb-4"">Get games list by XUID</p>
<div class=""flex items-center space-x-2"">
<input type=""text"" id=""gamesXuidInput"" placeholder=""Enter XUID"" class=""flex-grow px-3 py-2 border rounded"">
<button onclick=""openEndpoint('/api/games/xuid/', 'gamesXuidInput')"" class=""bg-gray-500 text-white px-4 py-2 rounded hover:bg-gray-600"">Go</button>
</div>
</div>
<div class=""bg-white rounded-xl shadow-lg p-6 relative"">
<span class=""absolute top-4 right-4 bg-blue-500 text-white px-2 py-1 rounded text-sm"">GET</span>
<h2 class=""text-xl font-semibold mb-4 text-gray-700"">/api/games/gt/<span class=""placeholder"">{gamertag}</span></h2>
<p class=""text-gray-600 mb-4"">Get games list by Gamertag</p>
<div class=""flex items-center space-x-2"">
<input type=""text"" id=""gamesGamertagInput"" placeholder=""Enter Gamertag"" class=""flex-grow px-3 py-2 border rounded"">
<button onclick=""openEndpoint('/api/games/gt/', 'gamesGamertagInput')"" class=""bg-gray-500 text-white px-4 py-2 rounded hover:bg-gray-600"">Go</button>
</div>
</div>
<!-- XAuth Endpoint -->
<div class=""bg-white rounded-xl shadow-lg p-6 relative"">
<span class=""absolute top-4 right-4 bg-blue-500 text-white px-2 py-1 rounded text-sm"">GET</span>
<h2 class=""text-xl font-semibold mb-4 text-gray-700"">/api/xauth</h2>
<p class=""text-gray-600 mb-4"">Get XAuth token</p>
<a href=""/api/xauth"" target=""_blank"" class=""btn bg-blue-600 text-white px-4 py-2 rounded hover:bg-blue-700"">Plain Text Format</a>
<a href=""/api/xauth?format=json"" target=""_blank"" class=""btn bg-yellow-500 text-white px-4 py-2 rounded hover:bg-yellow-600 ml-2"">JSON Format</a>
</div>
<!-- Spoofing Endpoint -->
<div class=""bg-white rounded-xl shadow-lg p-6 relative"">
<span class=""absolute top-4 right-4 bg-blue-500 text-white px-2 py-1 rounded text-sm"">GET</span>
<h2 class=""text-xl font-semibold mb-4 text-gray-700"">/api/spoof/<span class=""placeholder"">{titleid}</span></h2>
<p class=""text-gray-600 mb-4"">Spoofs the specified title for 5 minutes. Make an API request every 5 minutes to keep the spoofer working.</p>
<div class=""flex items-center space-x-2"">
<input type=""text"" id=""spoofIdInput"" placeholder=""Enter Title ID"" class=""flex-grow px-3 py-2 border rounded"">
<button onclick=""openEndpoint('/api/spoof/', 'spoofIdInput')"" class=""bg-gray-500 text-white px-4 py-2 rounded hover:bg-gray-600"">Go</button>
</div>
</div>
<!-- Achievements Endpoint -->
<div class=""bg-white rounded-xl shadow-lg p-6 relative"">
<span class=""absolute top-4 right-4 bg-blue-500 text-white px-2 py-1 rounded text-sm"">GET</span>
<h2 class=""text-xl font-semibold mb-4 text-gray-700"">/api/achievements/<span class=""placeholder"">{titleid}</span></h2>
<p class=""text-gray-600 mb-4"">Get achievements for a specific title</p>
<div class=""flex items-center space-x-2"">
<input type=""text"" id=""titleIdInput"" placeholder=""Enter Title ID"" class=""flex-grow px-3 py-2 border rounded"">
<button onclick=""openEndpoint('/api/achievements/', 'titleIdInput')"" class=""bg-gray-500 text-white px-4 py-2 rounded hover:bg-gray-600"">Go</button>
</div>
</div>
<div class=""bg-white rounded-xl shadow-lg p-6 relative"">
<span class=""absolute top-4 right-4 bg-green-500 text-white px-2 py-1 rounded text-sm"">POST</span>
<h2 class=""text-xl font-semibold mb-4 text-gray-700"">/api/achievements/unlock</h2>
<p class=""text-gray-600 mb-4"">Unlock achievements of title-based game by ID.</p>
<div class=""flex space-x-4"">
<pre class=""bg-gray-800 text-white p-4 rounded-lg overflow-x-auto w-full whitespace-nowrap"">
<code class=""block"">{""titleId"": ""xxxxx"",""achievementId"": ""xxx""}</code>
</pre>
</div>
</div>
<div class=""bg-white rounded-xl shadow-lg p-6 relative"">
<span class=""absolute top-4 right-4 bg-green-500 text-white px-2 py-1 rounded text-sm"">POST</span>
<h2 class=""text-xl font-semibold mb-4 text-gray-700"">/api/achievements/unlockall</h2>
<p class=""text-gray-600 mb-4"">⚠️ BEWARE: Unlocks <u><strong>ALL</strong></u> achievements of a game ⚠️</p>
<div class=""flex space-x-4"">
<pre class=""bg-gray-800 text-white p-4 rounded-lg overflow-x-auto w-full whitespace-nowrap"">
<code class=""block""> {""TitleId"": ""xxxxx""} </code>
</pre>
</div>
</div>
<!-- Game Search Endpoints -->
<div class=""bg-white rounded-xl shadow-lg p-6 relative"">
<span class=""absolute top-4 right-4 bg-blue-500 text-white px-2 py-1 rounded text-sm"">GET</span>
<h2 class=""text-xl font-semibold mb-4 text-gray-700"">/api/games/search/titleid/<span class=""placeholder"">{titleid}</span></h2>
<p class=""text-gray-600 mb-4"">Retrieve game details for a specific Title ID.</p>
<div class=""flex items-center space-x-2"">
<input type=""text"" id=""searchTitleIdInput"" placeholder=""Enter Title ID"" class=""flex-grow px-3 py-2 border rounded"">
<button onclick=""openEndpoint('/api/games/search/titleid/', 'searchTitleIdInput')"" class=""bg-gray-500 text-white px-4 py-2 rounded hover:bg-gray-600"">GO</button>
</div>
</div>
<div class=""bg-white rounded-xl shadow-lg p-6 relative"">
<span class=""absolute top-4 right-4 bg-blue-500 text-white px-2 py-1 rounded text-sm"">GET</span>
<h2 class=""text-xl font-semibold mb-4 text-gray-700"">/api/games/search/productid/<span class=""placeholder"">{productid}</span></h2>
<p class=""text-gray-600 mb-4"">Retrieve game details for a specific product ID.</p>
<div class=""flex items-center space-x-2"">
<input type=""text"" id=""searchProductIdInput"" placeholder=""Enter Product ID"" class=""flex-grow px-3 py-2 border rounded"">
<button onclick=""openEndpoint('/api/games/search/productid/', 'searchProductIdInput')"" class=""bg-gray-500 text-white px-4 py-2 rounded hover:bg-gray-600"">GO</button>
</div>
<!-- END ENDPOINTS -->
</div>
</div>
</body>
</html>
";
var buffer = Encoding.UTF8.GetBytes(htmlContent);
response.ContentLength64 = buffer.Length;
response.ContentType = "text/html";
await response.OutputStream.WriteAsync(buffer);
response.Close();
}
}
================================================
FILE: XAU/Services/HttpServer/GameRoutes.cs
================================================
using Newtonsoft.Json;
using System.Net;
using System.Text;
public static class GameRoutes
{
public static Dictionary<string, Func<HttpListenerContext, Task>> GetRoutes(Func<XboxRestAPI> getXboxRestAPI, Func<string> getXUIDOnly)
{
return new Dictionary<string, Func<HttpListenerContext, Task>>
{
{ "/api/games/me", async context => await GamesMeRequest(context, getXboxRestAPI, getXUIDOnly) },
{ "/api/games/xuid/", async context => await GamesXuidRequest(context, getXboxRestAPI) },
{ "/api/games/gt/", async context => await GamesGamertagRequest(context, getXboxRestAPI) },
{ "/api/games/search/titleid/", async context => await GameTitleIDSearchRequest(context, getXboxRestAPI, getXUIDOnly) },
{ "/api/games/search/productid/", async context => await GameProductIDSearchRequest(context, getXboxRestAPI) }
};
}
private static async Task GamesMeRequest(HttpListenerContext context, Func<XboxRestAPI> getXboxRestAPI, Func<string> getXUIDOnly)
{
var response = context.Response;
try
{
string xuid = getXUIDOnly?.Invoke();
if (string.IsNullOrWhiteSpace(xuid))
{
response.StatusCode = 400;
await SendJsonResponse(response, new { error = "No XUID found" });
return;
}
var xboxRestAPI = getXboxRestAPI();
var gamesList = await xboxRestAPI.GetGamesListAsync(xuid);
if (gamesList == null)
{
response.StatusCode = 404;
await SendJsonResponse(response, new { error = "Games list not found" });
return;
}
await SendJsonResponse(response, gamesList);
}
catch (Exception ex)
{
response.StatusCode = 500;
await SendJsonResponse(response, new { error = ex.Message, innerError = ex.InnerException?.Message });
}
}
private static async Task GamesXuidRequest(HttpListenerContext context, Func<XboxRestAPI> getXboxRestAPI)
{
var request = context.Request;
var response = context.Response;
try
{
if (request.Url.Segments.Length < 3)
{
response.StatusCode = 400;
await SendJsonResponse(response, new { error = "No XUID provided in URL" });
return;
}
string xuid = request.Url.Segments.Last().TrimEnd('/');
var xboxRestAPI = getXboxRestAPI();
var gamesList = await xboxRestAPI.GetGamesListAsync(xuid);
if (gamesList == null)
{
response.StatusCode = 404;
await SendJsonResponse(response, new { error = "Games list not found" });
return;
}
await SendJsonResponse(response, gamesList);
}
catch (Exception ex)
{
response.StatusCode = 500;
await SendJsonResponse(response, new { error = ex.Message, innerError = ex.InnerException?.Message });
}
}
private static async Task GamesGamertagRequest(HttpListenerContext context, Func<XboxRestAPI> getXboxRestAPI)
{
var request = context.Request;
var response = context.Response;
try
{
if (request.Url.Segments.Length < 3)
{
response.StatusCode = 400;
await SendJsonResponse(response, new { error = "No Gamertag provided in URL" });
return;
}
string gamertag = request.Url.Segments.Last().TrimEnd('/');
var xboxRestAPI = getXboxRestAPI();
var gamertagProfile = await xboxRestAPI.GetGamertagProfileAsync(gamertag);
if (gamertagProfile == null || !gamertagProfile.ContainsKey("profileUsers"))
{
response.StatusCode = 404;
await SendJsonResponse(response, new { error = "Gamertag not found" });
return;
}
string xuid = gamertagProfile["profileUsers"][0]["id"].ToString();
var gamesList = await xboxRestAPI.GetGamesListAsync(xuid);
if (gamesList == null)
{
response.StatusCode = 404;
await SendJsonResponse(response, new { error = "Games list not found" });
return;
}
await SendJsonResponse(response, gamesList);
}
catch (Exception ex)
{
response.StatusCode = 500;
await SendJsonResponse(response, new { error = ex.Message, innerError = ex.InnerException?.Message });
}
}
private static async Task GameTitleIDSearchRequest(HttpListenerContext context, Func<XboxRestAPI> getXboxRestAPI, Func<string> getXUIDOnly)
{
var request = context.Request;
var response = context.Response;
try
{
if (request.Url.Segments.Length < 4)
{
response.StatusCode = 400;
await SendJsonResponse(response, new { error = "No Title ID provided in URL" });
return;
}
string titleId = request.Url.Segments.Last().TrimEnd('/');
string xuid = getXUIDOnly?.Invoke();
if (string.IsNullOrWhiteSpace(xuid))
{
response.StatusCode = 400;
await SendJsonResponse(response, new { error = "No XUID found" });
return;
}
var xboxRestAPI = getXboxRestAPI();
var gameTitle = await xboxRestAPI.GetGameTitleAsync(xuid, titleId);
if (gameTitle == null)
{
response.StatusCode = 404;
await SendJsonResponse(response, new { error = "No Games found" });
return;
}
await SendJsonResponse(response, gameTitle);
}
catch (Exception ex)
{
response.StatusCode = 500;
await SendJsonResponse(response, new { error = ex.Message, innerError = ex.InnerException?.Message });
}
}
private static async Task GameProductIDSearchRequest(HttpListenerContext context, Func<XboxRestAPI> getXboxRestAPI)
{
var request = context.Request;
var response = context.Response;
try
{
if (request.Url.Segments.Length < 4)
{
response.StatusCode = 400;
await SendJsonResponse(response, new { error = "No Product ID provided in URL" });
return;
}
string productId = request.Url.Segments.Last().TrimEnd('/');
var xboxRestAPI = getXboxRestAPI();
var gamePassProducts = await xboxRestAPI.GetTitleIdsFromGamePass(productId);
if (gamePassProducts == null)
{
response.StatusCode = 404;
await SendJsonResponse(response, new { error = "No Games found" });
return;
}
await SendJsonResponse(response, gamePassProducts);
}
catch (Exception ex)
{
response.StatusCode = 500;
await SendJsonResponse(response, new { error = ex.Message, innerError = ex.InnerException?.Message });
}
}
private static async Task SendJsonResponse(HttpListenerResponse response, object data)
{
var json = JsonConvert.SerializeObject(data);
var buffer = Encoding.UTF8.GetBytes(json);
response.ContentLength64 = buffer.Length;
response.ContentType = "application/json";
await response.OutputStream.WriteAsync(buffer);
response.Close();
}
}
================================================
FILE: XAU/Services/HttpServer/HttpServer.cs
================================================
using System.Diagnostics;
using System.Net;
using System.Security.Principal;
using System.Runtime.Versioning;
using System.Net.NetworkInformation;
using System.Net.Sockets;
namespace XAU.Services.HttpServer
{
public sealed class HttpServer : IDisposable
{
private readonly HttpListener _listener;
private readonly Dictionary<string, Func<HttpListenerContext, Task>> _routes;
private string _port;
private bool _isRunning;
private bool _disposed;
private const string FirewallRuleName = "XAU API Server";
public HttpServer(string port, Dictionary<string, Func<HttpListenerContext, Task>> routes)
{
_port = port;
_routes = routes;
_listener = new HttpListener();
UpdateListenerPrefixes();
}
private static bool IsAdministrator()
{
using var identity = WindowsIdentity.GetCurrent();
var principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
[SupportedOSPlatform("windows")]
public void RestartAsAdmin()
{
var startInfo = new ProcessStartInfo
{
UseShellExecute = true,
WorkingDirectory = Environment.CurrentDirectory,
FileName = Process.GetCurrentProcess().MainModule?.FileName,
Verb = "runas"
};
Process.Start(startInfo);
Environment.Exit(0);
}
private void UpdateListenerPrefixes()
{
_listener.Prefixes.Clear();
_listener.Prefixes.Add($"http://localhost:{_port}/");
if (IsAdministrator())
{
// Admin required for other PCs on the network to access API (ex: XAU Mobile)
_listener.Prefixes.Add($"http://*:{_port}/");
}
}
public static void AddFirewallRule(string port)
{
if (RuleExists(port)) return;
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "netsh",
Arguments = $"advfirewall firewall add rule name=\"{FirewallRuleName}\" dir=in action=allow protocol=TCP localport={port}",
Verb = "runas",
UseShellExecute = true,
CreateNoWindow = true
}
};
process.Start();
process.WaitForExit();
}
private static bool RuleExists(string port)
{
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "netsh",
Arguments = $"advfirewall firewall show rule name=\"{FirewallRuleName}\"",
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true
}
};
process.Start();
var output = process.StandardOutput.ReadToEnd();
process.WaitForExit();
return output.Contains(port);
}
public string GetListeningAddress()
{
if (_listener.Prefixes.Count == 1 && _listener.Prefixes.First().Contains("localhost"))
{
return $"http://localhost:{_port}";
}
return $"http://{GetLocalIPAddress()}:{_port}";
}
public static string GetLocalIPAddress()
{
try
{
var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces()
.Where(n => n.OperationalStatus == OperationalStatus.Up
&& n.NetworkInterfaceType != NetworkInterfaceType.Loopback);
foreach (var network in networkInterfaces)
{
var properties = network.GetIPProperties();
var ipv4 = properties.UnicastAddresses
.FirstOrDefault(ua => ua.Address.AddressFamily == AddressFamily.InterNetwork);
if (ipv4 != null)
{
return ipv4.Address.ToString();
}
}
return "127.0.0.1";
}
catch
{
return "127.0.0.1";
}
}
public void Start()
{
if (_isRunning) return;
try
{
if (!IsAdministrator())
{
_listener.Start();
_isRunning = true;
Task.Run(HandleRequests);
return;
}
AddFirewallRule(_port);
_listener.Start();
_isRunning = true;
Task.Run(HandleRequests);
}
catch (HttpListenerException ex)
{
if (IsAdministrator())
{
RestartAsAdmin();
}
else
{
Debug.WriteLine($"Failed to start HTTP server: {ex.Message}");
}
}
}
public void Stop()
{
if (!_isRunning) return;
_listener.Stop();
_isRunning = false;
}
public void UpdatePort(string newPort)
{
if (_port == newPort) return;
bool wasRunning = _isRunning;
if (wasRunning) Stop();
_port = newPort;
UpdateListenerPrefixes();
if (wasRunning) Start();
}
private async Task HandleRequests()
{
while (_isRunning)
{
try
{
var context = await _listener.GetContextAsync();
var path = context.Request.Url?.LocalPath ?? string.Empty;
var handler = _routes
.Where(r => path.StartsWith(r.Key))
.OrderByDescending(r => r.Key.Length)
.Select(r => r.Value)
.FirstOrDefault();
if (handler != null)
{
await handler.Invoke(context);
}
else
{
context.Response.StatusCode = 404;
context.Response.Close();
}
}
catch (Exception ex)
{
Debug.WriteLine($"Error handling request: {ex.Message}");
_isRunning = false;
}
}
}
public bool IsRunning => _isRunning;
public void Dispose()
{
if (_disposed) return;
if (_isRunning) Stop();
_listener.Close();
_disposed = true;
}
}
}
================================================
FILE: XAU/Services/HttpServer/ProfileRoutes.cs
================================================
using Newtonsoft.Json;
using System.Net;
using System.Text;
public static class ProfileRoutes
{
public static Dictionary<string, Func<HttpListenerContext, Task>> GetRoutes(Func<XboxRestAPI> getXboxRestAPI, Func<string> getXUIDOnly)
{
return new Dictionary<string, Func<HttpListenerContext, Task>>
{
{ "/api/profile/me", async context => await ProfileMeRequest(context, getXboxRestAPI, getXUIDOnly) },
{ "/api/profile/xuid/", async context => await ProfileXuidRequest(context, getXboxRestAPI) },
{ "/api/profile/gt/", async context => await ProfileGamertagRequest(context, getXboxRestAPI) }
};
}
private static async Task ProfileMeRequest(HttpListenerContext context, Func<XboxRestAPI> getXboxRestAPI, Func<string> getXUIDOnly)
{
var response = context.Response;
try
{
string xuid = getXUIDOnly?.Invoke();
if (string.IsNullOrWhiteSpace(xuid))
{
response.StatusCode = 400;
await SendJsonResponse(response, new { error = "No XUID found" });
return;
}
var xboxRestAPI = getXboxRestAPI();
var profile = await xboxRestAPI.GetProfileAsync(xuid);
if (profile == null)
{
response.StatusCode = 404;
await SendJsonResponse(response, new { error = "Profile not found" });
return;
}
await SendJsonResponse(response, profile);
}
catch (Exception ex)
{
response.StatusCode = 500;
await SendJsonResponse(response, new
{
error = ex.Message,
innerError = ex.InnerException?.Message
});
}
}
private static async Task ProfileXuidRequest(HttpListenerContext context, Func<XboxRestAPI> getXboxRestAPI)
{
var request = context.Request;
var response = context.Response;
try
{
if (request.Url.Segments.Length < 4)
{
response.StatusCode = 400;
await SendJsonResponse(response, new { error = "No XUID provided in URL" });
return;
}
string xuid = request.Url.Segments.Last().TrimEnd('/');
if (string.IsNullOrWhiteSpace(xuid))
{
response.StatusCode = 400;
await SendJsonResponse(response, new { error = "Invalid XUID in URL" });
return;
}
var xboxRestAPI = getXboxRestAPI();
var profile = await xboxRestAPI.GetProfileAsync(xuid);
if (profile == null)
{
response.StatusCode = 404;
await SendJsonResponse(response, new { error = "Profile not found" });
return;
}
await SendJsonResponse(response, profile);
}
catch (Exception ex)
{
response.StatusCode = 500;
await SendJsonResponse(response, new
{
error = ex.Message,
innerError = ex.InnerException?.Message
});
}
}
private static async Task ProfileGamertagRequest(HttpListenerContext context, Func<XboxRestAPI> getXboxRestAPI)
{
var request = context.Request;
var response = context.Response;
try
{
if (request.Url.Segments.Length < 4)
{
response.StatusCode = 400;
await SendJsonResponse(response, new { error = "No Gamertag provided in URL" });
return;
}
string gamertag = request.Url.Segments.Last().TrimEnd('/');
var xboxRestAPI = getXboxRestAPI();
// First, get the profile to extract XUID
var gamertagProfile = await xboxRestAPI.GetGamertagProfileAsync(gamertag);
if (gamertagProfile == null ||
gamertagProfile["profileUsers"] == null ||
!gamertagProfile["profileUsers"].Any())
{
response.StatusCode = 404;
await SendJsonResponse(response, new { error = "Gamertag not found" });
return;
}
string xuid = gamertagProfile["profileUsers"][0]["id"].ToString();
var fullProfile = await xboxRestAPI.GetProfileAsync(xuid);
if (fullProfile == null)
{
response.StatusCode = 404;
await SendJsonResponse(response, new { error = "Full profile not found" });
return;
}
await SendJsonResponse(response, fullProfile);
}
catch (Exception ex)
{
response.StatusCode = 500;
await SendJsonResponse(response, new
{
error = ex.Message,
innerError = ex.InnerException?.Message
});
}
}
private static async Task SendJsonResponse(HttpListenerResponse response, object data)
{
var json = JsonConvert.SerializeObject(data);
var buffer = Encoding.UTF8.GetBytes(json);
response.ContentLength64 = buffer.Length;
response.ContentType = "application/json";
await response.OutputStream.WriteAsync(buffer);
response.Close();
}
}
================================================
FILE: XAU/Services/HttpServer/Routes.cs
================================================
using Newtonsoft.Json;
using System.Net;
using System.Text;
public static class Routes
{
public static Dictionary<string, Func<HttpListenerContext, Task>> GetRoutes(Func<string> getXauthToken, Func<XboxRestAPI> getXboxRestAPI, Func<string> getXUIDOnly)
{
var routes = new Dictionary<string, Func<HttpListenerContext, Task>>
{
{ "/api/xauth", async context => await ApiXauthRequest(context, getXauthToken) }
};
var profileRoutes = ProfileRoutes.GetRoutes(getXboxRestAPI, getXUIDOnly);
foreach (var route in profileRoutes)
{
routes[route.Key] = route.Value;
}
var gameRoutes = GameRoutes.GetRoutes(getXboxRestAPI, getXUIDOnly);
foreach (var route in gameRoutes)
{
routes[route.Key] = route.Value;
}
var achievementRoutes = AchievementRoutes.GetRoutes(getXboxRestAPI, getXUIDOnly);
foreach (var route in achievementRoutes)
{
routes[route.Key] = route.Value;
}
var spoofingRoutes = SpoofingRoutes.GetRoutes(getXboxRestAPI, getXUIDOnly);
foreach (var route in spoofingRoutes)
{
routes[route.Key] = route.Value;
}
var endpointRoutes = EndpointRoutes.GetRoutes();
foreach (var route in endpointRoutes)
{
routes[route.Key] = route.Value;
}
return routes;
}
private static async Task ApiXauthRequest(HttpListenerContext context, Func<string> getXauthToken)
{
var response = context.Response;
string query = context.Request.Url?.Query ?? string.Empty;
bool isJson = query.Contains("?format=json", StringComparison.OrdinalIgnoreCase);
var xauth = getXauthToken();
if (isJson)
{
var jsonResponse = new { token = xauth };
var json = JsonConvert.SerializeObject(jsonResponse);
var buffer = Encoding.UTF8.GetBytes(json);
response.ContentLength64 = buffer.Length;
response.ContentType = "application/json";
await response.OutputStream.WriteAsync(buffer);
}
else
{
var buffer = Encoding.UTF8.GetBytes(xauth);
response.ContentLength64 = buffer.Length;
response.ContentType = "text/plain";
await response.OutputStream.WriteAsync(buffer);
}
response.Close();
}
}
================================================
FILE: XAU/Services/HttpServer/SpoofingRoutes.cs
================================================
using Newtonsoft.Json;
using System.IO;
using System.Net;
using System.Text;
public static class SpoofingRoutes
{
public static Dictionary<string, Func<HttpListenerContext, Task>> GetRoutes(Func<XboxRestAPI> getXboxRestAPI, Func<string> getXUIDOnly)
{
return new Dictionary<string, Func<HttpListenerContext, Task>>
{
{ "/api/spoof", async context => await StartSpoofingRequest(context, getXboxRestAPI, getXUIDOnly) },
};
}
private static async Task StartSpoofingRequest(HttpListenerContext context, Func<XboxRestAPI> getXboxRestAPI, Func<string> getXUIDOnly)
{
var request = context.Request;
var response = context
gitextract_1b3dwlvx/ ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ ├── config.yml │ │ ├── feature_request.yml │ │ └── game_request.yml │ └── workflows/ │ ├── Build-Events-Zip.yml │ └── Build-Pre-Release.yml ├── .gitignore ├── .gitmodules ├── .idea/ │ └── .idea.XAU/ │ └── .idea/ │ ├── .gitignore │ ├── encodings.xml │ ├── indexLayout.xml │ ├── riderPublish.xml │ └── vcs.xml ├── .run/ │ ├── Debug.run.xml │ ├── Publish Debug.run.xml │ └── Publish Release.run.xml ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Clown-Behaviour.md ├── Doc/ │ └── Events.md ├── LICENSE ├── LICENSE.MIT ├── README.md ├── XAU/ │ ├── App.xaml │ ├── App.xaml.cs │ ├── AssemblyInfo.cs │ ├── Models/ │ │ ├── GitHubResponse.cs │ │ ├── MiscItems.cs │ │ ├── XAUSettings.cs │ │ ├── XboxApiRequest.cs │ │ └── XboxApiResponse.cs │ ├── Networking/ │ │ ├── DBoxRestAPI.cs │ │ ├── GithubRestApi.cs │ │ └── XboxRestApi.cs │ ├── Services/ │ │ ├── ApplicationHostService.cs │ │ └── HttpServer/ │ │ ├── AchievementRoutes.cs │ │ ├── EndpointRoutes.cs │ │ ├── GameRoutes.cs │ │ ├── HttpServer.cs │ │ ├── ProfileRoutes.cs │ │ ├── Routes.cs │ │ └── SpoofingRoutes.cs │ ├── Theme/ │ │ └── ThemeConstants.xaml │ ├── Usings.cs │ ├── Util/ │ │ ├── Constants/ │ │ │ └── Constants.cs │ │ ├── Etw/ │ │ │ └── EtwTokenCapture.cs │ │ ├── Files/ │ │ │ └── FileDownloader.cs │ │ ├── Memory/ │ │ │ ├── Methods/ │ │ │ │ ├── AoB.cs │ │ │ │ └── Read.cs │ │ │ ├── Structures/ │ │ │ │ ├── Imports.cs │ │ │ │ ├── MemoryRegionResult.cs │ │ │ │ └── Process.cs │ │ │ └── memory.cs │ │ └── XboxAuthNet/ │ │ ├── Base64UrlHelper.cs │ │ ├── ErrorCodes.cs │ │ ├── ErrorHelper.cs │ │ ├── FodyWeavers.xml │ │ ├── HttpHelper.cs │ │ ├── Jwt/ │ │ │ └── JwtDecoder.cs │ │ ├── OAuth/ │ │ │ ├── CodeFlow/ │ │ │ │ ├── AuthCodeException.cs │ │ │ │ ├── CodeFlowAuthenticator.cs │ │ │ │ ├── CodeFlowAuthorizationResult.cs │ │ │ │ ├── CodeFlowBuilder.cs │ │ │ │ ├── CodeFlowLiveApiClient.cs │ │ │ │ ├── CodeFlowUriChecker.cs │ │ │ │ ├── ICodeFlowApiClient.cs │ │ │ │ ├── ICodeFlowUrlChecker.cs │ │ │ │ ├── IWebUI.cs │ │ │ │ ├── MicrosoftOAuthPromptModes.cs │ │ │ │ ├── Parameters/ │ │ │ │ │ ├── CodeFlowAccessTokenParameter.cs │ │ │ │ │ ├── CodeFlowAuthorizationParameter.cs │ │ │ │ │ ├── CodeFlowParameter.cs │ │ │ │ │ └── CodeFlowRefreshTokenParameter.cs │ │ │ │ └── WebUIOptions.cs │ │ │ ├── MicrosoftOAuthException.cs │ │ │ ├── MicrosoftOAuthResponse.cs │ │ │ └── MicrosoftUserPayload.cs │ │ ├── PlatformManager.cs │ │ ├── Platforms/ │ │ │ └── WinForm/ │ │ │ ├── StaTaskScheduler.cs │ │ │ ├── UIThreadHelper.cs │ │ │ ├── WebView2WebUI.cs │ │ │ ├── Win32Window.cs │ │ │ ├── WinFormsPanelWithWebView2.cs │ │ │ └── WindowsDpiHelper.cs │ │ ├── XboxAuthNet.csproj │ │ └── XboxLive/ │ │ ├── Crypto/ │ │ │ ├── ECDCertificatePopCryptoProvider.cs │ │ │ ├── IPopCryptoProvider.cs │ │ │ ├── IXboxRequestSigner.cs │ │ │ └── XboxRequestSigner.cs │ │ ├── Requests/ │ │ │ ├── AbstractXboxAuthRequest.cs │ │ │ ├── AbstractXboxSignedAuthRequest.cs │ │ │ ├── CommonRequestHeaders.cs │ │ │ ├── XboxDeviceTokenRequest.cs │ │ │ ├── XboxSignedUserTokenRequest.cs │ │ │ ├── XboxSignedXstsRequest.cs │ │ │ ├── XboxSisuAuthRequest.cs │ │ │ ├── XboxTitleTokenRequest.cs │ │ │ ├── XboxUserTokenRequest.cs │ │ │ └── XboxXstsRequest.cs │ │ ├── Responses/ │ │ │ ├── XErrJsonConverter.cs │ │ │ ├── XboxAuthResponse.cs │ │ │ ├── XboxAuthResponseHandler.cs │ │ │ ├── XboxAuthXuiClaims.cs │ │ │ ├── XboxAuthXuiClaimsJsonConverter.cs │ │ │ ├── XboxErrorResponse.cs │ │ │ └── XboxSisuResponse.cs │ │ ├── XboxAuthClient.cs │ │ ├── XboxAuthConstants.cs │ │ ├── XboxAuthException.cs │ │ ├── XboxAuthXuiClaimNames.cs │ │ ├── XboxDeviceTypes.cs │ │ ├── XboxGameTitles.cs │ │ └── XboxSignedClient.cs │ ├── ViewModels/ │ │ ├── Pages/ │ │ │ ├── AchievementsViewModel.cs │ │ │ ├── DebugViewModel.cs │ │ │ ├── GamesViewModel.cs │ │ │ ├── HomeViewModel.cs │ │ │ ├── InfoViewModel.cs │ │ │ ├── MiscViewModel.cs │ │ │ ├── SettingsViewModel.cs │ │ │ └── StatsViewModel.cs │ │ └── Windows/ │ │ └── MainWindowViewModel.cs │ ├── Views/ │ │ ├── Pages/ │ │ │ ├── AchievementsPage.xaml │ │ │ ├── AchievementsPage.xaml.cs │ │ │ ├── DebugPage.xaml │ │ │ ├── DebugPage.xaml.cs │ │ │ ├── GamesPage.xaml │ │ │ ├── GamesPage.xaml.cs │ │ │ ├── HomePage.xaml │ │ │ ├── HomePage.xaml.cs │ │ │ ├── InfoPage.xaml │ │ │ ├── InfoPage.xaml.cs │ │ │ ├── MiscPage.xaml │ │ │ ├── MiscPage.xaml.cs │ │ │ ├── PlaceholderPage.xaml │ │ │ ├── PlaceholderPage.xaml.cs │ │ │ ├── SettingsPage.xaml │ │ │ ├── SettingsPage.xaml.cs │ │ │ ├── StatsPage.xaml │ │ │ └── StatsPage.xaml.cs │ │ └── Windows/ │ │ ├── MainWindow.xaml │ │ └── MainWindow.xaml.cs │ ├── XAU.csproj │ └── app.manifest └── XAU.sln
SYMBOL INDEX (567 symbols across 103 files)
FILE: XAU/App.xaml.cs
class App (line 13) | public partial class App
method GetService (line 46) | private static T? GetService<T>() where T : class
method OnStartup (line 51) | private void OnStartup(object sender, StartupEventArgs e)
method OnExit (line 57) | private async void OnExit(object sender, ExitEventArgs e)
method SetupExceptionHandling (line 63) | private void SetupExceptionHandling()
method ReportException (line 82) | private static void ReportException(Exception exception)
FILE: XAU/Models/GitHubResponse.cs
class EventsUpdateResponse (line 3) | public class EventsUpdateResponse
class VersionResponse (line 9) | public class VersionResponse
class GitHubFile (line 16) | public class GitHubFile
FILE: XAU/Models/MiscItems.cs
class GameItem (line 2) | public class GameItem
FILE: XAU/Models/XAUSettings.cs
class XAUSettings (line 1) | public class XAUSettings
FILE: XAU/Models/XboxApiRequest.cs
class GameTitleRequest (line 3) | public class GameTitleRequest
class AchievementsArrayEntry (line 9) | public class AchievementsArrayEntry
class UnlockTitleBasedAchievementRequest (line 15) | public class UnlockTitleBasedAchievementRequest
class GameStat (line 24) | public class GameStat
class GameStatsRequest (line 30) | public class GameStatsRequest
class HeartbeatRequest (line 38) | public class HeartbeatRequest
class TitleRequest (line 43) | public class TitleRequest
class GamepassProductsRequest (line 51) | public class GamepassProductsRequest
FILE: XAU/Models/XboxApiResponse.cs
class PersonResponse (line 6) | public class PersonResponse
class MultiplayerSummary (line 84) | public class MultiplayerSummary
class PreferredColor (line 91) | public class PreferredColor
class PresenceDetail (line 101) | public class PresenceDetail
class Detail (line 124) | public class Detail
class LinkedAccount (line 144) | public class LinkedAccount
class Profile (line 156) | public class Profile
class XboxTitle (line 168) | public class XboxTitle
class BasicAchievementDetails (line 211) | public class BasicAchievementDetails
class Stats (line 221) | public class Stats
class GamePass (line 226) | public class GamePass
class GameTitle (line 231) | public class GameTitle
class GamepassData (line 238) | public class GamepassData
class Gamepass (line 244) | public class Gamepass
class TitleHistory (line 253) | public class TitleHistory
class Title (line 260) | public class Title
class TitlesList (line 306) | public class TitlesList
class ProfileSettings (line 313) | public class ProfileSettings
class ProfileUser (line 321) | public class ProfileUser
class BasicProfile (line 332) | public class BasicProfile
class Stat (line 338) | public class Stat
class StatListCollection (line 356) | public class StatListCollection
class GameStatsResponse (line 365) | public class GameStatsResponse
class AchievementRewards (line 371) | public class AchievementRewards
class Rarity (line 386) | public class Rarity
class AchievementRequirements (line 395) | public class AchievementRequirements
class AchievementProgression (line 411) | public class AchievementProgression
class TitleAssociation (line 418) | public class TitleAssociation
class MediaAsset (line 426) | public class MediaAsset
class OneCoreAchievementResponse (line 438) | public class OneCoreAchievementResponse // Xbox One Achievements
class Xbox360AchievementEntry (line 465) | public class Xbox360AchievementEntry
class Xbox360AchievementResponse (line 479) | public class Xbox360AchievementResponse
class AchievementsResponse (line 484) | public class AchievementsResponse
class TimeWindow (line 489) | public class TimeWindow
class Image (line 496) | public class Image
class Product (line 504) | public class Product
class GamePassProducts (line 535) | public class GamePassProducts
FILE: XAU/Networking/DBoxRestAPI.cs
class DBoxRestApi (line 6) | public class DBoxRestApi
method DBoxRestApi (line 10) | public DBoxRestApi()
method SetDefaultHeaders (line 20) | private void SetDefaultHeaders()
method SearchAsync (line 27) | public async Task<JObject> SearchAsync(string searchText)
FILE: XAU/Networking/GithubRestApi.cs
class GithubRestApi (line 6) | public class GithubRestApi
method GithubRestApi (line 11) | public GithubRestApi()
method SetDefaultHeaders (line 20) | private void SetDefaultHeaders()
method GetDevToolVersionAsync (line 30) | public async Task<VersionResponse?> GetDevToolVersionAsync()
method GetReleaseVersionAsync (line 39) | public async Task<dynamic> GetReleaseVersionAsync()
method CheckForEventUpdatesAsync (line 49) | public async Task<EventsUpdateResponse?> CheckForEventUpdatesAsync()
method GetXboxGamesDatabaseInfoAsync (line 58) | public async Task<GitHubFile?> GetXboxGamesDatabaseInfoAsync()
FILE: XAU/Networking/XboxRestApi.cs
class XboxRestAPI (line 10) | public class XboxRestAPI
method XboxRestAPI (line 22) | public XboxRestAPI(string xauth)
method SetDefaultHeaders (line 42) | private void SetDefaultHeaders()
method SetDefaultSpooferHeaders (line 61) | private void SetDefaultSpooferHeaders()
method SetDefaultEventBasedHeaders (line 79) | private void SetDefaultEventBasedHeaders()
method GetBasicProfileAsync (line 106) | public async Task<BasicProfile?> GetBasicProfileAsync()
method GetProfileAsync (line 116) | public async Task<Profile?> GetProfileAsync(string xuid)
method GetGameTitleAsync (line 126) | public async Task<GameTitle?> GetGameTitleAsync(string xuid, string ti...
method GetGamepassMembershipAsync (line 147) | public async Task<Gamepass?> GetGamepassMembershipAsync(string xuid)
method GetGamesListAsync (line 161) | public async Task<TitlesList?> GetGamesListAsync(string xuid)
method GetGamertagProfileAsync (line 177) | public async Task<JObject?> GetGamertagProfileAsync(string gamertag)
method GetGameStatsAsync (line 196) | public async Task<GameStatsResponse?> GetGameStatsAsync(string xuid, s...
method SendHeartbeatAsync (line 222) | public async Task SendHeartbeatAsync(string xuid, string spoofedTitleId)
method StopHeartbeatAsync (line 247) | public async Task StopHeartbeatAsync(string xuid)
method GetAchievementsForTitleAsync (line 260) | public async Task<AchievementsResponse?> GetAchievementsForTitleAsync(...
method GetAchievementsFor360TitleAsync (line 278) | public async Task<Xbox360AchievementResponse?> GetAchievementsFor360Ti...
method UnlockTitleBasedAchievementAsync (line 295) | public async Task UnlockTitleBasedAchievementAsync(string serviceConfi...
method UnlockTitleBasedAchievementsAsync (line 301) | public async Task UnlockTitleBasedAchievementsAsync(string serviceConf...
method UnlockEventBasedAchievement (line 348) | public async Task UnlockEventBasedAchievement(string eventsToken, Stri...
method GetTitleIdsFromGamePass (line 370) | public async Task<GamePassProducts?> GetTitleIdsFromGamePass(string pr...
FILE: XAU/Services/ApplicationHostService.cs
class ApplicationHostService (line 11) | public class ApplicationHostService : IHostedService
method ApplicationHostService (line 15) | public ApplicationHostService(IServiceProvider serviceProvider)
method StartAsync (line 24) | public async Task StartAsync(CancellationToken cancellationToken)
method StopAsync (line 33) | public async Task StopAsync(CancellationToken cancellationToken)
method HandleActivationAsync (line 41) | private async Task HandleActivationAsync()
method OnNavigationWindowLoaded (line 53) | private void OnNavigationWindowLoaded(object sender, RoutedEventArgs e)
FILE: XAU/Services/HttpServer/AchievementRoutes.cs
class AchievementRoutes (line 7) | public static class AchievementRoutes
method GetRoutes (line 10) | public static Dictionary<string, Func<HttpListenerContext, Task>> GetR...
method AchievementsTitleRequest (line 21) | private static async Task AchievementsTitleRequest(HttpListenerContext...
method UnlockAchievementRequest (line 79) | private static async Task UnlockAchievementRequest(HttpListenerContext...
method UnlockAllAchievementsRequest (line 140) | private static async Task UnlockAllAchievementsRequest(HttpListenerCon...
method GetServiceConfigId (line 204) | private static async Task<string> GetServiceConfigId(Func<XboxRestAPI>...
method SendJsonResponse (line 233) | private static async Task SendJsonResponse(HttpListenerResponse respon...
class UnlockAchievementRequest (line 246) | public class UnlockAchievementRequest
class UnlockAllAchievementsRequest (line 252) | public class UnlockAllAchievementsRequest
FILE: XAU/Services/HttpServer/EndpointRoutes.cs
class EndpointRoutes (line 5) | public static class EndpointRoutes
method GetRoutes (line 7) | public static Dictionary<string, Func<HttpListenerContext, Task>> GetR...
method IndexPageRequest (line 16) | private static async Task IndexPageRequest(HttpListenerContext context)
FILE: XAU/Services/HttpServer/GameRoutes.cs
class GameRoutes (line 5) | public static class GameRoutes
method GetRoutes (line 7) | public static Dictionary<string, Func<HttpListenerContext, Task>> GetR...
method GamesMeRequest (line 21) | private static async Task GamesMeRequest(HttpListenerContext context, ...
method GamesXuidRequest (line 54) | private static async Task GamesXuidRequest(HttpListenerContext context...
method GamesGamertagRequest (line 89) | private static async Task GamesGamertagRequest(HttpListenerContext con...
method GameTitleIDSearchRequest (line 133) | private static async Task GameTitleIDSearchRequest(HttpListenerContext...
method GameProductIDSearchRequest (line 176) | private static async Task GameProductIDSearchRequest(HttpListenerConte...
method SendJsonResponse (line 211) | private static async Task SendJsonResponse(HttpListenerResponse respon...
FILE: XAU/Services/HttpServer/HttpServer.cs
class HttpServer (line 10) | public sealed class HttpServer : IDisposable
method HttpServer (line 19) | public HttpServer(string port, Dictionary<string, Func<HttpListenerCon...
method IsAdministrator (line 27) | private static bool IsAdministrator()
method RestartAsAdmin (line 34) | [SupportedOSPlatform("windows")]
method UpdateListenerPrefixes (line 49) | private void UpdateListenerPrefixes()
method AddFirewallRule (line 61) | public static void AddFirewallRule(string port)
method RuleExists (line 81) | private static bool RuleExists(string port)
method GetListeningAddress (line 102) | public string GetListeningAddress()
method GetLocalIPAddress (line 112) | public static string GetLocalIPAddress()
method Start (line 141) | public void Start()
method Stop (line 173) | public void Stop()
method UpdatePort (line 180) | public void UpdatePort(string newPort)
method HandleRequests (line 193) | private async Task HandleRequests()
method Dispose (line 228) | public void Dispose()
FILE: XAU/Services/HttpServer/ProfileRoutes.cs
class ProfileRoutes (line 5) | public static class ProfileRoutes
method GetRoutes (line 7) | public static Dictionary<string, Func<HttpListenerContext, Task>> GetR...
method ProfileMeRequest (line 17) | private static async Task ProfileMeRequest(HttpListenerContext context...
method ProfileXuidRequest (line 55) | private static async Task ProfileXuidRequest(HttpListenerContext conte...
method ProfileGamertagRequest (line 101) | private static async Task ProfileGamertagRequest(HttpListenerContext c...
method SendJsonResponse (line 155) | private static async Task SendJsonResponse(HttpListenerResponse respon...
FILE: XAU/Services/HttpServer/Routes.cs
class Routes (line 5) | public static class Routes
method GetRoutes (line 7) | public static Dictionary<string, Func<HttpListenerContext, Task>> GetR...
method ApiXauthRequest (line 47) | private static async Task ApiXauthRequest(HttpListenerContext context,...
FILE: XAU/Services/HttpServer/SpoofingRoutes.cs
class SpoofingRoutes (line 6) | public static class SpoofingRoutes
method GetRoutes (line 8) | public static Dictionary<string, Func<HttpListenerContext, Task>> GetR...
method StartSpoofingRequest (line 16) | private static async Task StartSpoofingRequest(HttpListenerContext con...
method SendJsonResponse (line 68) | private static async Task SendJsonResponse(HttpListenerResponse respon...
class SpoofingRequest (line 81) | public class SpoofingRequest
FILE: XAU/Util/Constants/Constants.cs
type StringConstants (line 2) | struct StringConstants
type HeaderNames (line 9) | struct HeaderNames
type HeaderValues (line 22) | struct HeaderValues
type OpenableLinks (line 35) | struct OpenableLinks
type Hosts (line 43) | struct Hosts
type BasicXboxAPIUris (line 56) | public struct BasicXboxAPIUris
type InterpolatedXboxAPIUrls (line 66) | public struct InterpolatedXboxAPIUrls
type ProcessNames (line 80) | public struct ProcessNames
type AppLaunchUris (line 86) | public struct AppLaunchUris
type EventsUrls (line 91) | public struct EventsUrls
FILE: XAU/Util/Etw/EtwTokenCapture.cs
class EtwTokenCapture (line 9) | static class EtwTokenCapture
method IsEventsRpToken (line 35) | public static bool IsEventsRpToken(string token)
method Capture (line 67) | public static string Capture(int captureSeconds)
method Cleanup (line 95) | public static void Cleanup()
method Start (line 101) | public static string Start()
method Stop (line 133) | public static void Stop(string method)
method ExtractTokens (line 147) | public static string ExtractTokens()
method CleanupFiles (line 276) | public static void CleanupFiles()
method RunShellCommand (line 295) | private static (int exitCode, string stdout, string stderr) RunShellCo...
method SearchForTokens (line 320) | private static void SearchForTokens(string text, List<(string token, i...
method CleanToken (line 347) | private static string CleanToken(string raw)
method ScoreCandidate (line 371) | private static int ScoreCandidate(string text, int matchIndex, string ...
method StripNullBytes (line 396) | private static string StripNullBytes(byte[] data, int length)
FILE: XAU/Util/Files/FileDownloader.cs
class FileDownloader (line 5) | public class FileDownloader : IDisposable
method FileDownloader (line 9) | public FileDownloader()
method Dispose (line 14) | public void Dispose()
method DownloadFileAsync (line 19) | public async Task DownloadFileAsync(string url, string destinationFile...
FILE: XAU/Util/Memory/Methods/AoB.cs
class Mem (line 12) | public partial class Mem
method AoBScan (line 22) | public Task<IEnumerable<long>> AoBScan(string search, bool writable = ...
method AoBScan (line 39) | public Task<IEnumerable<long>> AoBScan(long start, long end, string se...
method AoBScan (line 57) | public Task<IEnumerable<long>> AoBScan(long start, long end, string se...
method CompareScan (line 204) | private long[] CompareScan(MemoryRegionResult item, byte[] aobPattern,...
method FindPattern (line 233) | private unsafe int FindPattern(byte* body, int bodyLength, byte[] patt...
FILE: XAU/Util/Memory/Methods/Read.cs
class Mem (line 11) | public partial class Mem
method ReadString (line 22) | public string ReadString(string code, string file = "", int length = 3...
FILE: XAU/Util/Memory/Structures/Imports.cs
class Imps (line 7) | public class Imps
method OpenProcess (line 9) | [DllImport("kernel32.dll")]
method Native_VirtualQueryEx (line 18) | [DllImport("kernel32.dll", EntryPoint = "VirtualQueryEx")]
method Native_VirtualQueryEx (line 22) | [DllImport("kernel32.dll", EntryPoint = "VirtualQueryEx")]
method GetSystemInfo (line 26) | [DllImport("kernel32.dll")]
method GetPrivateProfileString (line 31) | [DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
method ReadProcessMemory (line 40) | [DllImport("kernel32.dll")]
method ReadProcessMemory (line 43) | [DllImport("kernel32.dll")]
method IsWow64Process (line 46) | [DllImport("kernel32")]
type SYSTEM_INFO (line 70) | public struct SYSTEM_INFO
type MEMORY_BASIC_INFORMATION32 (line 85) | public struct MEMORY_BASIC_INFORMATION32
type MEMORY_BASIC_INFORMATION64 (line 96) | public struct MEMORY_BASIC_INFORMATION64
type MEMORY_BASIC_INFORMATION (line 109) | public struct MEMORY_BASIC_INFORMATION
FILE: XAU/Util/Memory/Structures/MemoryRegionResult.cs
type MemoryRegionResult (line 8) | struct MemoryRegionResult
FILE: XAU/Util/Memory/Structures/Process.cs
class Proc (line 9) | public class Proc
FILE: XAU/Util/Memory/memory.cs
class Mem (line 19) | public partial class Mem
method VirtualQueryEx (line 23) | public UIntPtr VirtualQueryEx(IntPtr hProcess, UIntPtr lpAddress, out ...
method OpenProcess (line 65) | public bool OpenProcess(int pid, out string FailReason)
method OpenProcess (line 134) | public bool OpenProcess(string proc)
method GetProcIdFromName (line 144) | public int GetProcIdFromName(string name) //new 1.0.2 function
method LoadCode (line 170) | public string LoadCode(string name, string iniFile)
method GetCode (line 198) | public UIntPtr GetCode(string name, string path = "", int size = 8)
method GetModuleAddressByName (line 353) | public IntPtr GetModuleAddressByName(string name)
method Get64BitCode (line 365) | public UIntPtr Get64BitCode(string name, string path = "", int size = 16)
method MSize (line 492) | public string MSize()
FILE: XAU/Util/XboxAuthNet/Base64UrlHelper.cs
class Base64UrlHelper (line 13) | internal static class Base64UrlHelper
method Encode (line 44) | public static string Encode(string arg)
method Encode (line 59) | private static string Encode(byte[] inArray, int offset, int length)
method Encode (line 136) | public static string Encode(byte[] inArray)
method EncodeString (line 141) | internal static string EncodeString(string str)
method DecodeBytes (line 150) | public static byte[] DecodeBytes(string str)
method UnsafeDecode (line 184) | private unsafe static byte[] UnsafeDecode(string str)
method Decode (line 253) | public static string Decode(string arg)
FILE: XAU/Util/XboxAuthNet/ErrorCodes.cs
class ErrorCodes (line 4) | public class ErrorCodes
FILE: XAU/Util/XboxAuthNet/ErrorHelper.cs
class ErrorHelper (line 5) | internal static class ErrorHelper
method ConvertToHexErrorCode (line 7) | public static string? ConvertToHexErrorCode(string? errorCode)
method TryConvertToHexErrorCode (line 17) | public static string? TryConvertToHexErrorCode(string? errorCode)
FILE: XAU/Util/XboxAuthNet/HttpHelper.cs
class HttpHelper (line 9) | public class HttpHelper
method GetQueryString (line 15) | public static string GetQueryString(Dictionary<string, string?> queries)
method CreateJsonContent (line 21) | public static JsonContent CreateJsonContent<T>(T obj)
FILE: XAU/Util/XboxAuthNet/Jwt/JwtDecoder.cs
class JwtDecoder (line 7) | internal static class JwtDecoder
method DecodePayloadString (line 16) | internal static string DecodePayloadString(string jwt)
method DecodePayload (line 52) | internal static T? DecodePayload<T>(string jwt) where T : class
FILE: XAU/Util/XboxAuthNet/OAuth/CodeFlow/AuthCodeException.cs
class AuthCodeException (line 3) | internal class AuthCodeException : Exception
method AuthCodeException (line 5) | public AuthCodeException(string? error, string? errorDescription) : ba...
FILE: XAU/Util/XboxAuthNet/OAuth/CodeFlow/CodeFlowAuthenticator.cs
class CodeFlowAuthenticator (line 5) | public class CodeFlowAuthenticator
method CodeFlowAuthenticator (line 11) | internal CodeFlowAuthenticator(
method AuthenticateInteractively (line 21) | public Task<MicrosoftOAuthResponse> AuthenticateInteractively(Cancella...
method AuthenticateInteractively (line 26) | public async Task<MicrosoftOAuthResponse> AuthenticateInteractively(
method AuthenticateSilently (line 47) | public Task<MicrosoftOAuthResponse> AuthenticateSilently(
method Signout (line 58) | public async Task Signout(CancellationToken cancellationToken = default)
FILE: XAU/Util/XboxAuthNet/OAuth/CodeFlow/CodeFlowAuthorizationResult.cs
type CodeFlowAuthorizationResult (line 3) | public struct CodeFlowAuthorizationResult
FILE: XAU/Util/XboxAuthNet/OAuth/CodeFlow/CodeFlowBuilder.cs
class CodeFlowBuilder (line 3) | public class CodeFlowBuilder
method CodeFlowBuilder (line 7) | public CodeFlowBuilder(ICodeFlowApiClient apiClient)
method WithUIParent (line 16) | public CodeFlowBuilder WithUIParent(object parent)
method WithUITitle (line 23) | public CodeFlowBuilder WithUITitle(string title)
method WithUIOptions (line 30) | public CodeFlowBuilder WithUIOptions(WebUIOptions options)
method WithWebUI (line 36) | public CodeFlowBuilder WithWebUI(IWebUI ui)
method WithWebUI (line 42) | public CodeFlowBuilder WithWebUI(Func<WebUIOptions, IWebUI> factory)
method WithUriChecker (line 49) | public CodeFlowBuilder WithUriChecker(ICodeFlowUrlChecker checker)
method Build (line 55) | public CodeFlowAuthenticator Build()
method createDefaultUriChecker (line 62) | private ICodeFlowUrlChecker createDefaultUriChecker()
method createDefaultWebUIForPlatform (line 67) | private IWebUI createDefaultWebUIForPlatform()
method createDefaultWebUIOptions (line 73) | private WebUIOptions createDefaultWebUIOptions() => new WebUIOptions
FILE: XAU/Util/XboxAuthNet/OAuth/CodeFlow/CodeFlowLiveApiClient.cs
class CodeFlowLiveApiClient (line 6) | public class CodeFlowLiveApiClient : ICodeFlowApiClient
method CodeFlowLiveApiClient (line 15) | public CodeFlowLiveApiClient(string clientId, string scope, HttpClient...
method CreateAuthorizeCodeUrl (line 25) | public string CreateAuthorizeCodeUrl(CodeFlowAuthorizationParameter pa...
method CreateSignoutUrl (line 41) | public string CreateSignoutUrl() =>
method CreateSignoutUrl (line 44) | public string CreateSignoutUrl(string tenant) =>
method GetAccessToken (line 47) | public Task<MicrosoftOAuthResponse> GetAccessToken(
method setAccessTokenParameters (line 52) | private CodeFlowAccessTokenParameter setAccessTokenParameters(CodeFlow...
method RefreshToken (line 61) | public Task<MicrosoftOAuthResponse> RefreshToken(
method setRefreshTokenParameters (line 66) | private CodeFlowRefreshTokenParameter setRefreshTokenParameters(CodeFl...
method requestToken (line 73) | private async Task<MicrosoftOAuthResponse> requestToken(
method microsoftOAuthRequest (line 87) | private async Task<MicrosoftOAuthResponse> microsoftOAuthRequest(
method setCommonParameters (line 105) | private void setCommonParameters(CodeFlowParameter parameter)
FILE: XAU/Util/XboxAuthNet/OAuth/CodeFlow/CodeFlowUriChecker.cs
class CodeFlowUrlChecker (line 5) | public class CodeFlowUrlChecker : ICodeFlowUrlChecker
method GetAuthCodeResult (line 7) | public CodeFlowAuthorizationResult GetAuthCodeResult(Uri uri)
FILE: XAU/Util/XboxAuthNet/OAuth/CodeFlow/ICodeFlowApiClient.cs
type ICodeFlowApiClient (line 5) | public interface ICodeFlowApiClient
method CreateAuthorizeCodeUrl (line 7) | string CreateAuthorizeCodeUrl(CodeFlowAuthorizationParameter parameter);
method CreateSignoutUrl (line 9) | string CreateSignoutUrl();
method GetAccessToken (line 11) | Task<MicrosoftOAuthResponse> GetAccessToken(
method RefreshToken (line 15) | Task<MicrosoftOAuthResponse> RefreshToken(
FILE: XAU/Util/XboxAuthNet/OAuth/CodeFlow/ICodeFlowUrlChecker.cs
type ICodeFlowUrlChecker (line 3) | public interface ICodeFlowUrlChecker
method GetAuthCodeResult (line 5) | CodeFlowAuthorizationResult GetAuthCodeResult(Uri uri);
FILE: XAU/Util/XboxAuthNet/OAuth/CodeFlow/IWebUI.cs
type IWebUI (line 5) | public interface IWebUI
method DisplayDialogAndInterceptUri (line 7) | Task<CodeFlowAuthorizationResult> DisplayDialogAndInterceptUri(Uri uri...
method DisplayDialogAndNavigateUri (line 8) | Task DisplayDialogAndNavigateUri(Uri uri, CancellationToken cancellati...
FILE: XAU/Util/XboxAuthNet/OAuth/CodeFlow/MicrosoftOAuthPromptModes.cs
class MicrosoftOAuthPromptModes (line 3) | public static class MicrosoftOAuthPromptModes
FILE: XAU/Util/XboxAuthNet/OAuth/CodeFlow/Parameters/CodeFlowAccessTokenParameter.cs
class CodeFlowAccessTokenParameter (line 5) | public class CodeFlowAccessTokenParameter : CodeFlowParameter
FILE: XAU/Util/XboxAuthNet/OAuth/CodeFlow/Parameters/CodeFlowAuthorizationParameter.cs
class CodeFlowAuthorizationParameter (line 5) | public class CodeFlowAuthorizationParameter : CodeFlowParameter
FILE: XAU/Util/XboxAuthNet/OAuth/CodeFlow/Parameters/CodeFlowParameter.cs
class CodeFlowParameter (line 5) | public class CodeFlowParameter
method ToQueryDictionary (line 17) | public Dictionary<string, string?> ToQueryDictionary()
FILE: XAU/Util/XboxAuthNet/OAuth/CodeFlow/Parameters/CodeFlowRefreshTokenParameter.cs
class CodeFlowRefreshTokenParameter (line 5) | public class CodeFlowRefreshTokenParameter : CodeFlowParameter
FILE: XAU/Util/XboxAuthNet/OAuth/CodeFlow/WebUIOptions.cs
class WebUIOptions (line 3) | public class WebUIOptions
FILE: XAU/Util/XboxAuthNet/OAuth/MicrosoftOAuthException.cs
class MicrosoftOAuthException (line 5) | public class MicrosoftOAuthException : Exception
method MicrosoftOAuthException (line 7) | public MicrosoftOAuthException()
method MicrosoftOAuthException (line 12) | public MicrosoftOAuthException(string? message, int statusCode) : base...
method MicrosoftOAuthException (line 15) | public MicrosoftOAuthException(string? error, string? errorDes, int[]?...
method CreateMessageFromError (line 26) | private static string CreateMessageFromError(string? error, string? er...
method FromResponseBody (line 31) | public static MicrosoftOAuthException FromResponseBody(string resBody,...
method fromJsonBody (line 46) | private static MicrosoftOAuthException fromJsonBody(string responseBod...
FILE: XAU/Util/XboxAuthNet/OAuth/MicrosoftOAuthResponse.cs
class MicrosoftOAuthResponse (line 7) | public class MicrosoftOAuthResponse
method DecodeIdTokenPayload (line 37) | public MicrosoftUserPayload? DecodeIdTokenPayload()
method Validate (line 45) | public bool Validate()
method FromHttpResponse (line 56) | public static MicrosoftOAuthResponse FromHttpResponse(string resBody, ...
FILE: XAU/Util/XboxAuthNet/OAuth/MicrosoftUserPayload.cs
class MicrosoftUserPayload (line 6) | public class MicrosoftUserPayload
FILE: XAU/Util/XboxAuthNet/PlatformManager.cs
class PlatformManager (line 7) | public class PlatformManager
method CreateWebUI (line 13) | public IWebUI CreateWebUI(WebUIOptions uiOptions)
FILE: XAU/Util/XboxAuthNet/Platforms/WinForm/StaTaskScheduler.cs
class StaTaskScheduler (line 16) | #if NET5_WIN
method StaTaskScheduler (line 29) | public StaTaskScheduler(int numberOfThreads)
method Dispose (line 71) | public void Dispose()
method QueueTask (line 92) | protected override void QueueTask(Task task)
method GetScheduledTasks (line 100) | protected override IEnumerable<Task> GetScheduledTasks()
method TryExecuteTaskInline (line 110) | protected override bool TryExecuteTaskInline(Task task, bool taskWasPr...
FILE: XAU/Util/XboxAuthNet/Platforms/WinForm/UIThreadHelper.cs
class UIThreadHelper (line 7) | internal static class UIThreadHelper
method InvokeUIActionOnSafeThread (line 9) | public static async Task InvokeUIActionOnSafeThread(
method invokeWithinMtaThread (line 24) | private static async Task invokeWithinMtaThread(
FILE: XAU/Util/XboxAuthNet/Platforms/WinForm/WebView2WebUI.cs
class WebView2WebUI (line 6) | #if NET5_WIN
method WebView2WebUI (line 14) | public WebView2WebUI(WebUIOptions options)
method DisplayDialogAndInterceptUri (line 20) | public async Task<CodeFlowAuthorizationResult> DisplayDialogAndInterce...
method DisplayDialogAndNavigateUri (line 37) | public async Task DisplayDialogAndNavigateUri(Uri uri, CancellationTok...
method IsWebView2Available (line 49) | public static bool IsWebView2Available()
class WpfWindowWrapper (line 66) | public class WpfWindowWrapper : System.Windows.Forms.IWin32Window
method WpfWindowWrapper (line 68) | public WpfWindowWrapper()
FILE: XAU/Util/XboxAuthNet/Platforms/WinForm/Win32Window.cs
class Win32Window (line 10) | internal class Win32Window : IWin32Window
method Win32Window (line 12) | public Win32Window(IntPtr handle)
FILE: XAU/Util/XboxAuthNet/Platforms/WinForm/WinFormsPanelWithWebView2.cs
class WinFormsPanelWithWebView2 (line 15) | internal class WinFormsPanelWithWebView2 : Form
method WinFormsPanelWithWebView2 (line 25) | public WinFormsPanelWithWebView2(
method DisplayDialogAndInterceptUri (line 54) | public CodeFlowAuthorizationResult DisplayDialogAndInterceptUri(
method DisplayDialogAndNavigateUri (line 71) | public void DisplayDialogAndNavigateUri(Uri uri, CancellationToken can...
method DisplayDialog (line 85) | private void DisplayDialog(CancellationToken cancellationToken)
method CloseIfOpen (line 107) | private void CloseIfOpen()
method PlaceOnTop (line 115) | private void PlaceOnTop(object? sender, EventArgs e)
method InvokeHandlingOwnerWindow (line 130) | private void InvokeHandlingOwnerWindow(Action action)
method InvokeOnly (line 147) | private void InvokeOnly(Action action)
method InitializeComponent (line 159) | private void InitializeComponent()
method WebView2Control_NavigationStarting (line 219) | private void WebView2Control_NavigationStarting(object? sender, CoreWe...
method CheckForEndUrl (line 232) | private bool CheckForEndUrl(Uri url)
method WebView2Control_CoreWebView2InitializationCompleted (line 250) | private void WebView2Control_CoreWebView2InitializationCompleted(objec...
method CoreWebView2_DocumentTitleChanged (line 264) | private void CoreWebView2_DocumentTitleChanged(object? sender, object e)
FILE: XAU/Util/XboxAuthNet/Platforms/WinForm/WindowsDpiHelper.cs
class WindowsDpiHelper (line 10) | internal static class WindowsDpiHelper
method WindowsDpiHelper (line 12) | static WindowsDpiHelper()
method GetDC (line 45) | [DllImport("User32.dll", CallingConvention = CallingConvention.StdCall...
method ReleaseDC (line 48) | [DllImport("User32.dll", CallingConvention = CallingConvention.StdCall...
method GetDeviceCaps (line 51) | [DllImport("Gdi32.dll", CallingConvention = CallingConvention.StdCall,...
method IsProcessDPIAware (line 54) | [DllImport("User32.dll", CallingConvention = CallingConvention.Winapi,...
FILE: XAU/Util/XboxAuthNet/XboxLive/Crypto/ECDCertificatePopCryptoProvider.cs
class ECDCertificatePopCryptoProvider (line 6) | public class ECDCertificatePopCryptoProvider : IPopCryptoProvider
method ECDCertificatePopCryptoProvider (line 13) | public ECDCertificatePopCryptoProvider()
method generateNewProofKey (line 19) | private object generateNewProofKey()
method Sign (line 33) | public byte[] Sign(byte[] data)
FILE: XAU/Util/XboxAuthNet/XboxLive/Crypto/IPopCryptoProvider.cs
type IPopCryptoProvider (line 3) | public interface IPopCryptoProvider
method Sign (line 6) | byte[] Sign(byte[] data);
FILE: XAU/Util/XboxAuthNet/XboxLive/Crypto/IXboxRequestSigner.cs
type IXboxRequestSigner (line 3) | public interface IXboxRequestSigner
method SignRequest (line 6) | string SignRequest(string reqUri, string token, string body);
FILE: XAU/Util/XboxAuthNet/XboxLive/Crypto/XboxRequestSigner.cs
class XboxRequestSigner (line 6) | public class XboxRequestSigner : IXboxRequestSigner
method XboxRequestSigner (line 10) | public XboxRequestSigner(IPopCryptoProvider signer)
method SignRequest (line 17) | public string SignRequest(string reqUri, string token, string body)
method generatePayload (line 25) | private byte[] generatePayload(ulong windowsTimestamp, string uri, str...
method sign (line 59) | private byte[] sign(ulong windowsTimestamp, byte[] bytes)
method getWindowsTimestamp (line 79) | private ulong getWindowsTimestamp()
FILE: XAU/Util/XboxAuthNet/XboxLive/Requests/AbstractXboxAuthRequest.cs
class AbstractXboxAuthRequest (line 6) | public abstract class AbstractXboxAuthRequest
method BuildRequest (line 11) | protected abstract HttpRequestMessage BuildRequest();
method Send (line 13) | public async Task<T> Send<T>(HttpClient httpClient)
FILE: XAU/Util/XboxAuthNet/XboxLive/Requests/AbstractXboxSignedAuthRequest.cs
class AbstractXboxSignedAuthRequest (line 9) | public abstract class AbstractXboxSignedAuthRequest
method Send (line 15) | public async Task<T> Send<T>(HttpClient httpClient, IXboxRequestSigner...
method buildRequest (line 25) | private HttpRequestMessage buildRequest(IXboxRequestSigner signer)
method BuildBody (line 43) | protected abstract object BuildBody(object proofKey);
FILE: XAU/Util/XboxAuthNet/XboxLive/Requests/CommonRequestHeaders.cs
class CommonRequestHeaders (line 5) | internal class CommonRequestHeaders
method AddDefaultHeaders (line 7) | public static void AddDefaultHeaders(HttpRequestMessage request)
FILE: XAU/Util/XboxAuthNet/XboxLive/Requests/XboxDeviceTokenRequest.cs
class XboxDeviceTokenRequest (line 9) | public class XboxDeviceTokenRequest : AbstractXboxSignedAuthRequest
method BuildBody (line 18) | protected override object BuildBody(object proofKey)
method nextUUID (line 46) | private string nextUUID()
method Send (line 51) | public Task<XboxAuthResponse> Send(HttpClient httpClient, IXboxRequest...
FILE: XAU/Util/XboxAuthNet/XboxLive/Requests/XboxSignedUserTokenRequest.cs
class XboxSignedUserTokenRequest (line 9) | public class XboxSignedUserTokenRequest : AbstractXboxSignedAuthRequest
method BuildBody (line 16) | protected override object BuildBody(object proofKey)
method Send (line 36) | public Task<XboxAuthResponse> Send(HttpClient httpClient, IXboxRequest...
FILE: XAU/Util/XboxAuthNet/XboxLive/Requests/XboxSignedXstsRequest.cs
class XboxSignedXstsRequest (line 8) | public class XboxSignedXstsRequest : AbstractXboxSignedAuthRequest
method BuildBody (line 18) | protected override object BuildBody(object proofKey)
method Send (line 41) | public Task<XboxAuthResponse> Send(HttpClient httpClient, IXboxRequest...
FILE: XAU/Util/XboxAuthNet/XboxLive/Requests/XboxSisuAuthRequest.cs
class XboxSisuAuthRequest (line 9) | public class XboxSisuAuthRequest : AbstractXboxSignedAuthRequest
method BuildBody (line 18) | protected override object BuildBody(object proofKey)
method Send (line 38) | public Task<XboxSisuResponse> Send(HttpClient httpClient, IXboxRequest...
FILE: XAU/Util/XboxAuthNet/XboxLive/Requests/XboxTitleTokenRequest.cs
class XboxTitleTokenRequest (line 9) | public class XboxTitleTokenRequest : AbstractXboxSignedAuthRequest
method BuildBody (line 17) | protected override object BuildBody(object proofKey)
method Send (line 39) | public Task<XboxAuthResponse> Send(HttpClient httpClient, IXboxRequest...
FILE: XAU/Util/XboxAuthNet/XboxLive/Requests/XboxUserTokenRequest.cs
class XboxUserTokenRequest (line 8) | public class XboxUserTokenRequest : AbstractXboxAuthRequest
method XboxUserTokenRequest (line 12) | public XboxUserTokenRequest()
method BuildRequest (line 21) | protected override HttpRequestMessage BuildRequest()
method Send (line 47) | public Task<XboxAuthResponse> Send(HttpClient httpClient)
FILE: XAU/Util/XboxAuthNet/XboxLive/Requests/XboxXstsRequest.cs
class XboxXstsRequest (line 8) | public class XboxXstsRequest : AbstractXboxAuthRequest
method XboxXstsRequest (line 12) | public XboxXstsRequest()
method BuildRequest (line 24) | protected override HttpRequestMessage BuildRequest()
method Send (line 54) | public Task<XboxAuthResponse> Send(HttpClient httpClient)
FILE: XAU/Util/XboxAuthNet/XboxLive/Responses/XErrJsonConverter.cs
class XErrJsonConverter (line 7) | public class XErrJsonConverter : JsonConverter<string>
method Read (line 9) | public override string? Read(ref Utf8JsonReader reader, Type typeToCon...
method Write (line 21) | public override void Write(Utf8JsonWriter writer, string value, JsonSe...
FILE: XAU/Util/XboxAuthNet/XboxLive/Responses/XboxAuthResponse.cs
class XboxAuthResponse (line 6) | public class XboxAuthResponse
method Validate (line 25) | public bool Validate()
FILE: XAU/Util/XboxAuthNet/XboxLive/Responses/XboxAuthResponseHandler.cs
class XboxAuthResponseHandler (line 8) | public class XboxAuthResponseHandler
method HandleResponse (line 10) | public async Task<T> HandleResponse<T>(HttpResponseMessage res)
FILE: XAU/Util/XboxAuthNet/XboxLive/Responses/XboxAuthXuiClaims.cs
class XboxAuthXuiClaims (line 6) | public class XboxAuthXuiClaims
FILE: XAU/Util/XboxAuthNet/XboxLive/Responses/XboxAuthXuiClaimsJsonConverter.cs
class XboxAuthXuiClaimsJsonConverter (line 7) | public class XboxAuthXuiClaimsJsonConverter : JsonConverter<XboxAuthXuiC...
method Read (line 9) | public override XboxAuthXuiClaims? Read(ref Utf8JsonReader reader, Typ...
method readXui (line 38) | private XboxAuthXuiClaims? readXui(ref Utf8JsonReader reader, JsonSeri...
method Write (line 63) | public override void Write(Utf8JsonWriter writer, XboxAuthXuiClaims va...
FILE: XAU/Util/XboxAuthNet/XboxLive/Responses/XboxErrorResponse.cs
class XboxErrorResponse (line 5) | public class XboxErrorResponse
FILE: XAU/Util/XboxAuthNet/XboxLive/Responses/XboxSisuResponse.cs
class XboxSisuResponse (line 5) | public class XboxSisuResponse
FILE: XAU/Util/XboxAuthNet/XboxLive/XboxAuthClient.cs
class XboxAuthClient (line 8) | public class XboxAuthClient
method XboxAuthClient (line 12) | public XboxAuthClient(HttpClient httpClient) =>
method RequestUserToken (line 15) | public Task<XboxAuthResponse> RequestUserToken(string rps) =>
method RequestUserToken (line 21) | public Task<XboxAuthResponse> RequestUserToken(XboxUserTokenRequest re...
method RequestXsts (line 24) | public Task<XboxAuthResponse> RequestXsts(string userToken) =>
method RequestXsts (line 30) | public Task<XboxAuthResponse> RequestXsts(string userToken, string rel...
method RequestXsts (line 37) | public Task<XboxAuthResponse> RequestXsts(XboxXstsRequest request) =>
FILE: XAU/Util/XboxAuthNet/XboxLive/XboxAuthConstants.cs
class XboxAuthConstants (line 3) | public class XboxAuthConstants
FILE: XAU/Util/XboxAuthNet/XboxLive/XboxAuthException.cs
class XboxAuthException (line 9) | public class XboxAuthException : Exception
method XboxAuthException (line 11) | public XboxAuthException(string message, int statusCode) : base(messag...
method XboxAuthException (line 14) | public XboxAuthException(string? error, string? message, string? redir...
method CreateMessageFromError (line 17) | private static string CreateMessageFromError(params string?[] inputs)
method FromResponseBody (line 29) | public static XboxAuthException FromResponseBody(string responseBody, ...
method FromResponseHeaders (line 46) | public static XboxAuthException FromResponseHeaders(HttpResponseHeader...
FILE: XAU/Util/XboxAuthNet/XboxLive/XboxAuthXuiClaimNames.cs
class XboxAuthXuiClaimNames (line 3) | public static class XboxAuthXuiClaimNames
FILE: XAU/Util/XboxAuthNet/XboxLive/XboxDeviceTypes.cs
class XboxDeviceTypes (line 7) | public class XboxDeviceTypes
FILE: XAU/Util/XboxAuthNet/XboxLive/XboxGameTitles.cs
class XboxGameTitles (line 3) | public static class XboxGameTitles
FILE: XAU/Util/XboxAuthNet/XboxLive/XboxSignedClient.cs
class XboxSignedClient (line 8) | public class XboxSignedClient
method XboxSignedClient (line 13) | public XboxSignedClient(HttpClient httpClient)
method XboxSignedClient (line 19) | public XboxSignedClient(IXboxRequestSigner signer, HttpClient httpClient)
method RequestSignedUserToken (line 25) | public Task<XboxAuthResponse> RequestSignedUserToken(string rps) =>
method RequestSignedUserToken (line 31) | public Task<XboxAuthResponse> RequestSignedUserToken(XboxSignedUserTok...
method RequestDeviceToken (line 34) | public Task<XboxAuthResponse> RequestDeviceToken(string deivceType, st...
method RequestDeviceToken (line 41) | public Task<XboxAuthResponse> RequestDeviceToken(XboxDeviceTokenReques...
method RequestTitleToken (line 44) | public Task<XboxAuthResponse> RequestTitleToken(string accessToken, st...
method RequestTitleToken (line 51) | public Task<XboxAuthResponse> RequestTitleToken(XboxTitleTokenRequest ...
method SisuAuth (line 54) | public Task<XboxSisuResponse> SisuAuth(XboxSisuAuthRequest request) =>
method RequestXstsToken (line 57) | public Task<XboxAuthResponse> RequestXstsToken(XboxXstsRequest request...
method RequestSignedXstsToken (line 60) | public Task<XboxAuthResponse> RequestSignedXstsToken(XboxSignedXstsReq...
FILE: XAU/ViewModels/Pages/AchievementsViewModel.cs
class AchievementsViewModel (line 17) | public partial class AchievementsViewModel : ObservableObject, INavigati...
method AchievementsViewModel (line 47) | public AchievementsViewModel(ISnackbarService snackbarService, IConten...
class DGAchievement (line 59) | public class DGAchievement
method OnNavigatedTo (line 73) | public async void OnNavigatedTo()
method OnNavigatedFrom (line 119) | public void OnNavigatedFrom() { }
method InitializeViewModel (line 121) | private async void InitializeViewModel()
method LoadGameInfo (line 135) | private async Task LoadGameInfo()
method SpoofGame (line 166) | private async void SpoofGame()
method Spoofing (line 211) | public async Task Spoofing()
method LoadAchievements (line 237) | private async Task LoadAchievements()
method UnlockAchievement (line 498) | public async void UnlockAchievement(int AchievementIndex)
method UnlockAll (line 628) | [RelayCommand]
method RefreshAchievements (line 660) | [RelayCommand]
method SearchAndFilterAchievements (line 673) | [RelayCommand]
FILE: XAU/ViewModels/Pages/DebugViewModel.cs
class DebugViewModel (line 11) | public partial class DebugViewModel : ObservableObject, INavigationAware
method OnNavigatedTo (line 15) | public void OnNavigatedTo()
method OnNavigatedFrom (line 21) | public void OnNavigatedFrom() { }
method InitializeViewModel (line 23) | private void InitializeViewModel()
method DebugViewModel (line 27) | public DebugViewModel(ISnackbarService snackbarService, IContentDialog...
method TestEventReplacements (line 36) | [RelayCommand]
FILE: XAU/ViewModels/Pages/GamesViewModel.cs
class GamesViewModel (line 9) | public partial class GamesViewModel(ISnackbarService snackbarService, IN...
class Game (line 30) | public class Game
method OnNavigatedTo (line 48) | public async void OnNavigatedTo()
method OnNavigatedFrom (line 54) | public void OnNavigatedFrom()
method InitializeViewModel (line 58) | private async Task InitializeViewModel()
method GetGamesList (line 67) | [RelayCommand]
method LoadGame (line 89) | private void LoadGame()
method OpenAchievements (line 100) | public async Task OpenAchievements(string index)
method SearchAndFilterGames (line 108) | [RelayCommand]
method FilterGames (line 215) | [RelayCommand]
method AddGame (line 311) | private void AddGame(int index)
method PageChanged (line 331) | [RelayCommand]
method LoadingStart (line 351) | public void LoadingStart()
method LoadingEnd (line 358) | public void LoadingEnd()
method CopyToClipboard (line 365) | public void CopyToClipboard(string index)
FILE: XAU/ViewModels/Pages/HomeViewModel.cs
class ImageItem (line 26) | public partial class ImageItem : ObservableObject
class HomeViewModel (line 32) | public partial class HomeViewModel : ObservableObject, INavigationAware
method HomeViewModel (line 72) | public HomeViewModel(ISnackbarService snackbarService, IContentDialogS...
method RefreshProfile (line 86) | [RelayCommand]
method OnNavigatedTo (line 110) | public async void OnNavigatedTo()
method OnNavigatedFrom (line 115) | public void OnNavigatedFrom() { }
method CheckForToolUpdates (line 118) | private async Task CheckForToolUpdates()
method CheckForEventUpdates (line 175) | private async void CheckForEventUpdates()
method UpdateTool (line 195) | private void UpdateTool(object sender, AsyncCompletedEventArgs e)
method UpdateEvents (line 216) | private async void UpdateEvents()
method CheckForXboxGamesDatabaseUpdate (line 256) | private async void CheckForXboxGamesDatabaseUpdate()
method InitializeViewModel (line 319) | private async Task InitializeViewModel()
method XauthWorker_DoWork (line 390) | public void XauthWorker_DoWork(object sender, DoWorkEventArgs e)
method XauthWorker_ProgressChanged (line 408) | public void XauthWorker_ProgressChanged(object sender, ProgressChanged...
method XauthWorker_RunWorkerCompleted (line 442) | public void XauthWorker_RunWorkerCompleted(object sender, RunWorkerCom...
method GetXAUTH (line 447) | private async void GetXAUTH()
method TestXAUTH (line 493) | private async void TestXAUTH()
method EventsLog (line 542) | public static void EventsLog(string msg)
method PersistEventsToken (line 554) | public void PersistEventsToken()
method EventsTokenWorker_DoWork (line 567) | public void EventsTokenWorker_DoWork(object sender, DoWorkEventArgs e)
method EventsTokenWorkerLoop (line 579) | private void EventsTokenWorkerLoop()
method GrabEventsTokenFromSolitaire (line 642) | private void GrabEventsTokenFromSolitaire()
method ScanForEventsTokenManual (line 767) | public void ScanForEventsTokenManual()
method IsEventsTokenValid (line 795) | public static bool IsEventsTokenValid()
method IsEventsTokenExpired (line 806) | public static bool IsEventsTokenExpired()
method OAuthLogin (line 829) | [RelayCommand]
method DeleteAuthFile (line 856) | private void DeleteAuthFile()
method CompleteLogin (line 861) | private void CompleteLogin(MicrosoftOAuthResponse response, string? su...
method TryRestoreSessionAsync (line 869) | private async Task<MicrosoftOAuthResponse?> TryRestoreSessionAsync()
method TryInteractiveLoginAsync (line 908) | private async Task<MicrosoftOAuthResponse?> TryInteractiveLoginAsync()
method GenerateTokens (line 923) | private async void GenerateTokens(MicrosoftOAuthResponse response)
method ClearProfileState (line 968) | private void ClearProfileState()
method readSession (line 1000) | private MicrosoftOAuthResponse readSession()
method writeSession (line 1018) | private void writeSession(MicrosoftOAuthResponse response)
method GrabProfile (line 1032) | private async void GrabProfile()
method LoadSettings (line 1155) | private void LoadSettings()
FILE: XAU/ViewModels/Pages/InfoViewModel.cs
class InfoViewModel (line 5) | public partial class InfoViewModel : ObservableObject, INavigationAware
method OnNavigatedTo (line 9) | public void OnNavigatedTo()
method OnNavigatedFrom (line 14) | public void OnNavigatedFrom() { }
method InitializeViewModel (line 16) | private void InitializeViewModel()
method OpenDiscordUrl (line 22) | [RelayCommand]
method OpenGithubUserUrl (line 32) | [RelayCommand]
FILE: XAU/ViewModels/Pages/MiscViewModel.cs
class MiscViewModel (line 18) | public partial class MiscViewModel : ObservableObject, INavigationAware
method MiscViewModel (line 27) | public MiscViewModel(ISnackbarService snackbarService)
method OnNavigatedTo (line 33) | public void OnNavigatedTo()
method OnNavigatedFrom (line 39) | public void OnNavigatedFrom()
method InitializeViewModel (line 43) | private void InitializeViewModel()
method SpooferButtonClicked (line 69) | [RelayCommand]
method SpoofGame (line 103) | public async void SpoofGame()
method Spoofing (line 166) | public async Task Spoofing()
method GetDatabasePath (line 209) | private string GetDatabasePath()
method SearchGame (line 214) | [RelayCommand]
method SearchGamesInDatabase (line 263) | private List<GameItem> SearchGamesInDatabase(string dbPath, string sea...
method DisplayGameInfo (line 295) | public void DisplayGameInfo(int index)
method SearchGamertag (line 333) | [RelayCommand]
method ExportToCsvAsync (line 357) | public async Task ExportToCsvAsync()
FILE: XAU/ViewModels/Pages/SettingsViewModel.cs
class SettingsViewModel (line 9) | public partial class SettingsViewModel : ObservableObject, INavigationAw...
method SaveSettings (line 43) | [RelayCommand]
method ToggleServer (line 66) | [RelayCommand]
method UpdateServerPort (line 92) | [RelayCommand]
method RestartAsAdmin (line 105) | [RelayCommand]
method OpenListeningAddress (line 114) | [RelayCommand]
method OnNavigatedTo (line 134) | public void OnNavigatedTo()
method OnNavigatedFrom (line 144) | public void OnNavigatedFrom()
method InitializeViewModel (line 147) | private void InitializeViewModel()
method LoadSettings (line 166) | public void LoadSettings()
method GetAssemblyVersion (line 183) | private string GetAssemblyVersion()
method UpdateListeningAddress (line 189) | private void UpdateListeningAddress()
method OnServerPortChanged (line 196) | partial void OnServerPortChanged(string value)
method Dispose (line 206) | public void Dispose()
FILE: XAU/ViewModels/Pages/StatsViewModel.cs
class StatsViewModel (line 5) | public partial class StatsViewModel : ObservableObject, INavigationAware
method OnNavigatedTo (line 8) | public void OnNavigatedTo()
method OnNavigatedFrom (line 13) | public void OnNavigatedFrom() { }
method InitializeViewModel (line 15) | private void InitializeViewModel()
FILE: XAU/ViewModels/Windows/MainWindowViewModel.cs
class MainWindowViewModel (line 8) | public partial class MainWindowViewModel : ObservableObject
method MainWindowViewModel (line 12) | public MainWindowViewModel(IContentDialogService contentDialogService)
method ShowErrorDialog (line 17) | public async Task ShowErrorDialog(Exception exception)
FILE: XAU/Views/Pages/AchievementsPage.xaml.cs
class AchievementsPage (line 12) | public partial class AchievementsPage : INavigableView<AchievementsViewM...
method AchievementsPage (line 16) | public AchievementsPage(AchievementsViewModel viewModel)
method UnlockButton (line 23) | private void UnlockButton(object sender, RoutedEventArgs e)
method FilterBox_OnSelectionChanged (line 29) | private void FilterBox_OnSelectionChanged(object sender, SelectionChan...
method SearchBox_OnKeyDownAsync (line 35) | private async void SearchBox_OnKeyDownAsync(object sender, KeyEventArg...
FILE: XAU/Views/Pages/DebugPage.xaml.cs
class DebugPage (line 6) | public partial class DebugPage : INavigableView<DebugViewModel>
method DebugPage (line 10) | public DebugPage(DebugViewModel viewModel)
FILE: XAU/Views/Pages/GamesPage.xaml.cs
class GamesPage (line 13) | public partial class GamesPage : INavigableView<GamesViewModel>
method GamesPage (line 16) | public GamesPage(GamesViewModel viewModel)
method ButtonBase_OnClick (line 23) | private async void ButtonBase_OnClick(object sender, RoutedEventArgs e)
method SearchBox_OnKeyDown (line 30) | private void SearchBox_OnKeyDown(object sender, KeyEventArgs e)
method FilterBox_OnSelectionChanged (line 40) | private void FilterBox_OnSelectionChanged(object sender, SelectionChan...
method PageBox_OnSelectionChanged (line 46) | private void PageBox_OnSelectionChanged(object sender, SelectionChange...
method ButtonBase_RightClick (line 52) | private void ButtonBase_RightClick(object sender, MouseButtonEventArgs e)
method Image_ImageFailed (line 58) | private void Image_ImageFailed(object sender, RoutedEventArgs e)
FILE: XAU/Views/Pages/HomePage.xaml.cs
class HomePage (line 6) | public partial class HomePage : INavigableView<HomeViewModel>
method HomePage (line 10) | public HomePage(HomeViewModel viewModel)
FILE: XAU/Views/Pages/InfoPage.xaml.cs
class InfoPage (line 9) | public partial class InfoPage : INavigableView<InfoViewModel>
method InfoPage (line 13) | public InfoPage(InfoViewModel viewModel)
FILE: XAU/Views/Pages/MiscPage.xaml.cs
class MiscPage (line 8) | public partial class MiscPage : INavigableView<MiscViewModel>
method MiscPage (line 12) | public MiscPage(MiscViewModel viewModel)
method Selector_OnSelectionChanged (line 19) | private void Selector_OnSelectionChanged(object sender, SelectionChang...
method TitleIDSearch_OnKeyDown (line 25) | private void TitleIDSearch_OnKeyDown(object sender, KeyEventArgs e)
method GamertagSearch_OnKeyDown (line 35) | private void GamertagSearch_OnKeyDown(object sender, KeyEventArgs e)
method ExportToCsvButton_Click (line 50) | private async void ExportToCsvButton_Click(object sender, RoutedEventA...
FILE: XAU/Views/Pages/PlaceholderPage.xaml.cs
class PlaceholderPage (line 8) | public partial class PlaceholderPage : Page
method PlaceholderPage (line 10) | public PlaceholderPage()
FILE: XAU/Views/Pages/SettingsPage.xaml.cs
class SettingsPage (line 11) | public partial class SettingsPage : INavigableView<SettingsViewModel>
method SettingsPage (line 20) | public SettingsPage(SettingsViewModel viewModel, ISnackbarService snac...
method SyncEventsTokenUI (line 68) | private void SyncEventsTokenUI()
method XauthTextBox_OnTextChanged (line 75) | private void XauthTextBox_OnTextChanged(object sender, TextChangedEven...
method EventsToken_OnTextChanged (line 93) | private void EventsToken_OnTextChanged(object sender, TextChangedEvent...
method XAuthBox_OnSizeChanged (line 108) | private void XAuthBox_OnSizeChanged(object sender, SizeChangedEventArg...
method GrabEventsToken_OnClick (line 113) | private void GrabEventsToken_OnClick(object sender, RoutedEventArgs e)
method UpdateEventsTokenStatus (line 138) | private void UpdateEventsTokenStatus()
method UpdateEventsTokenTimestamps (line 167) | private void UpdateEventsTokenTimestamps()
method EventsBoxGrid_OnSizeChanged (line 199) | private void EventsBoxGrid_OnSizeChanged(object sender, SizeChangedEve...
FILE: XAU/Views/Pages/StatsPage.xaml.cs
class StatsPage (line 9) | public partial class StatsPage : INavigableView<StatsViewModel>
method StatsPage (line 13) | public StatsPage(StatsViewModel viewModel)
FILE: XAU/Views/Windows/MainWindow.xaml.cs
class MainWindow (line 7) | public partial class MainWindow
method MainWindow (line 11) | public MainWindow(
method NavigationView_OnLoaded (line 32) | private void NavigationView_OnLoaded(object sender, RoutedEventArgs e)
Condensed preview — 148 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (640K chars).
[
{
"path": ".editorconfig",
"chars": 591,
"preview": "# Remove the line below if you want to inherit .editorconfig settings from higher directories\nroot = true\n\n# C# files\n[*"
},
{
"path": ".gitattributes",
"chars": 2517,
"preview": "###############################################################################\n# Set default behavior to automatically "
},
{
"path": ".github/FUNDING.yml",
"chars": 18,
"preview": "github: ItsLogic\r\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yml",
"chars": 1141,
"preview": "name: Bug Report\ndescription: File a bug report\ntitle: \"[Bug]: \"\nlabels: [\"bug\"]\nbody:\n - type: markdown\n attributes"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 27,
"preview": "blank_issues_enabled: false"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.yml",
"chars": 796,
"preview": "name: Feature/Improvement request\ndescription: Make a request for a new feature or an improvement to an existing feature"
},
{
"path": ".github/ISSUE_TEMPLATE/game_request.yml",
"chars": 1290,
"preview": "name: Game Request\ndescription: Request support for an event-based game\ntitle: \"[Game]: \"\nlabels: [\"Game\"]\nbody:\n - typ"
},
{
"path": ".github/workflows/Build-Events-Zip.yml",
"chars": 1480,
"preview": "name: Update Events Data\n\non:\n push:\n paths:\n - 'Events/**'\n - 'Events'\n branches:\n - Main\n\njobs:\n"
},
{
"path": ".github/workflows/Build-Pre-Release.yml",
"chars": 2779,
"preview": "name: .NET 8 Build\n\non:\n push:\n branches: [ Main ]\n paths-ignore:\n - '**.md'\n - '**/ISSUE_TEMPLATE/**'\n"
},
{
"path": ".gitignore",
"chars": 6223,
"preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## G"
},
{
"path": ".gitmodules",
"chars": 88,
"preview": "[submodule \"Events\"]\n\tpath = Events\n\turl = https://github.com/Fumo-Unlockers/XAU-Events\n"
},
{
"path": ".idea/.idea.XAU/.idea/.gitignore",
"chars": 273,
"preview": "# Default ignored files\n/shelf/\n/workspace.xml\n# Rider ignored files\n/projectSettingsUpdater.xml\n/.idea.XAU.iml\n/module"
},
{
"path": ".idea/.idea.XAU/.idea/encodings.xml",
"chars": 169,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"Encoding\" addBOMForNewFiles=\"with BOM un"
},
{
"path": ".idea/.idea.XAU/.idea/indexLayout.xml",
"chars": 198,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"UserContentModel\">\n <attachedFolders "
},
{
"path": ".idea/.idea.XAU/.idea/riderPublish.xml",
"chars": 298,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"LocationsWithSilentDeleteHolder\">\n <o"
},
{
"path": ".idea/.idea.XAU/.idea/vcs.xml",
"chars": 167,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"VcsDirectoryMappings\">\n <mapping dire"
},
{
"path": ".run/Debug.run.xml",
"chars": 1115,
"preview": "<component name=\"ProjectRunConfigurationManager\">\n <configuration default=\"false\" name=\"Debug\" type=\"DotNetProject\" fa"
},
{
"path": ".run/Publish Debug.run.xml",
"chars": 566,
"preview": "<component name=\"ProjectRunConfigurationManager\">\n <configuration default=\"false\" name=\"Publish Debug\" type=\"DotNetFol"
},
{
"path": ".run/Publish Release.run.xml",
"chars": 572,
"preview": "<component name=\"ProjectRunConfigurationManager\">\n <configuration default=\"false\" name=\"Publish Release\" type=\"DotNetF"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 788,
"preview": "# Code of Conduct\n\n## 1. Acceptance\n\nWe believe in the inherent dignity of all individuals. We stand for the acceptance "
},
{
"path": "CONTRIBUTING.md",
"chars": 1305,
"preview": "# Contributing Guidelines\n\nWe love your input! We want to make contributing to this project as easy and transparent as p"
},
{
"path": "Clown-Behaviour.md",
"chars": 3090,
"preview": "# This a fun list of people acting like clowns\n\n## 1. S1MXN (Simon)\nThis user goes by S1MXN on [youtube](https://www.you"
},
{
"path": "Doc/Events.md",
"chars": 36576,
"preview": "# Events Guide\n\nThis guide provides information on how to work with events, set up your system to see events, and how to"
},
{
"path": "LICENSE",
"chars": 35149,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "LICENSE.MIT",
"chars": 1125,
"preview": "MIT License\n\nCopyright (c) 2021-2023 Leszek Pomianowski and WPF UI Contributors. https://dev.lepo.co/\n\nPermission is her"
},
{
"path": "README.md",
"chars": 4475,
"preview": "# Xbox Achievement Unlocker\n\n![GitHub contributors][contributors-badge]\n![GitHub forks][forks-badge]\n![GitHub stars][sta"
},
{
"path": "XAU/App.xaml",
"chars": 790,
"preview": "<Application x:Class=\"XAU.App\"\n xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n "
},
{
"path": "XAU/App.xaml.cs",
"chars": 2844,
"preview": "using Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Hosting;\nusing Wpf.Ui.Contracts;\nusing Wpf.Ui"
},
{
"path": "XAU/AssemblyInfo.cs",
"chars": 98,
"preview": "[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)]\n"
},
{
"path": "XAU/Models/GitHubResponse.cs",
"chars": 642,
"preview": "using Newtonsoft.Json;\n\npublic class EventsUpdateResponse\n{\n public int Timestamp { get; set; }\n public string? Da"
},
{
"path": "XAU/Models/MiscItems.cs",
"chars": 172,
"preview": "\n public class GameItem\n {\n public string Title { get; set; }\n public string TitleId { get; set; }\n "
},
{
"path": "XAU/Models/XAUSettings.cs",
"chars": 743,
"preview": "public class XAUSettings\n{\n public string? SettingsVersion { get; set; }\n public string? ToolVersion { get; set; }"
},
{
"path": "XAU/Models/XboxApiRequest.cs",
"chars": 1510,
"preview": "// TODO: Clean up, set names, default fields, minor renames, etc.\n\npublic class GameTitleRequest\n{\n public string? Pf"
},
{
"path": "XAU/Models/XboxApiResponse.cs",
"chars": 14446,
"preview": "// OpenAPI or Swagger doesn't exist. But let's try and type the things we need to make parsing more readable\n// https://"
},
{
"path": "XAU/Networking/DBoxRestAPI.cs",
"chars": 1473,
"preview": "using System.Net;\nusing System.Net.Http;\nusing HtmlAgilityPack;\nusing Newtonsoft.Json.Linq;\n\npublic class DBoxRestApi\n{\n"
},
{
"path": "XAU/Networking/GithubRestApi.cs",
"chars": 2798,
"preview": "using System.Net;\nusing System.Net.Http;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\n\npublic class GithubRestApi\n"
},
{
"path": "XAU/Networking/XboxRestApi.cs",
"chars": 17772,
"preview": "using System.Net;\nusing System.Net.Http;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing Newtonsoft.Json;"
},
{
"path": "XAU/Services/ApplicationHostService.cs",
"chars": 2091,
"preview": "using Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Hosting;\nusing XAU.Views.Pages;\nusing XAU.Vie"
},
{
"path": "XAU/Services/HttpServer/AchievementRoutes.cs",
"chars": 9226,
"preview": "using Newtonsoft.Json;\nusing System.IO;\nusing System.Net;\nusing System.Net.Http;\nusing System.Text;\n\npublic static class"
},
{
"path": "XAU/Services/HttpServer/EndpointRoutes.cs",
"chars": 13084,
"preview": "using Newtonsoft.Json;\nusing System.Net;\nusing System.Text;\n\npublic static class EndpointRoutes\n{\n public static Dict"
},
{
"path": "XAU/Services/HttpServer/GameRoutes.cs",
"chars": 7774,
"preview": "using Newtonsoft.Json;\nusing System.Net;\nusing System.Text;\n\npublic static class GameRoutes\n{\n public static Dictiona"
},
{
"path": "XAU/Services/HttpServer/HttpServer.cs",
"chars": 7108,
"preview": "using System.Diagnostics;\nusing System.Net;\nusing System.Security.Principal;\nusing System.Runtime.Versioning;\nusing Syst"
},
{
"path": "XAU/Services/HttpServer/ProfileRoutes.cs",
"chars": 5421,
"preview": "using Newtonsoft.Json;\nusing System.Net;\nusing System.Text;\n\npublic static class ProfileRoutes\n{\n public static Dicti"
},
{
"path": "XAU/Services/HttpServer/Routes.cs",
"chars": 2482,
"preview": "using Newtonsoft.Json;\nusing System.Net;\nusing System.Text;\r\n\r\npublic static class Routes\r\n{\r\n public static Dictiona"
},
{
"path": "XAU/Services/HttpServer/SpoofingRoutes.cs",
"chars": 2744,
"preview": "using Newtonsoft.Json;\nusing System.IO;\nusing System.Net;\nusing System.Text;\n\npublic static class SpoofingRoutes\n{\n p"
},
{
"path": "XAU/Theme/ThemeConstants.xaml",
"chars": 312,
"preview": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n xmlns:x=\"http:"
},
{
"path": "XAU/Usings.cs",
"chars": 555,
"preview": "global using CommunityToolkit.Mvvm.ComponentModel;\nglobal using CommunityToolkit.Mvvm.Input;\nglobal using System;\nglobal"
},
{
"path": "XAU/Util/Constants/Constants.cs",
"chars": 4606,
"preview": "// Minimize total number of string allocations if .NET runtime is opting to not intern them\nstruct StringConstants\n{\n "
},
{
"path": "XAU/Util/Etw/EtwTokenCapture.cs",
"chars": 15949,
"preview": "using System.Diagnostics;\nusing System.IO;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing XAU.ViewModels"
},
{
"path": "XAU/Util/Files/FileDownloader.cs",
"chars": 1307,
"preview": "using System.ComponentModel;\nusing System.IO;\nusing System.Net.Http;\n\npublic class FileDownloader : IDisposable\n{\n pr"
},
{
"path": "XAU/Util/Memory/Methods/AoB.cs",
"chars": 11799,
"preview": "using System;\nusing System.Collections.Concurrent;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing Sy"
},
{
"path": "XAU/Util/Memory/Methods/Read.cs",
"chars": 1622,
"preview": "using System;\nusing System.Collections.Concurrent;\nusing System.Diagnostics;\nusing System.Text;\nusing System.Threading;"
},
{
"path": "XAU/Util/Memory/Structures/Imports.cs",
"chars": 4145,
"preview": "using System;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nnamespace Memory\n{\n public class Imps\n {\n"
},
{
"path": "XAU/Util/Memory/Structures/MemoryRegionResult.cs",
"chars": 296,
"preview": "using System;\n\nnamespace Memory\n{\n /// <summary>\n /// AoB scan information.\n /// </summary>\n struct MemoryR"
},
{
"path": "XAU/Util/Memory/Structures/Process.cs",
"chars": 364,
"preview": "using System;\nusing System.Diagnostics;\n\nnamespace Memory\n{\n /// <summary>\n /// Information about the opened proc"
},
{
"path": "XAU/Util/Memory/memory.cs",
"chars": 21073,
"preview": "using System;\nusing System.IO;\nusing System.IO.Pipes;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System"
},
{
"path": "XAU/Util/XboxAuthNet/Base64UrlHelper.cs",
"chars": 10317,
"preview": "// https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/blob/9895855ac4fcf52893fbc2b06ee20ea3eda1549a/"
},
{
"path": "XAU/Util/XboxAuthNet/ErrorCodes.cs",
"chars": 6135,
"preview": "namespace XboxAuthNet\n{\n // https://github.com/microsoft/xbox-live-api/blob/f1a347b91f5f5dae62c35623719ecf8b9ba68746"
},
{
"path": "XAU/Util/XboxAuthNet/ErrorHelper.cs",
"chars": 799,
"preview": "using System;\n\nnamespace XboxAuthNet\n{\n internal static class ErrorHelper\n {\n public static string? Conver"
},
{
"path": "XAU/Util/XboxAuthNet/FodyWeavers.xml",
"chars": 217,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Weavers xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSc"
},
{
"path": "XAU/Util/XboxAuthNet/HttpHelper.cs",
"chars": 1134,
"preview": "using System.Collections.Generic;\nusing System.Linq;\nusing System.Net.Http.Json;\nusing System.Web;\nusing System.Text.Js"
},
{
"path": "XAU/Util/XboxAuthNet/Jwt/JwtDecoder.cs",
"chars": 1967,
"preview": "using System;\nusing System.Text;\nusing System.Text.Json;\n\nnamespace XboxAuthNet.Jwt\n{\n internal static class JwtDeco"
},
{
"path": "XAU/Util/XboxAuthNet/OAuth/CodeFlow/AuthCodeException.cs",
"chars": 353,
"preview": "namespace XboxAuthNet.OAuth.CodeFlow;\n\ninternal class AuthCodeException : Exception\n{\n public AuthCodeException(stri"
},
{
"path": "XAU/Util/XboxAuthNet/OAuth/CodeFlow/CodeFlowAuthenticator.cs",
"chars": 2051,
"preview": "using XboxAuthNet.OAuth.CodeFlow.Parameters;\n\nnamespace XboxAuthNet.OAuth.CodeFlow;\n\npublic class CodeFlowAuthenticator"
},
{
"path": "XAU/Util/XboxAuthNet/OAuth/CodeFlow/CodeFlowAuthorizationResult.cs",
"chars": 551,
"preview": "namespace XboxAuthNet.OAuth.CodeFlow;\n\npublic struct CodeFlowAuthorizationResult\n{\n public string? Code { get; set; "
},
{
"path": "XAU/Util/XboxAuthNet/OAuth/CodeFlow/CodeFlowBuilder.cs",
"chars": 1996,
"preview": "namespace XboxAuthNet.OAuth.CodeFlow;\n\npublic class CodeFlowBuilder\n{\n private readonly ICodeFlowApiClient _apiClient"
},
{
"path": "XAU/Util/XboxAuthNet/OAuth/CodeFlow/CodeFlowLiveApiClient.cs",
"chars": 4279,
"preview": "using System.Net.Http;\nusing XboxAuthNet.OAuth.CodeFlow.Parameters;\n\nnamespace XboxAuthNet.OAuth.CodeFlow;\n\npublic clas"
},
{
"path": "XAU/Util/XboxAuthNet/OAuth/CodeFlow/CodeFlowUriChecker.cs",
"chars": 585,
"preview": "using System.Web;\n\nnamespace XboxAuthNet.OAuth.CodeFlow;\n\npublic class CodeFlowUrlChecker : ICodeFlowUrlChecker\n{\n p"
},
{
"path": "XAU/Util/XboxAuthNet/OAuth/CodeFlow/ICodeFlowApiClient.cs",
"chars": 520,
"preview": "using XboxAuthNet.OAuth.CodeFlow.Parameters;\n\nnamespace XboxAuthNet.OAuth.CodeFlow;\n\npublic interface ICodeFlowApiClient"
},
{
"path": "XAU/Util/XboxAuthNet/OAuth/CodeFlow/ICodeFlowUrlChecker.cs",
"chars": 159,
"preview": "namespace XboxAuthNet.OAuth.CodeFlow\n{\n public interface ICodeFlowUrlChecker\n {\n CodeFlowAuthorizationResu"
},
{
"path": "XAU/Util/XboxAuthNet/OAuth/CodeFlow/IWebUI.cs",
"chars": 328,
"preview": "// This code is from MSAL.NET\n\nnamespace XboxAuthNet.OAuth.CodeFlow;\n\npublic interface IWebUI\n{\n Task<CodeFlowAuthor"
},
{
"path": "XAU/Util/XboxAuthNet/OAuth/CodeFlow/MicrosoftOAuthPromptModes.cs",
"chars": 1079,
"preview": "namespace XboxAuthNet.OAuth.CodeFlow;\n\npublic static class MicrosoftOAuthPromptModes\n{\n /// <summary>\n /// Forces"
},
{
"path": "XAU/Util/XboxAuthNet/OAuth/CodeFlow/Parameters/CodeFlowAccessTokenParameter.cs",
"chars": 871,
"preview": "using System.Text.Json.Serialization;\n\nnamespace XboxAuthNet.OAuth.CodeFlow.Parameters;\n\npublic class CodeFlowAccessToke"
},
{
"path": "XAU/Util/XboxAuthNet/OAuth/CodeFlow/Parameters/CodeFlowAuthorizationParameter.cs",
"chars": 1595,
"preview": "using System.Text.Json.Serialization;\n\nnamespace XboxAuthNet.OAuth.CodeFlow.Parameters;\n\npublic class CodeFlowAuthorizat"
},
{
"path": "XAU/Util/XboxAuthNet/OAuth/CodeFlow/Parameters/CodeFlowParameter.cs",
"chars": 1193,
"preview": "using System.Text.Json.Serialization;\n\nnamespace XboxAuthNet.OAuth.CodeFlow.Parameters;\n\npublic class CodeFlowParameter"
},
{
"path": "XAU/Util/XboxAuthNet/OAuth/CodeFlow/Parameters/CodeFlowRefreshTokenParameter.cs",
"chars": 409,
"preview": "using System.Text.Json.Serialization;\n\nnamespace XboxAuthNet.OAuth.CodeFlow.Parameters;\n\npublic class CodeFlowRefreshTok"
},
{
"path": "XAU/Util/XboxAuthNet/OAuth/CodeFlow/WebUIOptions.cs",
"chars": 227,
"preview": "namespace XboxAuthNet.OAuth.CodeFlow;\n\npublic class WebUIOptions\n{\n public object? ParentObject { get; set; }\n pu"
},
{
"path": "XAU/Util/XboxAuthNet/OAuth/MicrosoftOAuthException.cs",
"chars": 2906,
"preview": "using System.Text.Json;\n\nnamespace XboxAuthNet.OAuth;\n\npublic class MicrosoftOAuthException : Exception\n{\n public Mi"
},
{
"path": "XAU/Util/XboxAuthNet/OAuth/MicrosoftOAuthResponse.cs",
"chars": 2115,
"preview": "using System.Text.Json;\nusing System.Text.Json.Serialization;\nusing XboxAuthNet.Jwt;\n\nnamespace XboxAuthNet.OAuth;\n\npub"
},
{
"path": "XAU/Util/XboxAuthNet/OAuth/MicrosoftUserPayload.cs",
"chars": 1702,
"preview": "using System.Text.Json.Serialization;\n\nnamespace XboxAuthNet.OAuth;\n\n// https://docs.microsoft.com/en-us/azure/active-di"
},
{
"path": "XAU/Util/XboxAuthNet/PlatformManager.cs",
"chars": 814,
"preview": "using System.IO;\nusing Microsoft.Web.WebView2.Core;\nusing XboxAuthNet.OAuth.CodeFlow;\n\nnamespace XboxAuthNet;\n\npublic cl"
},
{
"path": "XAU/Util/XboxAuthNet/Platforms/WinForm/StaTaskScheduler.cs",
"chars": 4770,
"preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n#if !NETSTANDARD\nusing "
},
{
"path": "XAU/Util/XboxAuthNet/Platforms/WinForm/UIThreadHelper.cs",
"chars": 3052,
"preview": "using System;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace XboxAuthNet.Platforms.WinForm\n{\n inter"
},
{
"path": "XAU/Util/XboxAuthNet/Platforms/WinForm/WebView2WebUI.cs",
"chars": 2546,
"preview": "using Microsoft.Web.WebView2.Core;\nusing XboxAuthNet.OAuth.CodeFlow;\n\nnamespace XboxAuthNet.Platforms.WinForm;\n\n#if NET"
},
{
"path": "XAU/Util/XboxAuthNet/Platforms/WinForm/Win32Window.cs",
"chars": 570,
"preview": "// https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/blob/main/src/client/Microsoft.Identity.Clien"
},
{
"path": "XAU/Util/XboxAuthNet/Platforms/WinForm/WinFormsPanelWithWebView2.cs",
"chars": 9544,
"preview": "// This code is from MSAL.NET\n// https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/blob/main/src/c"
},
{
"path": "XAU/Util/XboxAuthNet/Platforms/WinForm/WindowsDpiHelper.cs",
"chars": 2065,
"preview": "// https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/blob/main/src/client/Microsoft.Identity.Clien"
},
{
"path": "XAU/Util/XboxAuthNet/XboxAuthNet.csproj",
"chars": 3476,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFrameworkNetStandard>netstandard2.0</TargetFramew"
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/Crypto/ECDCertificatePopCryptoProvider.cs",
"chars": 1258,
"preview": "using System.Security.Cryptography;\n\nnamespace XboxAuthNet.XboxLive.Crypto\n{\n // https://github.com/AzureAD/microsoft"
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/Crypto/IPopCryptoProvider.cs",
"chars": 160,
"preview": "namespace XboxAuthNet.XboxLive.Crypto\n{\n public interface IPopCryptoProvider\n {\n object ProofKey { get; }\n "
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/Crypto/IXboxRequestSigner.cs",
"chars": 198,
"preview": "namespace XboxAuthNet.XboxLive.Crypto\n{\n public interface IXboxRequestSigner\n {\n object ProofKey { get; }\n"
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/Crypto/XboxRequestSigner.cs",
"chars": 2906,
"preview": "using System;\nusing System.Text;\n\nnamespace XboxAuthNet.XboxLive.Crypto\n{\n public class XboxRequestSigner : IXboxRequ"
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/Requests/AbstractXboxAuthRequest.cs",
"chars": 764,
"preview": "using System.Net.Http;\nusing XboxAuthNet.XboxLive.Responses;\n\nnamespace XboxAuthNet.XboxLive.Requests;\n\npublic abstract "
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/Requests/AbstractXboxSignedAuthRequest.cs",
"chars": 1463,
"preview": "using System.Net.Http;\nusing System.Text;\nusing System.Text.Json;\nusing XboxAuthNet.XboxLive.Crypto;\nusing XboxAuthNet.X"
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/Requests/CommonRequestHeaders.cs",
"chars": 474,
"preview": "using System.Net.Http;\n\nnamespace XboxAuthNet.XboxLive.Requests;\n\ninternal class CommonRequestHeaders\n{\n public stat"
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/Requests/XboxDeviceTokenRequest.cs",
"chars": 1998,
"preview": "using System;\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing XboxAuthNet.XboxLive.Crypto;\nusing XboxAuthNet."
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/Requests/XboxSignedUserTokenRequest.cs",
"chars": 1474,
"preview": "using System;\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing XboxAuthNet.XboxLive.Crypto;\nusing XboxAuthNet."
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/Requests/XboxSignedXstsRequest.cs",
"chars": 1666,
"preview": "using System.Threading.Tasks;\nusing System.Net.Http;\nusing XboxAuthNet.XboxLive.Crypto;\nusing XboxAuthNet.XboxLive.Respo"
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/Requests/XboxSisuAuthRequest.cs",
"chars": 1607,
"preview": "using System;\nusing System.Threading.Tasks;\nusing System.Net.Http;\nusing XboxAuthNet.XboxLive.Responses;\nusing XboxAuthN"
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/Requests/XboxTitleTokenRequest.cs",
"chars": 1625,
"preview": "using System;\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing XboxAuthNet.XboxLive.Crypto;\nusing XboxAuthNet."
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/Requests/XboxUserTokenRequest.cs",
"chars": 1616,
"preview": "using System;\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing XboxAuthNet.XboxLive.Responses;\n\nnamespace Xbox"
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/Requests/XboxXstsRequest.cs",
"chars": 2020,
"preview": "using System;\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing XboxAuthNet.XboxLive.Responses;\n\nnamespace Xbox"
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/Responses/XErrJsonConverter.cs",
"chars": 867,
"preview": "using System;\nusing System.Text.Json;\nusing System.Text.Json.Serialization;\n\nnamespace XboxAuthNet.XboxLive.Responses\n{"
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/Responses/XboxAuthResponse.cs",
"chars": 1051,
"preview": "using System;\nusing System.Text.Json.Serialization;\n\nnamespace XboxAuthNet.XboxLive.Responses\n{\n public class XboxAu"
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/Responses/XboxAuthResponseHandler.cs",
"chars": 1343,
"preview": "using System;\nusing System.Threading.Tasks;\nusing System.Net.Http;\nusing System.Text.Json;\n\nnamespace XboxAuthNet.XboxLi"
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/Responses/XboxAuthXuiClaims.cs",
"chars": 1330,
"preview": "using System.Text.Json.Serialization;\n\nnamespace XboxAuthNet.XboxLive.Responses\n{\n // https://github.com/OpenXbox/xb"
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/Responses/XboxAuthXuiClaimsJsonConverter.cs",
"chars": 2376,
"preview": "using System;\nusing System.Text.Json;\nusing System.Text.Json.Serialization;\n\nnamespace XboxAuthNet.XboxLive.Responses\n{"
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/Responses/XboxErrorResponse.cs",
"chars": 430,
"preview": "using System.Text.Json.Serialization;\n\nnamespace XboxAuthNet.XboxLive.Responses\n{\n public class XboxErrorResponse\n "
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/Responses/XboxSisuResponse.cs",
"chars": 808,
"preview": "using System.Text.Json.Serialization;\n\nnamespace XboxAuthNet.XboxLive.Responses\n{\n public class XboxSisuResponse\n "
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/XboxAuthClient.cs",
"chars": 1189,
"preview": "using System.Net.Http;\nusing XboxAuthNet.XboxLive.Requests;\nusing XboxAuthNet.XboxLive.Responses;\n\nnamespace XboxAuthNe"
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/XboxAuthConstants.cs",
"chars": 507,
"preview": "namespace XboxAuthNet.XboxLive\n{\n public class XboxAuthConstants\n {\n public const string XboxScope = \"servi"
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/XboxAuthException.cs",
"chars": 2320,
"preview": "using System;\nusing System.Linq;\nusing System.Net.Http.Headers;\nusing System.Text.Json;\nusing XboxAuthNet.XboxLive.Resp"
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/XboxAuthXuiClaimNames.cs",
"chars": 447,
"preview": "namespace XboxAuthNet.XboxLive\n{\n public static class XboxAuthXuiClaimNames\n {\n public const string Gamerta"
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/XboxDeviceTypes.cs",
"chars": 398,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace XboxAuthNet.XboxLive\n{\n public class X"
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/XboxGameTitles.cs",
"chars": 472,
"preview": "namespace XboxAuthNet.XboxLive\n{\n public static class XboxGameTitles\n {\n public const string MinecraftNint"
},
{
"path": "XAU/Util/XboxAuthNet/XboxLive/XboxSignedClient.cs",
"chars": 2094,
"preview": "using System.Net.Http;\nusing XboxAuthNet.XboxLive.Crypto;\nusing XboxAuthNet.XboxLive.Requests;\nusing XboxAuthNet.XboxLi"
},
{
"path": "XAU/ViewModels/Pages/AchievementsViewModel.cs",
"chars": 40168,
"preview": "using System.Collections.ObjectModel;\nusing System.Globalization;\nusing System.IO;\nusing System.Net.Http;\nusing System.T"
},
{
"path": "XAU/ViewModels/Pages/DebugViewModel.cs",
"chars": 6691,
"preview": "using Newtonsoft.Json.Linq;\nusing System.IO;\nusing System.Net.Http;\nusing System.Text;\nusing Wpf.Ui.Controls;\nusing Newt"
},
{
"path": "XAU/ViewModels/Pages/GamesViewModel.cs",
"chars": 14889,
"preview": "using System.Collections.ObjectModel;\nusing System.ComponentModel;\nusing Wpf.Ui.Common;\nusing Wpf.Ui.Contracts;\nusing Wp"
},
{
"path": "XAU/ViewModels/Pages/HomeViewModel.cs",
"chars": 51511,
"preview": "using System.ComponentModel;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Security.Cryptography;\nusing System"
},
{
"path": "XAU/ViewModels/Pages/InfoViewModel.cs",
"chars": 1293,
"preview": "using Wpf.Ui.Controls;\n\nnamespace XAU.ViewModels.Pages\n{\n public partial class InfoViewModel : ObservableObject, INav"
},
{
"path": "XAU/ViewModels/Pages/MiscViewModel.cs",
"chars": 18979,
"preview": "using HtmlAgilityPack;\nusing Microsoft.Data.Sqlite;\nusing Newtonsoft.Json.Linq;\nusing System.Data;\nusing System.Diagnost"
},
{
"path": "XAU/ViewModels/Pages/SettingsViewModel.cs",
"chars": 7606,
"preview": "using Newtonsoft.Json;\nusing System.Diagnostics;\nusing System.IO;\nusing Wpf.Ui.Controls;\nusing XAU.Services.HttpServer;\n"
},
{
"path": "XAU/ViewModels/Pages/StatsViewModel.cs",
"chars": 462,
"preview": "using Wpf.Ui.Controls;\n\nnamespace XAU.ViewModels.Pages\n{\n public partial class StatsViewModel : ObservableObject, INa"
},
{
"path": "XAU/ViewModels/Windows/MainWindowViewModel.cs",
"chars": 4550,
"preview": "using System.Collections.ObjectModel;\nusing Wpf.Ui.Common;\nusing Wpf.Ui.Contracts;\nusing Wpf.Ui.Controls;\n\nnamespace XAU"
},
{
"path": "XAU/Views/Pages/AchievementsPage.xaml",
"chars": 8398,
"preview": "<Page x:Class=\"XAU.Views.Pages.AchievementsPage\"\n xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation"
},
{
"path": "XAU/Views/Pages/AchievementsPage.xaml.cs",
"chars": 1345,
"preview": "using System.Windows.Controls;\nusing System.Windows.Controls.Primitives;\nusing System.Windows.Input;\nusing Wpf.Ui.Contro"
},
{
"path": "XAU/Views/Pages/DebugPage.xaml",
"chars": 1580,
"preview": "<Page\n x:Class=\"XAU.Views.Pages.DebugPage\"\n xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n "
},
{
"path": "XAU/Views/Pages/DebugPage.xaml.cs",
"chars": 385,
"preview": "using Wpf.Ui.Controls;\nusing XAU.ViewModels.Pages;\n\nnamespace XAU.Views.Pages\n{\n public partial class DebugPage : INa"
},
{
"path": "XAU/Views/Pages/GamesPage.xaml",
"chars": 8892,
"preview": "<Page x:Class=\"XAU.Views.Pages.GamesPage\"\n xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n "
},
{
"path": "XAU/Views/Pages/GamesPage.xaml.cs",
"chars": 2018,
"preview": "using System.Windows.Controls;\nusing System.Windows.Controls.Primitives;\nusing System.Windows.Input;\nusing System.Window"
},
{
"path": "XAU/Views/Pages/HomePage.xaml",
"chars": 6401,
"preview": "<Page\n x:Class=\"XAU.Views.Pages.HomePage\"\n xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n "
},
{
"path": "XAU/Views/Pages/HomePage.xaml.cs",
"chars": 380,
"preview": "using Wpf.Ui.Controls;\nusing XAU.ViewModels.Pages;\n\nnamespace XAU.Views.Pages\n{\n public partial class HomePage : INav"
},
{
"path": "XAU/Views/Pages/InfoPage.xaml",
"chars": 2389,
"preview": "<Page x:Class=\"XAU.Views.Pages.InfoPage\"\n xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n "
},
{
"path": "XAU/Views/Pages/InfoPage.xaml.cs",
"chars": 461,
"preview": "using Wpf.Ui.Controls;\nusing XAU.ViewModels.Pages;\n\nnamespace XAU.Views.Pages\n{\n /// <summary>\n /// Interaction lo"
},
{
"path": "XAU/Views/Pages/MiscPage.xaml",
"chars": 18167,
"preview": "<Page\n x:Class=\"XAU.Views.Pages.MiscPage\"\n xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n x"
},
{
"path": "XAU/Views/Pages/MiscPage.xaml.cs",
"chars": 1862,
"preview": "using System.Windows.Controls;\nusing System.Windows.Input;\nusing Wpf.Ui.Controls;\nusing XAU.ViewModels.Pages;\n\nnamespace"
},
{
"path": "XAU/Views/Pages/PlaceholderPage.xaml",
"chars": 980,
"preview": "<Page\n x:Class=\"XAU.Views.Pages.PlaceholderPage\"\n xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentatio"
},
{
"path": "XAU/Views/Pages/PlaceholderPage.xaml.cs",
"chars": 298,
"preview": "using System.Windows.Controls;\n\nnamespace XAU.Views.Pages\n{\n /// <summary>\n /// Interaction logic for PlaceholderP"
},
{
"path": "XAU/Views/Pages/SettingsPage.xaml",
"chars": 22291,
"preview": "<Page\n x:Class=\"XAU.Views.Pages.SettingsPage\"\n x:Name=\"SettingsPageRoot\"\n xmlns=\"http://schemas.microsoft.com/w"
},
{
"path": "XAU/Views/Pages/SettingsPage.xaml.cs",
"chars": 8112,
"preview": "using System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Threading;\nusing Wpf.Ui.Common;\nusing Wpf.Ui.C"
},
{
"path": "XAU/Views/Pages/StatsPage.xaml",
"chars": 878,
"preview": "<Page\n x:Class=\"XAU.Views.Pages.StatsPage\"\n xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n "
},
{
"path": "XAU/Views/Pages/StatsPage.xaml.cs",
"chars": 467,
"preview": "using Wpf.Ui.Controls;\nusing XAU.ViewModels.Pages;\n\nnamespace XAU.Views.Pages\n{\n /// <summary>\n /// Interaction lo"
},
{
"path": "XAU/Views/Windows/MainWindow.xaml",
"chars": 2788,
"preview": "<ui:FluentWindow\n x:Class=\"XAU.Views.Windows.MainWindow\"\n xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/pre"
},
{
"path": "XAU/Views/Windows/MainWindow.xaml.cs",
"chars": 1083,
"preview": "using Wpf.Ui.Contracts;\nusing Wpf.Ui.Controls;\nusing XAU.ViewModels.Windows;\n\nnamespace XAU.Views.Windows;\n\npublic parti"
},
{
"path": "XAU/XAU.csproj",
"chars": 1655,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <OutputType>WinExe</OutputType>\n <TargetFramework>net9.0-wi"
},
{
"path": "XAU/app.manifest",
"chars": 3429,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<assembly manifestVersion=\"1.0\" xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n <ass"
},
{
"path": "XAU.sln",
"chars": 1436,
"preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.7.3401"
}
]
About this extraction
This page contains the full source code of the Fumo-Unlockers/Xbox-Achievement-Unlocker GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 148 files (590.9 KB), approximately 132.4k tokens, and a symbol index with 567 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.